Blame SOURCES/nss-3.67-fix-ssl-alerts.patch

b31f4f
diff -up ./lib/ssl/ssl3con.c.alert-fix ./lib/ssl/ssl3con.c
b31f4f
--- ./lib/ssl/ssl3con.c.alert-fix	2021-06-10 05:33:12.000000000 -0700
b31f4f
+++ ./lib/ssl/ssl3con.c	2021-07-06 17:08:25.894018521 -0700
b31f4f
@@ -4319,7 +4319,11 @@ ssl_SignatureSchemeValid(SSLSignatureSch
b31f4f
     if (!ssl_IsSupportedSignatureScheme(scheme)) {
b31f4f
         return PR_FALSE;
b31f4f
     }
b31f4f
-    if (!ssl_SignatureSchemeMatchesSpkiOid(scheme, spkiOid)) {
b31f4f
+    /* if we are purposefully passed SEC_OID_UNKOWN, it means
b31f4f
+     * we not checking the scheme against a potential key, so skip
b31f4f
+     * the call */
b31f4f
+    if ((spkiOid != SEC_OID_UNKNOWN) &&
b31f4f
+        !ssl_SignatureSchemeMatchesSpkiOid(scheme, spkiOid)) {
b31f4f
         return PR_FALSE;
b31f4f
     }
b31f4f
     if (isTls13) {
b31f4f
@@ -4517,7 +4521,8 @@ ssl_CheckSignatureSchemeConsistency(sslS
b31f4f
     }
b31f4f
 
b31f4f
     /* Verify that the signature scheme matches the signing key. */
b31f4f
-    if (!ssl_SignatureSchemeValid(scheme, spkiOid, isTLS13)) {
b31f4f
+    if ((spkiOid == SEC_OID_UNKNOWN) || 
b31f4f
+         !ssl_SignatureSchemeValid(scheme, spkiOid, isTLS13)) {
b31f4f
         PORT_SetError(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM);
b31f4f
         return SECFailure;
b31f4f
     }
b31f4f
@@ -4533,6 +4538,7 @@ ssl_CheckSignatureSchemeConsistency(sslS
b31f4f
 PRBool
b31f4f
 ssl_IsSupportedSignatureScheme(SSLSignatureScheme scheme)
b31f4f
 {
b31f4f
+    PRBool isSupported = PR_FALSE;
b31f4f
     switch (scheme) {
b31f4f
         case ssl_sig_rsa_pkcs1_sha1:
b31f4f
         case ssl_sig_rsa_pkcs1_sha256:
b31f4f
@@ -4552,7 +4558,8 @@ ssl_IsSupportedSignatureScheme(SSLSignat
b31f4f
         case ssl_sig_dsa_sha384:
b31f4f
         case ssl_sig_dsa_sha512:
b31f4f
         case ssl_sig_ecdsa_sha1:
b31f4f
-            return PR_TRUE;
b31f4f
+            isSupported = PR_TRUE;
b31f4f
+            break;
b31f4f
 
b31f4f
         case ssl_sig_rsa_pkcs1_sha1md5:
b31f4f
         case ssl_sig_none:
b31f4f
@@ -4560,7 +4567,19 @@ ssl_IsSupportedSignatureScheme(SSLSignat
b31f4f
         case ssl_sig_ed448:
b31f4f
             return PR_FALSE;
b31f4f
     }
b31f4f
-    return PR_FALSE;
b31f4f
+    if (isSupported) {
b31f4f
+        SECOidTag hashOID = ssl3_HashTypeToOID(ssl_SignatureSchemeToHashType(scheme));
b31f4f
+        PRUint32 policy;
b31f4f
+        const PRUint32 sigSchemePolicy=
b31f4f
+                NSS_USE_ALG_IN_SSL_KX|NSS_USE_ALG_IN_SIGNATURE;
b31f4f
+        /* check hash policy */
b31f4f
+        if ((NSS_GetAlgorithmPolicy(hashOID, &policy) == SECSuccess) &&
b31f4f
+            ((policy & sigSchemePolicy) != sigSchemePolicy)) {
b31f4f
+            return PR_FALSE;
b31f4f
+        }
b31f4f
+        /* check algorithm policy */
b31f4f
+    }
b31f4f
+    return isSupported;
b31f4f
 }
b31f4f
 
b31f4f
 PRBool
b31f4f
@@ -6533,6 +6552,9 @@ ssl_PickSignatureScheme(sslSocket *ss,
b31f4f
     }
b31f4f
 
b31f4f
     spkiOid = SECOID_GetAlgorithmTag(&cert->subjectPublicKeyInfo.algorithm);
b31f4f
+    if (spkiOid == SEC_OID_UNKNOWN) {
b31f4f
+        goto loser;
b31f4f
+    }
b31f4f
 
b31f4f
     /* Now we have to search based on the key type. Go through our preferred
b31f4f
      * schemes in order and find the first that can be used. */
b31f4f
@@ -6547,6 +6569,7 @@ ssl_PickSignatureScheme(sslSocket *ss,
b31f4f
         }
b31f4f
     }
b31f4f
 
b31f4f
+loser:
b31f4f
     PORT_SetError(SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM);
b31f4f
     return SECFailure;
b31f4f
 }
b31f4f
@@ -7700,7 +7723,8 @@ ssl_ParseSignatureSchemes(const sslSocke
b31f4f
             PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
b31f4f
             return SECFailure;
b31f4f
         }
b31f4f
-        if (ssl_IsSupportedSignatureScheme((SSLSignatureScheme)tmp)) {
b31f4f
+        if (ssl_SignatureSchemeValid((SSLSignatureScheme)tmp, SEC_OID_UNKNOWN,
b31f4f
+            (PRBool)ss->version >= SSL_LIBRARY_VERSION_TLS_1_3)) {;
b31f4f
             schemes[numSupported++] = (SSLSignatureScheme)tmp;
b31f4f
         }
b31f4f
     }
b31f4f
@@ -10286,7 +10310,12 @@ ssl3_HandleCertificateVerify(sslSocket *
b31f4f
         PORT_Assert(ss->ssl3.hs.hashType == handshake_hash_record);
b31f4f
         rv = ssl_ConsumeSignatureScheme(ss, &b, &length, &sigScheme);
b31f4f
         if (rv != SECSuccess) {
b31f4f
-            goto loser; /* malformed or unsupported. */
b31f4f
+            errCode = PORT_GetError();
b31f4f
+            /* unsupported == illegal_parameter, others == handshake_failure. */
b31f4f
+            if (errCode  == SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM) {
b31f4f
+                desc = illegal_parameter;
b31f4f
+            }
b31f4f
+            goto alert_loser;
b31f4f
         }
b31f4f
         rv = ssl_CheckSignatureSchemeConsistency(
b31f4f
             ss, sigScheme, &ss->sec.peerCert->subjectPublicKeyInfo);
b31f4f
diff -up ./gtests/ssl_gtest/ssl_extension_unittest.cc.alert-fix ./gtests/ssl_gtest/ssl_extension_unittest.cc
b31f4f
--- ./gtests/ssl_gtest/ssl_extension_unittest.cc.alert-fix	2021-07-07 11:32:11.634376932 -0700
b31f4f
+++ ./gtests/ssl_gtest/ssl_extension_unittest.cc	2021-07-07 11:33:30.595841110 -0700
b31f4f
@@ -428,7 +428,10 @@ TEST_P(TlsExtensionTest12Plus, Signature
b31f4f
 }
b31f4f
 
b31f4f
 TEST_P(TlsExtensionTest12Plus, SignatureAlgorithmsTrailingData) {
b31f4f
-  const uint8_t val[] = {0x00, 0x02, 0x04, 0x01, 0x00};  // sha-256, rsa
b31f4f
+  // make sure the test uses an algorithm that is legal for
b31f4f
+  // tls 1.3 (or tls 1.3 will through and illegalParameter
b31f4f
+  // instead of a decode error)
b31f4f
+  const uint8_t val[] = {0x00, 0x02, 0x08, 0x09, 0x00};  // sha-256, rsa-pss-pss
b31f4f
   DataBuffer extension(val, sizeof(val));
b31f4f
   ClientHelloErrorTest(std::make_shared<TlsExtensionReplacer>(
b31f4f
       client_, ssl_signature_algorithms_xtn, extension));