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