Blame SOURCES/nss-disable-pkcs1-sigalgs-tls13.patch

ddf7d0
# HG changeset patch
ddf7d0
# User Daiki Ueno <dueno@redhat.com>
ddf7d0
# Date 1559031046 -7200
ddf7d0
#      Tue May 28 10:10:46 2019 +0200
ddf7d0
# Node ID 0a4e8b72a92e144663c2f35d3836f7828cfc97f2
ddf7d0
# Parent  370a9e85f216f5f4ff277995a997c5c9b23a819f
ddf7d0
Bug 1552208, prohibit use of RSASSA-PKCS1-v1_5 algorithms in TLS 1.3, r=mt
ddf7d0
ddf7d0
Reviewers: mt
ddf7d0
ddf7d0
Reviewed By: mt
ddf7d0
ddf7d0
Subscribers: mt, jcj, ueno, rrelyea, HubertKario, KevinJacobs
ddf7d0
ddf7d0
Tags: #secure-revision, #bmo-crypto-core-security
ddf7d0
ddf7d0
Bug #: 1552208
ddf7d0
ddf7d0
Differential Revision: https://phabricator.services.mozilla.com/D32454
ddf7d0
ddf7d0
diff --git a/gtests/ssl_gtest/ssl_auth_unittest.cc b/gtests/ssl_gtest/ssl_auth_unittest.cc
ddf7d0
--- a/gtests/ssl_gtest/ssl_auth_unittest.cc
ddf7d0
+++ b/gtests/ssl_gtest/ssl_auth_unittest.cc
ddf7d0
@@ -701,6 +701,44 @@ TEST_P(TlsConnectTls12, ClientAuthIncons
ddf7d0
   ConnectExpectAlert(server_, kTlsAlertIllegalParameter);
ddf7d0
 }
ddf7d0
 
ddf7d0
+TEST_P(TlsConnectTls13, ClientAuthPkcs1SignatureScheme) {
ddf7d0
+  static const SSLSignatureScheme kSignatureScheme[] = {
ddf7d0
+      ssl_sig_rsa_pkcs1_sha256, ssl_sig_rsa_pss_rsae_sha256};
ddf7d0
+
ddf7d0
+  Reset(TlsAgent::kServerRsa, "rsa");
ddf7d0
+  client_->SetSignatureSchemes(kSignatureScheme,
ddf7d0
+                               PR_ARRAY_SIZE(kSignatureScheme));
ddf7d0
+  server_->SetSignatureSchemes(kSignatureScheme,
ddf7d0
+                               PR_ARRAY_SIZE(kSignatureScheme));
ddf7d0
+  client_->SetupClientAuth();
ddf7d0
+  server_->RequestClientAuth(true);
ddf7d0
+
ddf7d0
+  auto capture_cert_verify = MakeTlsFilter<TlsHandshakeRecorder>(
ddf7d0
+      client_, kTlsHandshakeCertificateVerify);
ddf7d0
+  capture_cert_verify->EnableDecryption();
ddf7d0
+
ddf7d0
+  Connect();
ddf7d0
+  CheckSigScheme(capture_cert_verify, 0, server_, ssl_sig_rsa_pss_rsae_sha256,
ddf7d0
+                 1024);
ddf7d0
+}
ddf7d0
+
ddf7d0
+TEST_P(TlsConnectTls13, ClientAuthPkcs1SignatureSchemeOnly) {
ddf7d0
+  static const SSLSignatureScheme kSignatureScheme[] = {
ddf7d0
+      ssl_sig_rsa_pkcs1_sha256};
ddf7d0
+
ddf7d0
+  Reset(TlsAgent::kServerRsa, "rsa");
ddf7d0
+  client_->SetSignatureSchemes(kSignatureScheme,
ddf7d0
+                               PR_ARRAY_SIZE(kSignatureScheme));
ddf7d0
+  server_->SetSignatureSchemes(kSignatureScheme,
ddf7d0
+                               PR_ARRAY_SIZE(kSignatureScheme));
ddf7d0
+  client_->SetupClientAuth();
ddf7d0
+  server_->RequestClientAuth(true);
ddf7d0
+
ddf7d0
+  ConnectExpectAlert(server_, kTlsAlertHandshakeFailure);
ddf7d0
+  server_->CheckErrorCode(SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM);
ddf7d0
+  client_->CheckErrorCode(SSL_ERROR_NO_CYPHER_OVERLAP);
ddf7d0
+}
ddf7d0
+
ddf7d0
 class TlsZeroCertificateRequestSigAlgsFilter : public TlsHandshakeFilter {
ddf7d0
  public:
ddf7d0
   TlsZeroCertificateRequestSigAlgsFilter(const std::shared_ptr<TlsAgent>& a)
ddf7d0
@@ -933,7 +971,7 @@ TEST_P(TlsConnectTls13, InconsistentSign
ddf7d0
   client_->CheckErrorCode(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM);
ddf7d0
 }
ddf7d0
 
ddf7d0
-TEST_P(TlsConnectTls12Plus, RequestClientAuthWithSha384) {
ddf7d0
+TEST_P(TlsConnectTls12, RequestClientAuthWithSha384) {
ddf7d0
   server_->SetSignatureSchemes(kSignatureSchemeRsaSha384,
ddf7d0
                                PR_ARRAY_SIZE(kSignatureSchemeRsaSha384));
ddf7d0
   server_->RequestClientAuth(false);
ddf7d0
@@ -1395,12 +1433,21 @@ TEST_P(TlsSignatureSchemeConfiguration, 
ddf7d0
 INSTANTIATE_TEST_CASE_P(
ddf7d0
     SignatureSchemeRsa, TlsSignatureSchemeConfiguration,
ddf7d0
     ::testing::Combine(
ddf7d0
-        TlsConnectTestBase::kTlsVariantsAll, TlsConnectTestBase::kTlsV12Plus,
ddf7d0
+        TlsConnectTestBase::kTlsVariantsAll, TlsConnectTestBase::kTlsV12,
ddf7d0
         ::testing::Values(TlsAgent::kServerRsaSign),
ddf7d0
         ::testing::Values(ssl_auth_rsa_sign),
ddf7d0
         ::testing::Values(ssl_sig_rsa_pkcs1_sha256, ssl_sig_rsa_pkcs1_sha384,
ddf7d0
                           ssl_sig_rsa_pkcs1_sha512, ssl_sig_rsa_pss_rsae_sha256,
ddf7d0
                           ssl_sig_rsa_pss_rsae_sha384)));
ddf7d0
+// RSASSA-PKCS1-v1_5 is not allowed to be used in TLS 1.3
ddf7d0
+INSTANTIATE_TEST_CASE_P(
ddf7d0
+    SignatureSchemeRsaTls13, TlsSignatureSchemeConfiguration,
ddf7d0
+    ::testing::Combine(TlsConnectTestBase::kTlsVariantsAll,
ddf7d0
+                       TlsConnectTestBase::kTlsV13,
ddf7d0
+                       ::testing::Values(TlsAgent::kServerRsaSign),
ddf7d0
+                       ::testing::Values(ssl_auth_rsa_sign),
ddf7d0
+                       ::testing::Values(ssl_sig_rsa_pss_rsae_sha256,
ddf7d0
+                                         ssl_sig_rsa_pss_rsae_sha384)));
ddf7d0
 // PSS with SHA-512 needs a bigger key to work.
ddf7d0
 INSTANTIATE_TEST_CASE_P(
ddf7d0
     SignatureSchemeBigRsa, TlsSignatureSchemeConfiguration,
ddf7d0
diff --git a/gtests/ssl_gtest/ssl_ciphersuite_unittest.cc b/gtests/ssl_gtest/ssl_ciphersuite_unittest.cc
ddf7d0
--- a/gtests/ssl_gtest/ssl_ciphersuite_unittest.cc
ddf7d0
+++ b/gtests/ssl_gtest/ssl_ciphersuite_unittest.cc
ddf7d0
@@ -68,12 +68,6 @@ class TlsCipherSuiteTestBase : public Tl
ddf7d0
   virtual void SetupCertificate() {
ddf7d0
     if (version_ >= SSL_LIBRARY_VERSION_TLS_1_3) {
ddf7d0
       switch (sig_scheme_) {
ddf7d0
-        case ssl_sig_rsa_pkcs1_sha256:
ddf7d0
-        case ssl_sig_rsa_pkcs1_sha384:
ddf7d0
-        case ssl_sig_rsa_pkcs1_sha512:
ddf7d0
-          Reset(TlsAgent::kServerRsaSign);
ddf7d0
-          auth_type_ = ssl_auth_rsa_sign;
ddf7d0
-          break;
ddf7d0
         case ssl_sig_rsa_pss_rsae_sha256:
ddf7d0
         case ssl_sig_rsa_pss_rsae_sha384:
ddf7d0
           Reset(TlsAgent::kServerRsaSign);
ddf7d0
@@ -330,6 +324,12 @@ static SSLSignatureScheme kSignatureSche
ddf7d0
     ssl_sig_rsa_pss_pss_sha256,     ssl_sig_rsa_pss_pss_sha384,
ddf7d0
     ssl_sig_rsa_pss_pss_sha512};
ddf7d0
 
ddf7d0
+static SSLSignatureScheme kSignatureSchemesParamsArrTls13[] = {
ddf7d0
+    ssl_sig_ecdsa_secp256r1_sha256, ssl_sig_ecdsa_secp384r1_sha384,
ddf7d0
+    ssl_sig_rsa_pss_rsae_sha256,    ssl_sig_rsa_pss_rsae_sha384,
ddf7d0
+    ssl_sig_rsa_pss_rsae_sha512,    ssl_sig_rsa_pss_pss_sha256,
ddf7d0
+    ssl_sig_rsa_pss_pss_sha384,     ssl_sig_rsa_pss_pss_sha512};
ddf7d0
+
ddf7d0
 INSTANTIATE_CIPHER_TEST_P(RC4, Stream, V10ToV12, kDummyNamedGroupParams,
ddf7d0
                           kDummySignatureSchemesParams,
ddf7d0
                           TLS_RSA_WITH_RC4_128_SHA,
ddf7d0
@@ -394,7 +394,7 @@ INSTANTIATE_CIPHER_TEST_P(
ddf7d0
 #ifndef NSS_DISABLE_TLS_1_3
ddf7d0
 INSTANTIATE_CIPHER_TEST_P(TLS13, All, V13,
ddf7d0
                           ::testing::ValuesIn(kFasterDHEGroups),
ddf7d0
-                          ::testing::ValuesIn(kSignatureSchemesParamsArr),
ddf7d0
+                          ::testing::ValuesIn(kSignatureSchemesParamsArrTls13),
ddf7d0
                           TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256,
ddf7d0
                           TLS_AES_256_GCM_SHA384);
ddf7d0
 INSTANTIATE_CIPHER_TEST_P(TLS13AllGroups, All, V13,
ddf7d0
diff --git a/gtests/ssl_gtest/ssl_extension_unittest.cc b/gtests/ssl_gtest/ssl_extension_unittest.cc
ddf7d0
--- a/gtests/ssl_gtest/ssl_extension_unittest.cc
ddf7d0
+++ b/gtests/ssl_gtest/ssl_extension_unittest.cc
ddf7d0
@@ -436,14 +436,14 @@ TEST_P(TlsExtensionTest12Plus, Signature
ddf7d0
 }
ddf7d0
 
ddf7d0
 TEST_F(TlsExtensionTest13Stream, SignatureAlgorithmsPrecedingGarbage) {
ddf7d0
-  // 31 unknown signature algorithms followed by sha-256, rsa
ddf7d0
+  // 31 unknown signature algorithms followed by sha-256, rsa-pss
ddf7d0
   const uint8_t val[] = {
ddf7d0
       0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
ddf7d0
       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
ddf7d0
       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
ddf7d0
       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
ddf7d0
       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
ddf7d0
-      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x01};
ddf7d0
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x04};
ddf7d0
   DataBuffer extension(val, sizeof(val));
ddf7d0
   MakeTlsFilter<TlsExtensionReplacer>(client_, ssl_signature_algorithms_xtn,
ddf7d0
                                       extension);
ddf7d0
diff --git a/lib/ssl/ssl3con.c b/lib/ssl/ssl3con.c
ddf7d0
--- a/lib/ssl/ssl3con.c
ddf7d0
+++ b/lib/ssl/ssl3con.c
ddf7d0
@@ -64,6 +64,7 @@ static SECStatus ssl3_FlushHandshakeMess
ddf7d0
 static CK_MECHANISM_TYPE ssl3_GetHashMechanismByHashType(SSLHashType hashType);
ddf7d0
 static CK_MECHANISM_TYPE ssl3_GetMgfMechanismByHashType(SSLHashType hash);
ddf7d0
 PRBool ssl_IsRsaPssSignatureScheme(SSLSignatureScheme scheme);
ddf7d0
+PRBool ssl_IsRsaPkcs1SignatureScheme(SSLSignatureScheme scheme);
ddf7d0
 PRBool ssl_IsDsaSignatureScheme(SSLSignatureScheme scheme);
ddf7d0
 
ddf7d0
 const PRUint8 ssl_hello_retry_random[] = {
ddf7d0
@@ -4101,6 +4102,9 @@ ssl_SignatureSchemeValid(SSLSignatureSch
ddf7d0
         if (ssl_SignatureSchemeToHashType(scheme) == ssl_hash_sha1) {
ddf7d0
             return PR_FALSE;
ddf7d0
         }
ddf7d0
+        if (ssl_IsRsaPkcs1SignatureScheme(scheme)) {
ddf7d0
+            return PR_FALSE;
ddf7d0
+        }
ddf7d0
         /* With TLS 1.3, EC keys should have been selected based on calling
ddf7d0
          * ssl_SignatureSchemeFromSpki(), reject them otherwise. */
ddf7d0
         return spkiOid != SEC_OID_ANSIX962_EC_PUBLIC_KEY;
ddf7d0
@@ -4351,6 +4355,22 @@ ssl_IsRsaPssSignatureScheme(SSLSignature
ddf7d0
 }
ddf7d0
 
ddf7d0
 PRBool
ddf7d0
+ssl_IsRsaPkcs1SignatureScheme(SSLSignatureScheme scheme)
ddf7d0
+{
ddf7d0
+    switch (scheme) {
ddf7d0
+        case ssl_sig_rsa_pkcs1_sha256:
ddf7d0
+        case ssl_sig_rsa_pkcs1_sha384:
ddf7d0
+        case ssl_sig_rsa_pkcs1_sha512:
ddf7d0
+        case ssl_sig_rsa_pkcs1_sha1:
ddf7d0
+            return PR_TRUE;
ddf7d0
+
ddf7d0
+        default:
ddf7d0
+            return PR_FALSE;
ddf7d0
+    }
ddf7d0
+    return PR_FALSE;
ddf7d0
+}
ddf7d0
+
ddf7d0
+PRBool
ddf7d0
 ssl_IsDsaSignatureScheme(SSLSignatureScheme scheme)
ddf7d0
 {
ddf7d0
     switch (scheme) {