saprasad / rpms / openssl

Forked from rpms/openssl 3 years ago
Clone
ef93cf9
diff -up openssl-1.1.1g/crypto/x509/x509_vfy.c.seclevel openssl-1.1.1g/crypto/x509/x509_vfy.c
ef93cf9
--- openssl-1.1.1g/crypto/x509/x509_vfy.c.seclevel	2020-04-21 14:22:39.000000000 +0200
ef93cf9
+++ openssl-1.1.1g/crypto/x509/x509_vfy.c	2020-06-05 17:16:54.835536823 +0200
ef93cf9
@@ -3225,6 +3225,7 @@ static int build_chain(X509_STORE_CTX *c
1a7b91b
 }
1a7b91b
 
1a7b91b
 static const int minbits_table[] = { 80, 112, 128, 192, 256 };
1a7b91b
+static const int minbits_digest_table[] = { 80, 80, 128, 192, 256 };
1a7b91b
 static const int NUM_AUTH_LEVELS = OSSL_NELEM(minbits_table);
1a7b91b
 
1a7b91b
 /*
ef93cf9
@@ -3276,6 +3277,11 @@ static int check_sig_level(X509_STORE_CT
1a7b91b
 
1a7b91b
     if (!X509_get_signature_info(cert, NULL, NULL, &secbits, NULL))
1a7b91b
         return 0;
1a7b91b
-
1a7b91b
-    return secbits >= minbits_table[level - 1];
ef93cf9
+    /*
ef93cf9
+     * Allow SHA1 in SECLEVEL 2 in non-FIPS mode or when the magic
ef93cf9
+     * disable SHA1 flag is not set.
ef93cf9
+     */
ef93cf9
+    if ((ctx->param->flags & 0x40000000) || FIPS_mode())
1a7b91b
+        return secbits >= minbits_table[level - 1];
1a7b91b
+    return secbits >= minbits_digest_table[level - 1];
1a7b91b
 }
ef93cf9
diff -up openssl-1.1.1g/doc/man3/SSL_CTX_set_security_level.pod.seclevel openssl-1.1.1g/doc/man3/SSL_CTX_set_security_level.pod
ef93cf9
--- openssl-1.1.1g/doc/man3/SSL_CTX_set_security_level.pod.seclevel	2020-04-21 14:22:39.000000000 +0200
ef93cf9
+++ openssl-1.1.1g/doc/man3/SSL_CTX_set_security_level.pod	2020-06-04 15:48:01.608178833 +0200
1a7b91b
@@ -81,8 +81,10 @@ using MD5 for the MAC is also prohibited
1a7b91b
 
1a7b91b
 =item B<Level 2>
1a7b91b
 
1a7b91b
-Security level set to 112 bits of security. As a result RSA, DSA and DH keys
1a7b91b
-shorter than 2048 bits and ECC keys shorter than 224 bits are prohibited.
1a7b91b
+Security level set to 112 bits of security with the exception of SHA1 allowed
1a7b91b
+for signatures.
1a7b91b
+As a result RSA, DSA and DH keys shorter than 2048 bits and ECC keys
1a7b91b
+shorter than 224 bits are prohibited.
1a7b91b
 In addition to the level 1 exclusions any cipher suite using RC4 is also
1a7b91b
 prohibited. SSL version 3 is also not allowed. Compression is disabled.
1a7b91b
 
ef93cf9
diff -up openssl-1.1.1g/ssl/ssl_cert.c.seclevel openssl-1.1.1g/ssl/ssl_cert.c
ef93cf9
--- openssl-1.1.1g/ssl/ssl_cert.c.seclevel	2020-04-21 14:22:39.000000000 +0200
ef93cf9
+++ openssl-1.1.1g/ssl/ssl_cert.c	2020-06-05 17:10:11.842198401 +0200
ef93cf9
@@ -27,6 +27,7 @@
ef93cf9
 static int ssl_security_default_callback(const SSL *s, const SSL_CTX *ctx,
ef93cf9
                                          int op, int bits, int nid, void *other,
ef93cf9
                                          void *ex);
ef93cf9
+static unsigned long sha1_disable(const SSL *s, const SSL_CTX *ctx);
ef93cf9
 
ef93cf9
 static CRYPTO_ONCE ssl_x509_store_ctx_once = CRYPTO_ONCE_STATIC_INIT;
ef93cf9
 static volatile int ssl_x509_store_ctx_idx = -1;
ef93cf9
@@ -396,7 +397,7 @@ int ssl_verify_cert_chain(SSL *s, STACK_
ef93cf9
     X509_VERIFY_PARAM_set_auth_level(param, SSL_get_security_level(s));
ef93cf9
 
ef93cf9
     /* Set suite B flags if needed */
ef93cf9
-    X509_STORE_CTX_set_flags(ctx, tls1_suiteb(s));
ef93cf9
+    X509_STORE_CTX_set_flags(ctx, tls1_suiteb(s) | sha1_disable(s, NULL));
ef93cf9
     if (!X509_STORE_CTX_set_ex_data
ef93cf9
         (ctx, SSL_get_ex_data_X509_STORE_CTX_idx(), s)) {
ef93cf9
         goto end;
ef93cf9
@@ -953,12 +954,33 @@ static int ssl_security_default_callback
1a7b91b
             return 0;
1a7b91b
         break;
1a7b91b
     default:
1a7b91b
+        /* allow SHA1 in SECLEVEL 2 in non FIPS mode */
ef93cf9
+        if (nid == NID_sha1 && minbits == 112 && !sha1_disable(s, ctx))
1a7b91b
+            break;
1a7b91b
         if (bits < minbits)
1a7b91b
             return 0;
1a7b91b
     }
ef93cf9
     return 1;
ef93cf9
 }
ef93cf9
 
ef93cf9
+static unsigned long sha1_disable(const SSL *s, const SSL_CTX *ctx)
ef93cf9
+{
ef93cf9
+    unsigned long ret = 0x40000000; /* a magical internal value used by X509_VERIFY_PARAM */
ef93cf9
+    const CERT *c;
ef93cf9
+
ef93cf9
+    if (FIPS_mode())
ef93cf9
+        return ret;
ef93cf9
+
ef93cf9
+    if (ctx != NULL) {
ef93cf9
+       c = ctx->cert;
ef93cf9
+    } else {
ef93cf9
+       c = s->cert;
ef93cf9
+    }
ef93cf9
+    if (tls1_cert_sigalgs_have_sha1(c))
ef93cf9
+        return 0;
ef93cf9
+    return ret;
ef93cf9
+}
ef93cf9
+
ef93cf9
 int ssl_security(const SSL *s, int op, int bits, int nid, void *other)
ef93cf9
 {
ef93cf9
     return s->cert->sec_cb(s, NULL, op, bits, nid, other, s->cert->sec_ex);
ef93cf9
diff -up openssl-1.1.1g/ssl/ssl_local.h.seclevel openssl-1.1.1g/ssl/ssl_local.h
ef93cf9
--- openssl-1.1.1g/ssl/ssl_local.h.seclevel	2020-06-04 15:48:01.602178783 +0200
ef93cf9
+++ openssl-1.1.1g/ssl/ssl_local.h	2020-06-05 17:02:22.666313410 +0200
ef93cf9
@@ -2576,6 +2576,7 @@ __owur int tls1_save_sigalgs(SSL *s, PAC
ef93cf9
 __owur int tls1_process_sigalgs(SSL *s);
ef93cf9
 __owur int tls1_set_peer_legacy_sigalg(SSL *s, const EVP_PKEY *pkey);
ef93cf9
 __owur int tls1_lookup_md(const SIGALG_LOOKUP *lu, const EVP_MD **pmd);
ef93cf9
+int tls1_cert_sigalgs_have_sha1(const CERT *c);
ef93cf9
 __owur size_t tls12_get_psigalgs(SSL *s, int sent, const uint16_t **psigs);
ef93cf9
 #  ifndef OPENSSL_NO_EC
ef93cf9
 __owur int tls_check_sigalg_curve(const SSL *s, int curve);
ef93cf9
diff -up openssl-1.1.1g/ssl/t1_lib.c.seclevel openssl-1.1.1g/ssl/t1_lib.c
ef93cf9
--- openssl-1.1.1g/ssl/t1_lib.c.seclevel	2020-06-04 15:48:01.654179221 +0200
ef93cf9
+++ openssl-1.1.1g/ssl/t1_lib.c	2020-06-05 17:02:40.268459157 +0200
ef93cf9
@@ -2145,6 +2145,36 @@ int tls1_set_sigalgs(CERT *c, const int
ef93cf9
     return 0;
ef93cf9
 }
ef93cf9
 
ef93cf9
+static int tls1_sigalgs_have_sha1(const uint16_t *sigalgs, size_t sigalgslen)
ef93cf9
+{
ef93cf9
+    size_t i;
ef93cf9
+
ef93cf9
+    for (i = 0; i < sigalgslen; i++, sigalgs++) {
ef93cf9
+        const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(*sigalgs);
ef93cf9
+
ef93cf9
+        if (lu == NULL)
ef93cf9
+            continue;
ef93cf9
+        if (lu->hash == NID_sha1)
ef93cf9
+            return 1;
ef93cf9
+    }
ef93cf9
+    return 0;
ef93cf9
+}
ef93cf9
+
ef93cf9
+
ef93cf9
+int tls1_cert_sigalgs_have_sha1(const CERT *c)
ef93cf9
+{
ef93cf9
+    if (c->client_sigalgs != NULL) {
ef93cf9
+        if (tls1_sigalgs_have_sha1(c->client_sigalgs, c->client_sigalgslen))
ef93cf9
+            return 1;
ef93cf9
+    }
ef93cf9
+    if (c->conf_sigalgs != NULL) {
ef93cf9
+        if (tls1_sigalgs_have_sha1(c->conf_sigalgs, c->conf_sigalgslen))
ef93cf9
+            return 1;
ef93cf9
+        return 0;
ef93cf9
+    }
ef93cf9
+    return 1;
ef93cf9
+}
ef93cf9
+
ef93cf9
 static int tls1_check_sig_alg(SSL *s, X509 *x, int default_nid)
ef93cf9
 {
ef93cf9
     int sig_nid, use_pc_sigalgs = 0;
ef93cf9
diff -up openssl-1.1.1g/test/recipes/25-test_verify.t.seclevel openssl-1.1.1g/test/recipes/25-test_verify.t
ef93cf9
--- openssl-1.1.1g/test/recipes/25-test_verify.t.seclevel	2020-04-21 14:22:39.000000000 +0200
ef93cf9
+++ openssl-1.1.1g/test/recipes/25-test_verify.t	2020-06-04 15:48:01.608178833 +0200
ef93cf9
@@ -346,8 +346,8 @@ ok(verify("ee-pss-sha1-cert", "sslserver
143a3da
 ok(verify("ee-pss-sha256-cert", "sslserver", ["root-cert"], ["ca-cert"], ),
143a3da
     "CA with PSS signature using SHA256");
143a3da
 
143a3da
-ok(!verify("ee-pss-sha1-cert", "sslserver", ["root-cert"], ["ca-cert"], "-auth_level", "2"),
143a3da
-    "Reject PSS signature using SHA1 and auth level 2");
143a3da
+ok(!verify("ee-pss-sha1-cert", "sslserver", ["root-cert"], ["ca-cert"], "-auth_level", "3"),
143a3da
+    "Reject PSS signature using SHA1 and auth level 3");
143a3da
 
143a3da
 ok(verify("ee-pss-sha256-cert", "sslserver", ["root-cert"], ["ca-cert"], "-auth_level", "2"),
143a3da
     "PSS signature using SHA256 and auth level 2");