check_chain_extensions(): Add check that CA cert includes key usage extension
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>
Tue, 25 Aug 2020 14:58:36 +0000 (16:58 +0200)
committerDr. David von Oheimb <David.von.Oheimb@siemens.com>
Fri, 11 Sep 2020 05:42:22 +0000 (07:42 +0200)
Reviewed-by: Kurt Roeckx <kurt@roeckx.be>
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/12478)

crypto/x509/x509_txt.c
crypto/x509/x509_vfy.c
include/openssl/x509_vfy.h

index 85782a2f86588a6af13d8a12db1ad23aed297536..9cb6c8b73921ee5bddb188db3419bac04113b56b 100644 (file)
@@ -206,6 +206,8 @@ const char *X509_verify_cert_error_string(long n)
         return "Authority Key Identifier marked critical";
     case X509_V_ERR_SUBJECT_KEY_IDENTIFIER_CRITICAL:
         return "Subject Key Identifier marked critical";
+    case X509_V_ERR_CA_CERT_MISSING_KEY_USAGE:
+        return "CA cert does not include key usage extension";
 
     default:
         /* Printing an error number into a static buffer is not thread-safe */
index 966733dbb70117d7a6e8180a5b05b4f377baa422..e8ca44a9034bab3dcf796fcfd14e71905519a9d5 100644 (file)
@@ -536,10 +536,14 @@ static int check_chain_extensions(X509_STORE_CTX *ctx)
                     && (x->ex_flags & EXFLAG_BCONS) != 0
                     && (x->ex_flags & EXFLAG_BCONS_CRITICAL) == 0)
                 ctx->error = X509_V_ERR_CA_BCONS_NOT_CRITICAL;
-            /* Check keyCertSign according to RFC 5280 section 4.2.1.3 */
-            if ((x->ex_flags & EXFLAG_CA) == 0
-                    && (x->ex_kusage & KU_KEY_CERT_SIGN) != 0)
-                ctx->error = X509_V_ERR_KU_KEY_CERT_SIGN_INVALID_FOR_NON_CA;
+            /* Check key usages according to RFC 5280 section 4.2.1.3 */
+            if ((x->ex_flags & EXFLAG_CA) != 0) {
+                if ((x->ex_flags & EXFLAG_KUSAGE) == 0)
+                    ctx->error = X509_V_ERR_CA_CERT_MISSING_KEY_USAGE;
+            } else {
+                if ((x->ex_kusage & KU_KEY_CERT_SIGN) != 0)
+                    ctx->error = X509_V_ERR_KU_KEY_CERT_SIGN_INVALID_FOR_NON_CA;
+            }
             /* Check issuer is non-empty acc. to RFC 5280 section 4.1.2.4 */
             if (X509_NAME_entry_count(X509_get_issuer_name(x)) == 0)
                 ctx->error = X509_V_ERR_ISSUER_NAME_EMPTY;
index 53dff234ce1460bcc1c9b9b2d8e73e1bb0a59b36..50ae14f240e429f29aa089df769ae7e7b2f74073 100644 (file)
@@ -232,6 +232,7 @@ X509_LOOKUP_ctrl_with_libctx((x), X509_L_ADD_STORE, (name), 0, NULL,           \
 # define X509_V_ERR_CA_BCONS_NOT_CRITICAL                89
 # define X509_V_ERR_AUTHORITY_KEY_IDENTIFIER_CRITICAL    90
 # define X509_V_ERR_SUBJECT_KEY_IDENTIFIER_CRITICAL      91
+# define X509_V_ERR_CA_CERT_MISSING_KEY_USAGE            92
 
 /* Certificate verify flags */
 # ifndef OPENSSL_NO_DEPRECATED_1_1_0