summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2020-12-10 15:23:41 +0100
committerDr. David von Oheimb <dev@ddvo.net>2021-01-13 11:53:15 +0100
commitec2bfb7d23b4790a5fbe3b5d73a3418966d7e8ad (patch)
tree6933e942381aa061e6a61b4e5a375098294c88fc /crypto
parentf2a0458731f15fd4d45f5574a221177f4591b1d8 (diff)
apps/{req,x509,ca}.c Make sure certs have SKID and AKID X.509 extensions by default
Fixes #13603 Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> (Merged from https://github.com/openssl/openssl/pull/13658)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/x509/v3_akey.c13
-rw-r--r--crypto/x509/v3_skey.c13
2 files changed, 16 insertions, 10 deletions
diff --git a/crypto/x509/v3_akey.c b/crypto/x509/v3_akey.c
index 96e415aeb1..2e90d495c5 100644
--- a/crypto/x509/v3_akey.c
+++ b/crypto/x509/v3_akey.c
@@ -78,7 +78,7 @@ static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
STACK_OF(CONF_VALUE) *values)
{
char keyid = 0, issuer = 0;
- int i;
+ int i, n = sk_CONF_VALUE_num(values);
CONF_VALUE *cnf;
ASN1_OCTET_STRING *ikeyid = NULL;
X509_NAME *isname = NULL;
@@ -92,7 +92,11 @@ static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
if (akeyid == NULL)
goto err;
- for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
+ if (n == 1 && strcmp(sk_CONF_VALUE_value(values, 0)->name, "none") == 0) {
+ return akeyid;
+ }
+
+ for (i = 0; i < n; i++) {
cnf = sk_CONF_VALUE_value(values, i);
if (strcmp(cnf->name, "keyid") == 0) {
keyid = 1;
@@ -115,14 +119,15 @@ static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
ERR_raise(ERR_LIB_X509V3, X509V3_R_NO_ISSUER_CERTIFICATE);
goto err;
}
-
cert = ctx->issuer_cert;
if (keyid) {
i = X509_get_ext_by_NID(cert, NID_subject_key_identifier, -1);
if ((i >= 0) && (ext = X509_get_ext(cert, i)))
ikeyid = X509V3_EXT_d2i(ext);
- if ((keyid == 2 || issuer == 0) && ikeyid == NULL) {
+ if ((keyid == 2 || issuer == 0)
+ && (ikeyid == NULL
+ || ASN1_STRING_length(ikeyid) <= 2) /* indicating "none" */ ) {
ERR_raise(ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID);
goto err;
}
diff --git a/crypto/x509/v3_skey.c b/crypto/x509/v3_skey.c
index b4b1616688..6122596081 100644
--- a/crypto/x509/v3_skey.c
+++ b/crypto/x509/v3_skey.c
@@ -62,7 +62,10 @@ static ASN1_OCTET_STRING *s2i_skey_id(X509V3_EXT_METHOD *method,
unsigned char pkey_dig[EVP_MAX_MD_SIZE];
unsigned int diglen;
- if (strcmp(str, "hash"))
+ if (strcmp(str, "none") == 0)
+ return ASN1_OCTET_STRING_new(); /* dummy */
+
+ if (strcmp(str, "hash") != 0)
return s2i_ASN1_OCTET_STRING(method, ctx, str);
if ((oct = ASN1_OCTET_STRING_new()) == NULL) {
@@ -78,11 +81,9 @@ static ASN1_OCTET_STRING *s2i_skey_id(X509V3_EXT_METHOD *method,
goto err;
}
- if (ctx->subject_req)
- pubkey = ctx->subject_req->req_info.pubkey;
- else
- pubkey = ctx->subject_cert->cert_info.key;
-
+ pubkey = ctx->subject_req != NULL ?
+ ctx->subject_req->req_info.pubkey :
+ ctx->subject_cert->cert_info.key;
if (pubkey == NULL) {
ERR_raise(ERR_LIB_X509V3, X509V3_R_NO_PUBLIC_KEY);
goto err;