Index: net/third_party/nss/patches/clientauth.patch |
diff --git a/net/third_party/nss/patches/clientauth.patch b/net/third_party/nss/patches/clientauth.patch |
index 92836763bc57d43f8e350af747158e9d8ecd9af8..18e3b88993a7409abe57d60012e6463139e1e489 100644 |
--- a/net/third_party/nss/patches/clientauth.patch |
+++ b/net/third_party/nss/patches/clientauth.patch |
@@ -1,7 +1,61 @@ |
-diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
---- a/nss/lib/ssl/ssl3con.c 2014-01-17 17:52:00.295082288 -0800 |
-+++ b/nss/lib/ssl/ssl3con.c 2014-01-17 17:52:19.745405758 -0800 |
-@@ -2471,6 +2471,9 @@ ssl3_ClientAuthTokenPresent(sslSessionID |
+diff --git a/ssl/ssl.h b/ssl/ssl.h |
+index 91a47a6..4e7d52e 100644 |
+--- a/ssl/ssl.h |
++++ b/ssl/ssl.h |
+@@ -543,6 +543,48 @@ typedef SECStatus (PR_CALLBACK *SSLGetClientAuthData)(void *arg, |
+ SSL_IMPORT SECStatus SSL_GetClientAuthDataHook(PRFileDesc *fd, |
+ SSLGetClientAuthData f, void *a); |
+ |
++/* |
++ * Prototype for SSL callback to get client auth data from the application, |
++ * optionally using the underlying platform's cryptographic primitives. |
++ * To use the platform cryptographic primitives, caNames and pRetCerts |
++ * should be set. To use NSS, pRetNSSCert and pRetNSSKey should be set. |
++ * Returning SECFailure will cause the socket to send no client certificate. |
++ * arg - application passed argument |
++ * caNames - pointer to distinguished names of CAs that the server likes |
++ * pRetCerts - pointer to pointer to list of certs, with the first being |
++ * the client cert, and any following being used for chain |
++ * building |
++ * pRetKey - pointer to native key pointer, for return of key |
++ * - Windows: A pointer to a PCERT_KEY_CONTEXT that was allocated |
++ * via PORT_Alloc(). Ownership of the PCERT_KEY_CONTEXT |
++ * is transferred to NSS, which will free via |
++ * PORT_Free(). |
++ * - Mac OS X: A pointer to a SecKeyRef. Ownership is |
++ * transferred to NSS, which will free via CFRelease(). |
++ * pRetNSSCert - pointer to pointer to NSS cert, for return of cert. |
++ * pRetNSSKey - pointer to NSS key pointer, for return of key. |
++ */ |
++typedef SECStatus (PR_CALLBACK *SSLGetPlatformClientAuthData)(void *arg, |
++ PRFileDesc *fd, |
++ CERTDistNames *caNames, |
++ CERTCertList **pRetCerts,/*return */ |
++ void **pRetKey,/* return */ |
++ CERTCertificate **pRetNSSCert,/*return */ |
++ SECKEYPrivateKey **pRetNSSKey);/* return */ |
++ |
++/* |
++ * Set the client side callback for SSL to retrieve user's private key |
++ * and certificate. |
++ * Note: If a platform client auth callback is set, the callback configured by |
++ * SSL_GetClientAuthDataHook, if any, will not be called. |
++ * |
++ * fd - the file descriptor for the connection in question |
++ * f - the application's callback that delivers the key and cert |
++ * a - application specific data |
++ */ |
++SSL_IMPORT SECStatus |
++SSL_GetPlatformClientAuthDataHook(PRFileDesc *fd, |
++ SSLGetPlatformClientAuthData f, void *a); |
+ |
+ /* |
+ ** SNI extension processing callback function. |
+diff --git a/ssl/ssl3con.c b/ssl/ssl3con.c |
+index ebaee61..40ae885 100644 |
+--- a/ssl/ssl3con.c |
++++ b/ssl/ssl3con.c |
+@@ -2503,6 +2503,9 @@ ssl3_ClientAuthTokenPresent(sslSessionID *sid) { |
PRBool isPresent = PR_TRUE; |
/* we only care if we are doing client auth */ |
@@ -11,7 +65,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
if (!sid || !sid->u.ssl3.clAuthValid) { |
return PR_TRUE; |
} |
-@@ -6103,25 +6106,36 @@ ssl3_SendCertificateVerify(sslSocket *ss |
+@@ -6163,25 +6166,36 @@ ssl3_SendCertificateVerify(sslSocket *ss) |
isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); |
isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
@@ -65,7 +119,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
if (rv != SECSuccess) { |
goto done; /* err code was set by ssl3_SignHashes */ |
} |
-@@ -6200,6 +6214,12 @@ ssl3_HandleServerHello(sslSocket *ss, SS |
+@@ -6260,6 +6274,12 @@ ssl3_HandleServerHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
ss->ssl3.clientPrivateKey = NULL; |
} |
@@ -78,7 +132,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); |
if (temp < 0) { |
-@@ -6827,6 +6847,18 @@ ssl3_ExtractClientKeyInfo(sslSocket *ss, |
+@@ -6887,6 +6907,18 @@ ssl3_ExtractClientKeyInfo(sslSocket *ss, |
goto done; |
} |
@@ -97,7 +151,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
/* If the key is a 1024-bit RSA or DSA key, assume conservatively that |
* it may be unable to sign SHA-256 hashes. This is the case for older |
* Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and |
-@@ -6925,6 +6957,10 @@ ssl3_HandleCertificateRequest(sslSocket |
+@@ -6985,6 +7017,10 @@ ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
SECItem cert_types = {siBuffer, NULL, 0}; |
SECItem algorithms = {siBuffer, NULL, 0}; |
CERTDistNames ca_list; |
@@ -108,7 +162,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_request handshake", |
SSL_GETPID(), ss->fd)); |
-@@ -6941,6 +6977,7 @@ ssl3_HandleCertificateRequest(sslSocket |
+@@ -7001,6 +7037,7 @@ ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
PORT_Assert(ss->ssl3.clientCertChain == NULL); |
PORT_Assert(ss->ssl3.clientCertificate == NULL); |
PORT_Assert(ss->ssl3.clientPrivateKey == NULL); |
@@ -116,7 +170,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); |
isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
-@@ -7020,6 +7057,18 @@ ssl3_HandleCertificateRequest(sslSocket |
+@@ -7080,6 +7117,18 @@ ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
desc = no_certificate; |
ss->ssl3.hs.ws = wait_hello_done; |
@@ -135,7 +189,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
if (ss->getClientAuthData != NULL) { |
/* XXX Should pass cert_types and algorithms in this call!! */ |
rv = (SECStatus)(*ss->getClientAuthData)(ss->getClientAuthDataArg, |
-@@ -7029,12 +7078,55 @@ ssl3_HandleCertificateRequest(sslSocket |
+@@ -7089,12 +7138,55 @@ ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
} else { |
rv = SECFailure; /* force it to send a no_certificate alert */ |
} |
@@ -191,7 +245,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
/* check what the callback function returned */ |
if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { |
/* we are missing either the key or cert */ |
-@@ -7096,6 +7188,10 @@ loser: |
+@@ -7156,6 +7248,10 @@ loser: |
done: |
if (arena != NULL) |
PORT_FreeArena(arena, PR_FALSE); |
@@ -202,7 +256,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
return rv; |
} |
-@@ -7213,7 +7309,8 @@ ssl3_SendClientSecondRound(sslSocket *ss |
+@@ -7273,7 +7369,8 @@ ssl3_SendClientSecondRound(sslSocket *ss) |
sendClientCert = !ss->ssl3.sendEmptyCert && |
ss->ssl3.clientCertChain != NULL && |
@@ -212,7 +266,7 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
if (!sendClientCert && |
ss->ssl3.hs.hashType == handshake_hash_single && |
-@@ -12052,6 +12149,10 @@ ssl3_DestroySSL3Info(sslSocket *ss) |
+@@ -12140,6 +12237,10 @@ ssl3_DestroySSL3Info(sslSocket *ss) |
if (ss->ssl3.clientPrivateKey != NULL) |
SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
@@ -223,9 +277,10 @@ diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
if (ss->ssl3.peerCertArena != NULL) |
ssl3_CleanupPeerCerts(ss); |
-diff -pu a/nss/lib/ssl/ssl3ext.c b/nss/lib/ssl/ssl3ext.c |
---- a/nss/lib/ssl/ssl3ext.c 2014-01-17 17:49:26.072517368 -0800 |
-+++ b/nss/lib/ssl/ssl3ext.c 2014-01-17 17:52:19.745405758 -0800 |
+diff --git a/ssl/ssl3ext.c b/ssl/ssl3ext.c |
+index 3660866..9345be8 100644 |
+--- a/ssl/ssl3ext.c |
++++ b/ssl/ssl3ext.c |
@@ -10,8 +10,8 @@ |
#include "nssrenam.h" |
#include "nss.h" |
@@ -236,10 +291,11 @@ diff -pu a/nss/lib/ssl/ssl3ext.c b/nss/lib/ssl/ssl3ext.c |
#include "pk11pub.h" |
#ifdef NO_PKCS11_BYPASS |
#include "blapit.h" |
-diff -pu a/nss/lib/ssl/sslauth.c b/nss/lib/ssl/sslauth.c |
---- a/nss/lib/ssl/sslauth.c 2014-01-17 17:49:26.072517368 -0800 |
-+++ b/nss/lib/ssl/sslauth.c 2014-01-17 17:52:19.755405924 -0800 |
-@@ -216,6 +216,28 @@ SSL_GetClientAuthDataHook(PRFileDesc *s, |
+diff --git a/ssl/sslauth.c b/ssl/sslauth.c |
+index ed74d94..7f9c43b 100644 |
+--- a/ssl/sslauth.c |
++++ b/ssl/sslauth.c |
+@@ -216,6 +216,28 @@ SSL_GetClientAuthDataHook(PRFileDesc *s, SSLGetClientAuthData func, |
return SECSuccess; |
} |
@@ -268,61 +324,10 @@ diff -pu a/nss/lib/ssl/sslauth.c b/nss/lib/ssl/sslauth.c |
/* NEED LOCKS IN HERE. */ |
SECStatus |
SSL_SetPKCS11PinArg(PRFileDesc *s, void *arg) |
-diff -pu a/nss/lib/ssl/ssl.h b/nss/lib/ssl/ssl.h |
---- a/nss/lib/ssl/ssl.h 2014-01-17 17:49:26.062517203 -0800 |
-+++ b/nss/lib/ssl/ssl.h 2014-01-17 17:52:19.755405924 -0800 |
-@@ -533,6 +533,48 @@ typedef SECStatus (PR_CALLBACK *SSLGetCl |
- SSL_IMPORT SECStatus SSL_GetClientAuthDataHook(PRFileDesc *fd, |
- SSLGetClientAuthData f, void *a); |
- |
-+/* |
-+ * Prototype for SSL callback to get client auth data from the application, |
-+ * optionally using the underlying platform's cryptographic primitives. |
-+ * To use the platform cryptographic primitives, caNames and pRetCerts |
-+ * should be set. To use NSS, pRetNSSCert and pRetNSSKey should be set. |
-+ * Returning SECFailure will cause the socket to send no client certificate. |
-+ * arg - application passed argument |
-+ * caNames - pointer to distinguished names of CAs that the server likes |
-+ * pRetCerts - pointer to pointer to list of certs, with the first being |
-+ * the client cert, and any following being used for chain |
-+ * building |
-+ * pRetKey - pointer to native key pointer, for return of key |
-+ * - Windows: A pointer to a PCERT_KEY_CONTEXT that was allocated |
-+ * via PORT_Alloc(). Ownership of the PCERT_KEY_CONTEXT |
-+ * is transferred to NSS, which will free via |
-+ * PORT_Free(). |
-+ * - Mac OS X: A pointer to a SecKeyRef. Ownership is |
-+ * transferred to NSS, which will free via CFRelease(). |
-+ * pRetNSSCert - pointer to pointer to NSS cert, for return of cert. |
-+ * pRetNSSKey - pointer to NSS key pointer, for return of key. |
-+ */ |
-+typedef SECStatus (PR_CALLBACK *SSLGetPlatformClientAuthData)(void *arg, |
-+ PRFileDesc *fd, |
-+ CERTDistNames *caNames, |
-+ CERTCertList **pRetCerts,/*return */ |
-+ void **pRetKey,/* return */ |
-+ CERTCertificate **pRetNSSCert,/*return */ |
-+ SECKEYPrivateKey **pRetNSSKey);/* return */ |
-+ |
-+/* |
-+ * Set the client side callback for SSL to retrieve user's private key |
-+ * and certificate. |
-+ * Note: If a platform client auth callback is set, the callback configured by |
-+ * SSL_GetClientAuthDataHook, if any, will not be called. |
-+ * |
-+ * fd - the file descriptor for the connection in question |
-+ * f - the application's callback that delivers the key and cert |
-+ * a - application specific data |
-+ */ |
-+SSL_IMPORT SECStatus |
-+SSL_GetPlatformClientAuthDataHook(PRFileDesc *fd, |
-+ SSLGetPlatformClientAuthData f, void *a); |
- |
- /* |
- ** SNI extension processing callback function. |
-diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
---- a/nss/lib/ssl/sslimpl.h 2014-01-17 17:52:00.295082288 -0800 |
-+++ b/nss/lib/ssl/sslimpl.h 2014-01-17 17:52:19.755405924 -0800 |
+diff --git a/ssl/sslimpl.h b/ssl/sslimpl.h |
+index 88a7039..cda1869 100644 |
+--- a/ssl/sslimpl.h |
++++ b/ssl/sslimpl.h |
@@ -20,6 +20,7 @@ |
#include "sslerr.h" |
#include "ssl3prot.h" |
@@ -347,7 +352,7 @@ diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
/* to make some of these old enums public without namespace pollution, |
** it was necessary to prepend ssl_ to the names. |
** These #defines preserve compatibility with the old code here in libssl. |
-@@ -441,6 +451,14 @@ struct sslGatherStr { |
+@@ -443,6 +453,14 @@ struct sslGatherStr { |
#define GS_DATA 3 |
#define GS_PAD 4 |
@@ -362,7 +367,7 @@ diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
/* |
-@@ -953,6 +971,10 @@ struct ssl3StateStr { |
+@@ -955,6 +973,10 @@ struct ssl3StateStr { |
CERTCertificate * clientCertificate; /* used by client */ |
SECKEYPrivateKey * clientPrivateKey; /* used by client */ |
@@ -373,7 +378,7 @@ diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
CERTCertificateList *clientCertChain; /* used by client */ |
PRBool sendEmptyCert; /* used by client */ |
-@@ -1214,6 +1236,10 @@ const unsigned char * preferredCipher; |
+@@ -1216,6 +1238,10 @@ const unsigned char * preferredCipher; |
void *authCertificateArg; |
SSLGetClientAuthData getClientAuthData; |
void *getClientAuthDataArg; |
@@ -384,7 +389,7 @@ diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
SSLSNISocketConfig sniSocketConfig; |
void *sniSocketConfigArg; |
SSLBadCertHandler handleBadCert; |
-@@ -1852,6 +1878,26 @@ extern SECStatus ssl_InitSessionCacheLoc |
+@@ -1856,6 +1882,26 @@ extern SECStatus ssl_InitSessionCacheLocks(PRBool lazyInit); |
extern SECStatus ssl_FreeSessionCacheLocks(void); |
@@ -411,21 +416,22 @@ diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
/**************** DTLS-specific functions **************/ |
extern void dtls_FreeQueuedMessage(DTLSQueuedMessage *msg); |
-diff -pu a/nss/lib/ssl/sslsock.c b/nss/lib/ssl/sslsock.c |
---- a/nss/lib/ssl/sslsock.c 2014-01-17 17:49:40.942764689 -0800 |
-+++ b/nss/lib/ssl/sslsock.c 2014-01-17 17:52:19.755405924 -0800 |
-@@ -263,6 +263,10 @@ ssl_DupSocket(sslSocket *os) |
- ss->authCertificateArg = os->authCertificateArg; |
- ss->getClientAuthData = os->getClientAuthData; |
- ss->getClientAuthDataArg = os->getClientAuthDataArg; |
+diff --git a/ssl/sslsock.c b/ssl/sslsock.c |
+index 90bc457..fccc664 100644 |
+--- a/ssl/sslsock.c |
++++ b/ssl/sslsock.c |
+@@ -275,6 +275,10 @@ ssl_DupSocket(sslSocket *os) |
+ ss->authCertificateArg = os->authCertificateArg; |
+ ss->getClientAuthData = os->getClientAuthData; |
+ ss->getClientAuthDataArg = os->getClientAuthDataArg; |
+#ifdef NSS_PLATFORM_CLIENT_AUTH |
-+ ss->getPlatformClientAuthData = os->getPlatformClientAuthData; |
-+ ss->getPlatformClientAuthDataArg = os->getPlatformClientAuthDataArg; |
++ ss->getPlatformClientAuthData = os->getPlatformClientAuthData; |
++ ss->getPlatformClientAuthDataArg = os->getPlatformClientAuthDataArg; |
+#endif |
ss->sniSocketConfig = os->sniSocketConfig; |
ss->sniSocketConfigArg = os->sniSocketConfigArg; |
- ss->handleBadCert = os->handleBadCert; |
-@@ -1667,6 +1671,12 @@ SSL_ReconfigFD(PRFileDesc *model, PRFile |
+ ss->handleBadCert = os->handleBadCert; |
+@@ -1709,6 +1713,12 @@ SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
ss->getClientAuthData = sm->getClientAuthData; |
if (sm->getClientAuthDataArg) |
ss->getClientAuthDataArg = sm->getClientAuthDataArg; |
@@ -438,14 +444,14 @@ diff -pu a/nss/lib/ssl/sslsock.c b/nss/lib/ssl/sslsock.c |
if (sm->sniSocketConfig) |
ss->sniSocketConfig = sm->sniSocketConfig; |
if (sm->sniSocketConfigArg) |
-@@ -2921,6 +2931,10 @@ ssl_NewSocket(PRBool makeLocks, SSLProto |
+@@ -2974,6 +2984,10 @@ ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant) |
ss->sniSocketConfig = NULL; |
ss->sniSocketConfigArg = NULL; |
- ss->getClientAuthData = NULL; |
+ ss->getClientAuthData = NULL; |
+#ifdef NSS_PLATFORM_CLIENT_AUTH |
-+ ss->getPlatformClientAuthData = NULL; |
-+ ss->getPlatformClientAuthDataArg = NULL; |
++ ss->getPlatformClientAuthData = NULL; |
++ ss->getPlatformClientAuthDataArg = NULL; |
+#endif /* NSS_PLATFORM_CLIENT_AUTH */ |
- ss->handleBadCert = NULL; |
- ss->badCertArg = NULL; |
- ss->pkcs11PinArg = NULL; |
+ ss->handleBadCert = NULL; |
+ ss->badCertArg = NULL; |
+ ss->pkcs11PinArg = NULL; |