Index: net/third_party/nss/patches/dheclientauth.patch |
diff --git a/net/third_party/nss/patches/dheclientauth.patch b/net/third_party/nss/patches/dheclientauth.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92d1d97ecfded77937aa1f49ed236e8758e6b3fd |
--- /dev/null |
+++ b/net/third_party/nss/patches/dheclientauth.patch |
@@ -0,0 +1,98 @@ |
+Index: mozilla/security/nss/lib/ssl/ssl3con.c |
+=================================================================== |
+RCS file: /cvsroot/mozilla/security/nss/lib/ssl/ssl3con.c,v |
+retrieving revision 1.142.2.4 |
+diff -u -p -u -8 -r1.142.2.4 ssl3con.c |
+--- mozilla/security/nss/lib/ssl/ssl3con.c 1 Sep 2010 19:47:11 -0000 1.142.2.4 |
++++ mozilla/security/nss/lib/ssl/ssl3con.c 8 Dec 2010 06:55:49 -0000 |
+@@ -4832,24 +4832,18 @@ ssl3_SendCertificateVerify(sslSocket *ss |
+ */ |
+ slot = PK11_GetSlotFromPrivateKey(ss->ssl3.clientPrivateKey); |
+ sid->u.ssl3.clAuthSeries = PK11_GetSlotSeries(slot); |
+ sid->u.ssl3.clAuthSlotID = PK11_GetSlotID(slot); |
+ sid->u.ssl3.clAuthModuleID = PK11_GetModuleID(slot); |
+ sid->u.ssl3.clAuthValid = PR_TRUE; |
+ PK11_FreeSlot(slot); |
+ } |
+- /* If we're doing RSA key exchange, we're all done with the private key |
+- * here. Diffie-Hellman key exchanges need the client's |
+- * private key for the key exchange. |
+- */ |
+- if (ss->ssl3.hs.kea_def->exchKeyType == kt_rsa) { |
+- SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
+- ss->ssl3.clientPrivateKey = NULL; |
+- } |
++ SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
++ ss->ssl3.clientPrivateKey = NULL; |
+ if (rv != SECSuccess) { |
+ goto done; /* err code was set by ssl3_SignHashes */ |
+ } |
+ |
+ rv = ssl3_AppendHandshakeHeader(ss, certificate_verify, buf.len + 2); |
+ if (rv != SECSuccess) { |
+ goto done; /* error code set by AppendHandshake */ |
+ } |
+@@ -4894,16 +4888,30 @@ ssl3_HandleServerHello(sslSocket *ss, SS |
+ goto alert_loser; |
+ } |
+ if (ss->ssl3.hs.ws != wait_server_hello) { |
+ errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO; |
+ desc = unexpected_message; |
+ goto alert_loser; |
+ } |
+ |
++ /* clean up anything left from previous handshake. */ |
++ if (ss->ssl3.clientCertChain != NULL) { |
++ CERT_DestroyCertificateList(ss->ssl3.clientCertChain); |
++ ss->ssl3.clientCertChain = NULL; |
++ } |
++ if (ss->ssl3.clientCertificate != NULL) { |
++ CERT_DestroyCertificate(ss->ssl3.clientCertificate); |
++ ss->ssl3.clientCertificate = NULL; |
++ } |
++ if (ss->ssl3.clientPrivateKey != NULL) { |
++ SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
++ ss->ssl3.clientPrivateKey = NULL; |
++ } |
++ |
+ temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); |
+ if (temp < 0) { |
+ goto loser; /* alert has been sent */ |
+ } |
+ version = (SSL3ProtocolVersion)temp; |
+ |
+ /* this is appropriate since the negotiation is complete, and we only |
+ ** know SSL 3.x. |
+@@ -5449,29 +5457,19 @@ ssl3_HandleCertificateRequest(sslSocket |
+ |
+ if (ss->ssl3.hs.ws != wait_cert_request && |
+ ss->ssl3.hs.ws != wait_server_key) { |
+ desc = unexpected_message; |
+ errCode = SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST; |
+ goto alert_loser; |
+ } |
+ |
+- /* clean up anything left from previous handshake. */ |
+- if (ss->ssl3.clientCertChain != NULL) { |
+- CERT_DestroyCertificateList(ss->ssl3.clientCertChain); |
+- ss->ssl3.clientCertChain = NULL; |
+- } |
+- if (ss->ssl3.clientCertificate != NULL) { |
+- CERT_DestroyCertificate(ss->ssl3.clientCertificate); |
+- ss->ssl3.clientCertificate = NULL; |
+- } |
+- if (ss->ssl3.clientPrivateKey != NULL) { |
+- SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
+- ss->ssl3.clientPrivateKey = NULL; |
+- } |
++ PORT_Assert(ss->ssl3.clientCertChain == NULL); |
++ PORT_Assert(ss->ssl3.clientCertificate == NULL); |
++ PORT_Assert(ss->ssl3.clientPrivateKey == NULL); |
+ |
+ isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); |
+ rv = ssl3_ConsumeHandshakeVariable(ss, &cert_types, 1, &b, &length); |
+ if (rv != SECSuccess) |
+ goto loser; /* malformed, alert has been sent */ |
+ |
+ arena = ca_list.arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); |
+ if (arena == NULL) |