Blame SPECS/openssl-1.1.1-fips-curves.patch

Packit Service 084de1
diff -up openssl-1.1.1g/crypto/ec/ec_curve.c.fips-curves openssl-1.1.1g/crypto/ec/ec_curve.c
Packit Service 084de1
--- openssl-1.1.1g/crypto/ec/ec_curve.c.fips-curves	2020-05-18 12:59:54.839643980 +0200
Packit Service 084de1
+++ openssl-1.1.1g/crypto/ec/ec_curve.c	2020-05-18 12:59:54.852644093 +0200
Packit Service 084de1
@@ -13,6 +13,7 @@
Packit Service 084de1
 #include <openssl/err.h>
Packit Service 084de1
 #include <openssl/obj_mac.h>
Packit Service 084de1
 #include <openssl/opensslconf.h>
Packit Service 084de1
+#include <openssl/crypto.h>
Packit Service 084de1
 #include "internal/nelem.h"
Packit Service 084de1
 
Packit Service 084de1
 typedef struct {
Packit Service 084de1
@@ -237,6 +238,7 @@ static const struct {
Packit Service 084de1
 
Packit Service 084de1
 typedef struct _ec_list_element_st {
Packit Service 084de1
     int nid;
Packit Service 084de1
+    int fips_allowed;
Packit Service 084de1
     const EC_CURVE_DATA *data;
Packit Service 084de1
     const EC_METHOD *(*meth) (void);
Packit Service 084de1
     const char *comment;
Packit Service 084de1
@@ -246,23 +248,23 @@ static const ec_list_element curve_list[
Packit Service 084de1
     /* prime field curves */
Packit Service 084de1
     /* secg curves */
Packit Service 084de1
 #ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
Packit Service 084de1
-    {NID_secp224r1, &_EC_NIST_PRIME_224.h, EC_GFp_nistp224_method,
Packit Service 084de1
+    {NID_secp224r1, 1, &_EC_NIST_PRIME_224.h, EC_GFp_nistp224_method,
Packit Service 084de1
      "NIST/SECG curve over a 224 bit prime field"},
Packit Service 084de1
 #else
Packit Service 084de1
-    {NID_secp224r1, &_EC_NIST_PRIME_224.h, 0,
Packit Service 084de1
+    {NID_secp224r1, 1, &_EC_NIST_PRIME_224.h, 0,
Packit Service 084de1
      "NIST/SECG curve over a 224 bit prime field"},
Packit Service 084de1
 #endif
Packit Service 084de1
-    {NID_secp256k1, &_EC_SECG_PRIME_256K1.h, 0,
Packit Service 084de1
+    {NID_secp256k1, 0, &_EC_SECG_PRIME_256K1.h, 0,
Packit Service 084de1
      "SECG curve over a 256 bit prime field"},
Packit Service 084de1
     /* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */
Packit Service 084de1
-    {NID_secp384r1, &_EC_NIST_PRIME_384.h,
Packit Service 084de1
+    {NID_secp384r1, 1, &_EC_NIST_PRIME_384.h,
Packit Service 084de1
 # if defined(S390X_EC_ASM)
Packit Service 084de1
      EC_GFp_s390x_nistp384_method,
Packit Service 084de1
 # else
Packit Service 084de1
      0,
Packit Service 084de1
 # endif
Packit Service 084de1
      "NIST/SECG curve over a 384 bit prime field"},
Packit Service 084de1
-    {NID_secp521r1, &_EC_NIST_PRIME_521.h,
Packit Service 084de1
+    {NID_secp521r1, 1, &_EC_NIST_PRIME_521.h,
Packit Service 084de1
 # if defined(S390X_EC_ASM)
Packit Service 084de1
      EC_GFp_s390x_nistp521_method,
Packit Service 084de1
 # elif !defined(OPENSSL_NO_EC_NISTP_64_GCC_128)
Packit Service 084de1
@@ -272,7 +274,7 @@ static const ec_list_element curve_list[
Packit Service 084de1
 # endif
Packit Service 084de1
      "NIST/SECG curve over a 521 bit prime field"},
Packit Service 084de1
     /* X9.62 curves */
Packit Service 084de1
-    {NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h,
Packit Service 084de1
+    {NID_X9_62_prime256v1, 1, &_EC_X9_62_PRIME_256V1.h,
Packit Service 084de1
 #if defined(ECP_NISTZ256_ASM)
Packit Service 084de1
      EC_GFp_nistz256_method,
Packit Service 084de1
 # elif defined(S390X_EC_ASM)
Packit Service 084de1
@@ -404,6 +406,10 @@ EC_GROUP *EC_GROUP_new_by_curve_name(int
Packit Service 084de1
 
Packit Service 084de1
     for (i = 0; i < curve_list_length; i++)
Packit Service 084de1
         if (curve_list[i].nid == nid) {
Packit Service 084de1
+            if (!curve_list[i].fips_allowed && FIPS_mode()) {
Packit Service 084de1
+                ECerr(EC_F_EC_GROUP_NEW_BY_CURVE_NAME, EC_R_NOT_A_NIST_PRIME);
Packit Service 084de1
+                return NULL;
Packit Service 084de1
+            }
Packit Service 084de1
             ret = ec_group_new_from_data(curve_list[i]);
Packit Service 084de1
             break;
Packit Service 084de1
         }
Packit Service 084de1
@@ -418,19 +424,31 @@ EC_GROUP *EC_GROUP_new_by_curve_name(int
Packit Service 084de1
 
Packit Service 084de1
 size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems)
Packit Service 084de1
 {
Packit Service 084de1
-    size_t i, min;
Packit Service 084de1
+    size_t i, j, num;
Packit Service 084de1
+    int fips_mode = FIPS_mode();
Packit Service 084de1
 
Packit Service 084de1
-    if (r == NULL || nitems == 0)
Packit Service 084de1
-        return curve_list_length;
Packit Service 084de1
+    num = curve_list_length;
Packit Service 084de1
+    if (fips_mode)
Packit Service 084de1
+        for (i = 0; i < curve_list_length; i++) {
Packit Service 084de1
+            if (!curve_list[i].fips_allowed)
Packit Service 084de1
+                --num;
Packit Service 084de1
+        }
Packit Service 084de1
 
Packit Service 084de1
-    min = nitems < curve_list_length ? nitems : curve_list_length;
Packit Service 084de1
+    if (r == NULL || nitems == 0) {
Packit Service 084de1
+        return num;
Packit Service 084de1
+    }
Packit Service 084de1
 
Packit Service 084de1
-    for (i = 0; i < min; i++) {
Packit Service 084de1
-        r[i].nid = curve_list[i].nid;
Packit Service 084de1
-        r[i].comment = curve_list[i].comment;
Packit Service 084de1
+    for (i = 0, j = 0; i < curve_list_length; i++) {
Packit Service 084de1
+        if (j >= nitems)
Packit Service 084de1
+            break;
Packit Service 084de1
+        if (!fips_mode || curve_list[i].fips_allowed) {
Packit Service 084de1
+            r[j].nid = curve_list[i].nid;
Packit Service 084de1
+            r[j].comment = curve_list[i].comment;
Packit Service 084de1
+            ++j;
Packit Service 084de1
+        }
Packit Service 084de1
     }
Packit Service 084de1
 
Packit Service 084de1
-    return curve_list_length;
Packit Service 084de1
+    return num;
Packit Service 084de1
 }
Packit Service 084de1
 
Packit Service 084de1
 /* Functions to translate between common NIST curve names and NIDs */
Packit Service 084de1
diff -up openssl-1.1.1g/ssl/t1_lib.c.fips-curves openssl-1.1.1g/ssl/t1_lib.c
Packit Service 084de1
--- openssl-1.1.1g/ssl/t1_lib.c.fips-curves	2020-05-18 12:59:54.797643616 +0200
Packit Service 084de1
+++ openssl-1.1.1g/ssl/t1_lib.c	2020-05-18 13:03:54.748725463 +0200
Packit Service 084de1
@@ -678,6 +678,36 @@ static const uint16_t tls12_sigalgs[] =
Packit Service 084de1
 #endif
Packit Service 084de1
 };
Packit Service 084de1
 
Packit Service 084de1
+static const uint16_t tls12_fips_sigalgs[] = {
Packit Service 084de1
+#ifndef OPENSSL_NO_EC
Packit Service 084de1
+    TLSEXT_SIGALG_ecdsa_secp256r1_sha256,
Packit Service 084de1
+    TLSEXT_SIGALG_ecdsa_secp384r1_sha384,
Packit Service 084de1
+    TLSEXT_SIGALG_ecdsa_secp521r1_sha512,
Packit Service 084de1
+#endif
Packit Service 084de1
+
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pss_pss_sha256,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pss_pss_sha384,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pss_pss_sha512,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pss_rsae_sha256,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pss_rsae_sha384,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pss_rsae_sha512,
Packit Service 084de1
+
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pkcs1_sha256,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pkcs1_sha384,
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pkcs1_sha512,
Packit Service 084de1
+
Packit Service 084de1
+#ifndef OPENSSL_NO_EC
Packit Service 084de1
+    TLSEXT_SIGALG_ecdsa_sha224,
Packit Service 084de1
+#endif
Packit Service 084de1
+    TLSEXT_SIGALG_rsa_pkcs1_sha224,
Packit Service 084de1
+#ifndef OPENSSL_NO_DSA
Packit Service 084de1
+    TLSEXT_SIGALG_dsa_sha224,
Packit Service 084de1
+    TLSEXT_SIGALG_dsa_sha256,
Packit Service 084de1
+    TLSEXT_SIGALG_dsa_sha384,
Packit Service 084de1
+    TLSEXT_SIGALG_dsa_sha512,
Packit Service 084de1
+#endif
Packit Service 084de1
+};
Packit Service 084de1
+
Packit Service 084de1
 #ifndef OPENSSL_NO_EC
Packit Service 084de1
 static const uint16_t suiteb_sigalgs[] = {
Packit Service 084de1
     TLSEXT_SIGALG_ecdsa_secp256r1_sha256,
Packit Service 084de1
@@ -894,6 +924,8 @@ static const SIGALG_LOOKUP *tls1_get_leg
Packit Service 084de1
     }
Packit Service 084de1
     if (idx < 0 || idx >= (int)OSSL_NELEM(tls_default_sigalg))
Packit Service 084de1
         return NULL;
Packit Service 084de1
+    if (FIPS_mode()) /* We do not allow legacy SHA1 signatures in FIPS mode */
Packit Service 084de1
+        return NULL;
Packit Service 084de1
     if (SSL_USE_SIGALGS(s) || idx != SSL_PKEY_RSA) {
Packit Service 084de1
         const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(tls_default_sigalg[idx]);
Packit Service 084de1
 
Packit Service 084de1
@@ -954,6 +986,9 @@ size_t tls12_get_psigalgs(SSL *s, int se
Packit Service 084de1
     } else if (s->cert->conf_sigalgs) {
Packit Service 084de1
         *psigs = s->cert->conf_sigalgs;
Packit Service 084de1
         return s->cert->conf_sigalgslen;
Packit Service 084de1
+    } else if (FIPS_mode()) {
Packit Service 084de1
+        *psigs = tls12_fips_sigalgs;
Packit Service 084de1
+        return OSSL_NELEM(tls12_fips_sigalgs);
Packit Service 084de1
     } else {
Packit Service 084de1
         *psigs = tls12_sigalgs;
Packit Service 084de1
         return OSSL_NELEM(tls12_sigalgs);
Packit Service 084de1
@@ -973,6 +1008,9 @@ int tls_check_sigalg_curve(const SSL *s,
Packit Service 084de1
     if (s->cert->conf_sigalgs) {
Packit Service 084de1
         sigs = s->cert->conf_sigalgs;
Packit Service 084de1
         siglen = s->cert->conf_sigalgslen;
Packit Service 084de1
+    } else if (FIPS_mode()) {
Packit Service 084de1
+        sigs = tls12_fips_sigalgs;
Packit Service 084de1
+        siglen = OSSL_NELEM(tls12_fips_sigalgs);
Packit Service 084de1
     } else {
Packit Service 084de1
         sigs = tls12_sigalgs;
Packit Service 084de1
         siglen = OSSL_NELEM(tls12_sigalgs);
Packit Service 084de1
@@ -1617,6 +1655,8 @@ static int tls12_sigalg_allowed(const SS
Packit Service 084de1
     if (lu->sig == NID_id_GostR3410_2012_256
Packit Service 084de1
             || lu->sig == NID_id_GostR3410_2012_512
Packit Service 084de1
             || lu->sig == NID_id_GostR3410_2001) {
Packit Service 084de1
+        if (FIPS_mode())
Packit Service 084de1
+            return 0;
Packit Service 084de1
         /* We never allow GOST sig algs on the server with TLSv1.3 */
Packit Service 084de1
         if (s->server && SSL_IS_TLS13(s))
Packit Service 084de1
             return 0;
Packit Service 084de1
@@ -2842,6 +2882,13 @@ int tls_choose_sigalg(SSL *s, int fatale
Packit Service 084de1
                 const uint16_t *sent_sigs;
Packit Service 084de1
                 size_t sent_sigslen;
Packit Service 084de1
 
Packit Service 084de1
+                if (fatalerrs && FIPS_mode()) {
Packit Service 084de1
+                    /* There are no suitable legacy algorithms in FIPS mode */
Packit Service 084de1
+                    SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
Packit Service 084de1
+                             SSL_F_TLS_CHOOSE_SIGALG,
Packit Service 084de1
+                             SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM);
Packit Service 084de1
+                    return 0;
Packit Service 084de1
+                }
Packit Service 084de1
                 if ((lu = tls1_get_legacy_sigalg(s, -1)) == NULL) {
Packit Service 084de1
                     if (!fatalerrs)
Packit Service 084de1
                         return 1;