Index: net/third_party/nss/patches/tls12backuphash2.patch |
=================================================================== |
--- net/third_party/nss/patches/tls12backuphash2.patch (revision 242942) |
+++ net/third_party/nss/patches/tls12backuphash2.patch (working copy) |
@@ -1,127 +0,0 @@ |
-diff --git a/net/third_party/nss/ssl/ssl3con.c b/net/third_party/nss/ssl/ssl3con.c |
-index 06992e0..cf7ef32 100644 |
---- a/net/third_party/nss/ssl/ssl3con.c |
-+++ b/net/third_party/nss/ssl/ssl3con.c |
-@@ -6973,14 +6973,27 @@ no_memory: /* no-memory error has already been set. */ |
- |
- |
- /* |
-- * Returns true if the client authentication key is an RSA or DSA key that |
-- * may be able to sign only SHA-1 hashes. |
-+ * Returns the TLS signature algorithm for the client authentication key and |
-+ * whether it is an RSA or DSA key that may be able to sign only SHA-1 hashes. |
- */ |
--static PRBool |
--ssl3_ClientKeyPrefersSHA1(sslSocket *ss) |
-+static SECStatus |
-+ssl3_ExtractClientKeyInfo(sslSocket *ss, |
-+ TLSSignatureAlgorithm *sigAlg, |
-+ PRBool *preferSha1) |
- { |
-+ SECStatus rv = SECSuccess; |
- SECKEYPublicKey *pubk; |
-- PRBool prefer_sha1 = PR_FALSE; |
-+ |
-+ pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate); |
-+ if (pubk == NULL) { |
-+ rv = SECFailure; |
-+ goto done; |
-+ } |
-+ |
-+ rv = ssl3_TLSSignatureAlgorithmForKeyType(pubk->keyType, sigAlg); |
-+ if (rv != SECSuccess) { |
-+ goto done; |
-+ } |
- |
- #if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(_WIN32) |
- /* If the key is in CAPI, assume conservatively that the CAPI service |
-@@ -6989,7 +7002,8 @@ ssl3_ClientKeyPrefersSHA1(sslSocket *ss) |
- if (ss->ssl3.platformClientKey->dwKeySpec != CERT_NCRYPT_KEY_SPEC) { |
- /* CAPI only supports RSA and DSA signatures, so we don't need to |
- * check the key type. */ |
-- return PR_TRUE; |
-+ *preferSha1 = PR_TRUE; |
-+ goto done; |
- } |
- #endif /* NSS_PLATFORM_CLIENT_AUTH && _WIN32 */ |
- |
-@@ -6999,38 +7013,61 @@ ssl3_ClientKeyPrefersSHA1(sslSocket *ss) |
- * older, DSA key size is at most 1024 bits and the hash function must |
- * be SHA-1. |
- */ |
-- pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate); |
-- if (pubk == NULL) { |
-- return PR_FALSE; |
-- } |
- if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) { |
-- prefer_sha1 = SECKEY_PublicKeyStrength(pubk) <= 128; |
-+ *preferSha1 = SECKEY_PublicKeyStrength(pubk) <= 128; |
-+ } else { |
-+ *preferSha1 = PR_FALSE; |
- } |
-- SECKEY_DestroyPublicKey(pubk); |
-- return prefer_sha1; |
-+ |
-+ done: |
-+ if (pubk) |
-+ SECKEY_DestroyPublicKey(pubk); |
-+ return rv; |
- } |
- |
--/* Destroys the backup handshake hash context if we don't need it. */ |
-+/* Destroys the backup handshake hash context if we don't need it. Note that |
-+ * this function selects the hash algorithm for client authentication |
-+ * signatures; ssl3_SendCertificateVerify uses the presence of the backup hash |
-+ * to determine whether to use SHA-1 or SHA-256. */ |
- static void |
- ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss, |
- const SECItem *algorithms) |
- { |
-- PRBool need_backup_hash = PR_FALSE; |
-+ SECStatus rv; |
-+ TLSSignatureAlgorithm sigAlg; |
-+ PRBool preferSha1; |
-+ PRBool supportsSha1 = PR_FALSE; |
-+ PRBool supportsSha256 = PR_FALSE; |
-+ PRBool needBackupHash = PR_FALSE; |
- unsigned int i; |
- |
- PORT_Assert(ss->ssl3.hs.md5); |
-- if (ssl3_ClientKeyPrefersSHA1(ss)) { |
-- /* Use SHA-1 if the server supports it. */ |
-- for (i = 0; i < algorithms->len; i += 2) { |
-- if (algorithms->data[i] == tls_hash_sha1 && |
-- (algorithms->data[i+1] == tls_sig_rsa || |
-- algorithms->data[i+1] == tls_sig_dsa)) { |
-- need_backup_hash = PR_TRUE; |
-- break; |
-+ |
-+ /* Determine the key's signature algorithm and whether it prefers SHA-1. */ |
-+ rv = ssl3_ExtractClientKeyInfo(ss, &sigAlg, &preferSha1); |
-+ if (rv != SECSuccess) { |
-+ goto done; |
-+ } |
-+ |
-+ /* Determine the server's hash support for that signature algorithm. */ |
-+ for (i = 0; i < algorithms->len; i += 2) { |
-+ if (algorithms->data[i+1] == sigAlg) { |
-+ if (algorithms->data[i] == tls_hash_sha1) { |
-+ supportsSha1 = PR_TRUE; |
-+ } else if (algorithms->data[i] == tls_hash_sha256) { |
-+ supportsSha256 = PR_TRUE; |
- } |
- } |
- } |
-- if (!need_backup_hash) { |
-+ |
-+ /* If either the server does not support SHA-256 or the client key prefers |
-+ * SHA-1, leave the backup hash. */ |
-+ if (supportsSha1 && (preferSha1 || !supportsSha256)) { |
-+ needBackupHash = PR_TRUE; |
-+ } |
-+ |
-+done: |
-+ if (!needBackupHash) { |
- PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); |
- ss->ssl3.hs.md5 = NULL; |
- } |