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

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