| Index: net/third_party/nss/patches/clientauth.patch | 
| =================================================================== | 
| --- net/third_party/nss/patches/clientauth.patch	(revision 242942) | 
| +++ net/third_party/nss/patches/clientauth.patch	(working copy) | 
| @@ -1,7 +1,7 @@ | 
| diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c | 
| ---- a/nss/lib/ssl/ssl3con.c	2013-07-31 12:31:45.326118409 -0700 | 
| -+++ b/nss/lib/ssl/ssl3con.c	2013-07-31 12:35:27.189373289 -0700 | 
| -@@ -2284,6 +2284,9 @@ ssl3_ClientAuthTokenPresent(sslSessionID | 
| +--- a/nss/lib/ssl/ssl3con.c	2014-01-03 19:30:40.073373382 -0800 | 
| ++++ b/nss/lib/ssl/ssl3con.c	2014-01-03 19:30:52.653579045 -0800 | 
| +@@ -2471,6 +2471,9 @@ ssl3_ClientAuthTokenPresent(sslSessionID | 
| PRBool isPresent = PR_TRUE; | 
|  | 
| /* we only care if we are doing client auth */ | 
| @@ -11,7 +11,7 @@ | 
| if (!sid || !sid->u.ssl3.clAuthValid) { | 
| return PR_TRUE; | 
| } | 
| -@@ -5768,25 +5771,36 @@ ssl3_SendCertificateVerify(sslSocket *ss | 
| +@@ -6080,25 +6083,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 +65,7 @@ | 
| if (rv != SECSuccess) { | 
| goto done;	/* err code was set by ssl3_SignHashes */ | 
| } | 
| -@@ -5870,6 +5884,12 @@ ssl3_HandleServerHello(sslSocket *ss, SS | 
| +@@ -6177,6 +6191,12 @@ ssl3_HandleServerHello(sslSocket *ss, SS | 
| SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | 
| ss->ssl3.clientPrivateKey = NULL; | 
| } | 
| @@ -78,7 +78,26 @@ | 
|  | 
| temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); | 
| if (temp < 0) { | 
| -@@ -6496,6 +6516,10 @@ ssl3_HandleCertificateRequest(sslSocket | 
| +@@ -6804,6 +6824,18 @@ ssl3_ExtractClientKeyInfo(sslSocket *ss, | 
| + 	goto done; | 
| +     } | 
| + | 
| ++#if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(_WIN32) | 
| ++    /* If the key is in CAPI, assume conservatively that the CAPI service | 
| ++     * provider may be unable to sign SHA-256 hashes. | 
| ++     */ | 
| ++    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. */ | 
| ++	*preferSha1 = PR_TRUE; | 
| ++	goto done; | 
| ++    } | 
| ++#endif  /* NSS_PLATFORM_CLIENT_AUTH && _WIN32 */ | 
| ++ | 
| +     /* 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 | 
| +@@ -6902,6 +6934,10 @@ ssl3_HandleCertificateRequest(sslSocket | 
| SECItem              cert_types  = {siBuffer, NULL, 0}; | 
| SECItem              algorithms  = {siBuffer, NULL, 0}; | 
| CERTDistNames        ca_list; | 
| @@ -89,7 +108,7 @@ | 
|  | 
| SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_request handshake", | 
| SSL_GETPID(), ss->fd)); | 
| -@@ -6512,6 +6536,7 @@ ssl3_HandleCertificateRequest(sslSocket | 
| +@@ -6918,6 +6954,7 @@ ssl3_HandleCertificateRequest(sslSocket | 
| PORT_Assert(ss->ssl3.clientCertChain == NULL); | 
| PORT_Assert(ss->ssl3.clientCertificate == NULL); | 
| PORT_Assert(ss->ssl3.clientPrivateKey == NULL); | 
| @@ -97,7 +116,7 @@ | 
|  | 
| isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | 
| isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | 
| -@@ -6591,6 +6616,18 @@ ssl3_HandleCertificateRequest(sslSocket | 
| +@@ -6997,6 +7034,18 @@ ssl3_HandleCertificateRequest(sslSocket | 
| desc = no_certificate; | 
| ss->ssl3.hs.ws = wait_hello_done; | 
|  | 
| @@ -116,7 +135,7 @@ | 
| if (ss->getClientAuthData != NULL) { | 
| /* XXX Should pass cert_types and algorithms in this call!! */ | 
| rv = (SECStatus)(*ss->getClientAuthData)(ss->getClientAuthDataArg, | 
| -@@ -6600,12 +6637,52 @@ ssl3_HandleCertificateRequest(sslSocket | 
| +@@ -7006,12 +7055,55 @@ ssl3_HandleCertificateRequest(sslSocket | 
| } else { | 
| rv = SECFailure; /* force it to send a no_certificate alert */ | 
| } | 
| @@ -163,13 +182,16 @@ | 
| +		} | 
| +		goto send_no_certificate; | 
| +	    } | 
| ++	    if (ss->ssl3.hs.hashType == handshake_hash_single) { | 
| ++		ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); | 
| ++	    } | 
| +	    break;  /* not an error */ | 
| +	} | 
| +#endif   /* NSS_PLATFORM_CLIENT_AUTH */ | 
| /* check what the callback function returned */ | 
| if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { | 
| /* we are missing either the key or cert */ | 
| -@@ -6668,6 +6745,10 @@ loser: | 
| +@@ -7073,6 +7165,10 @@ loser: | 
| done: | 
| if (arena != NULL) | 
| PORT_FreeArena(arena, PR_FALSE); | 
| @@ -180,7 +202,7 @@ | 
| return rv; | 
| } | 
|  | 
| -@@ -6749,7 +6830,8 @@ ssl3_SendClientSecondRound(sslSocket *ss | 
| +@@ -7190,7 +7286,8 @@ ssl3_SendClientSecondRound(sslSocket *ss | 
|  | 
| sendClientCert = !ss->ssl3.sendEmptyCert && | 
| ss->ssl3.clientCertChain  != NULL && | 
| @@ -188,9 +210,9 @@ | 
| +		     (ss->ssl3.platformClientKey || | 
| +		     ss->ssl3.clientPrivateKey != NULL); | 
|  | 
| -     /* We must wait for the server's certificate to be authenticated before | 
| -      * sending the client certificate in order to disclosing the client | 
| -@@ -11465,6 +11547,10 @@ ssl3_DestroySSL3Info(sslSocket *ss) | 
| +     if (!sendClientCert && | 
| + 	ss->ssl3.hs.hashType == handshake_hash_single && | 
| +@@ -12027,6 +12124,10 @@ ssl3_DestroySSL3Info(sslSocket *ss) | 
|  | 
| if (ss->ssl3.clientPrivateKey != NULL) | 
| SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | 
| @@ -202,8 +224,8 @@ | 
| 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	2013-07-31 12:07:10.964699464 -0700 | 
| -+++ b/nss/lib/ssl/ssl3ext.c	2013-07-31 12:35:27.189373289 -0700 | 
| +--- a/nss/lib/ssl/ssl3ext.c	2014-01-03 19:28:03.550814608 -0800 | 
| ++++ b/nss/lib/ssl/ssl3ext.c	2014-01-03 19:30:52.653579045 -0800 | 
| @@ -10,8 +10,8 @@ | 
| #include "nssrenam.h" | 
| #include "nss.h" | 
| @@ -215,9 +237,9 @@ | 
| #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	2013-07-31 12:32:29.076760372 -0700 | 
| -+++ b/nss/lib/ssl/sslauth.c	2013-07-31 12:35:27.189373289 -0700 | 
| -@@ -219,6 +219,28 @@ SSL_GetClientAuthDataHook(PRFileDesc *s, | 
| +--- a/nss/lib/ssl/sslauth.c	2014-01-03 19:28:03.550814608 -0800 | 
| ++++ b/nss/lib/ssl/sslauth.c	2014-01-03 19:30:52.653579045 -0800 | 
| +@@ -216,6 +216,28 @@ SSL_GetClientAuthDataHook(PRFileDesc *s, | 
| return SECSuccess; | 
| } | 
|  | 
| @@ -247,8 +269,8 @@ | 
| 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	2013-07-31 12:32:29.076760372 -0700 | 
| -+++ b/nss/lib/ssl/ssl.h	2013-07-31 12:35:27.199373436 -0700 | 
| +--- a/nss/lib/ssl/ssl.h	2014-01-03 19:28:03.540814444 -0800 | 
| ++++ b/nss/lib/ssl/ssl.h	2014-01-03 19:30:52.653579045 -0800 | 
| @@ -503,6 +503,48 @@ typedef SECStatus (PR_CALLBACK *SSLGetCl | 
| SSL_IMPORT SECStatus SSL_GetClientAuthDataHook(PRFileDesc *fd, | 
| SSLGetClientAuthData f, void *a); | 
| @@ -299,8 +321,8 @@ | 
| /* | 
| ** 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	2013-07-31 12:31:45.326118409 -0700 | 
| -+++ b/nss/lib/ssl/sslimpl.h	2013-07-31 12:35:27.199373436 -0700 | 
| +--- a/nss/lib/ssl/sslimpl.h	2014-01-03 19:30:40.073373382 -0800 | 
| ++++ b/nss/lib/ssl/sslimpl.h	2014-01-03 19:30:52.653579045 -0800 | 
| @@ -20,6 +20,7 @@ | 
| #include "sslerr.h" | 
| #include "ssl3prot.h" | 
| @@ -325,9 +347,9 @@ | 
| /* 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. | 
| -@@ -444,6 +454,14 @@ typedef SECStatus (*SSLCompressor)(void | 
| -                                    int                  inlen); | 
| - typedef SECStatus (*SSLDestroy)(void *context, PRBool freeit); | 
| +@@ -432,6 +442,14 @@ struct sslGatherStr { | 
| + #define GS_DATA		3 | 
| + #define GS_PAD		4 | 
|  | 
| +#if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(XP_WIN32) | 
| +typedef PCERT_KEY_CONTEXT PlatformKey; | 
| @@ -340,7 +362,7 @@ | 
|  | 
|  | 
| /* | 
| -@@ -896,6 +914,10 @@ struct ssl3StateStr { | 
| +@@ -944,6 +962,10 @@ struct ssl3StateStr { | 
|  | 
| CERTCertificate *    clientCertificate;  /* used by client */ | 
| SECKEYPrivateKey *   clientPrivateKey;   /* used by client */ | 
| @@ -351,7 +373,7 @@ | 
| CERTCertificateList *clientCertChain;    /* used by client */ | 
| PRBool               sendEmptyCert;      /* used by client */ | 
|  | 
| -@@ -1153,6 +1175,10 @@ const unsigned char *  preferredCipher; | 
| +@@ -1205,6 +1227,10 @@ const unsigned char *  preferredCipher; | 
| void                     *authCertificateArg; | 
| SSLGetClientAuthData      getClientAuthData; | 
| void                     *getClientAuthDataArg; | 
| @@ -362,16 +384,8 @@ | 
| SSLSNISocketConfig        sniSocketConfig; | 
| void                     *sniSocketConfigArg; | 
| SSLBadCertHandler         handleBadCert; | 
| -@@ -1737,7 +1763,6 @@ extern void ssl_FreePRSocket(PRFileDesc | 
| -  * various ciphers */ | 
| - extern int ssl3_config_match_init(sslSocket *); | 
| +@@ -1843,6 +1869,26 @@ extern SECStatus ssl_InitSessionCacheLoc | 
|  | 
| -- | 
| - /* Create a new ref counted key pair object from two keys. */ | 
| - extern ssl3KeyPair * ssl3_NewKeyPair( SECKEYPrivateKey * privKey, | 
| -                                       SECKEYPublicKey * pubKey); | 
| -@@ -1777,6 +1802,26 @@ extern SECStatus ssl_InitSessionCacheLoc | 
| - | 
| extern SECStatus ssl_FreeSessionCacheLocks(void); | 
|  | 
| +/***************** platform client auth ****************/ | 
| @@ -398,9 +412,9 @@ | 
| /**************** 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	2013-07-31 12:28:39.283413269 -0700 | 
| -+++ b/nss/lib/ssl/sslsock.c	2013-07-31 12:35:27.199373436 -0700 | 
| -@@ -343,6 +343,10 @@ ssl_DupSocket(sslSocket *os) | 
| +--- a/nss/lib/ssl/sslsock.c	2014-01-03 19:28:03.560814773 -0800 | 
| ++++ b/nss/lib/ssl/sslsock.c	2014-01-03 19:30:52.653579045 -0800 | 
| +@@ -261,6 +261,10 @@ ssl_DupSocket(sslSocket *os) | 
| ss->authCertificateArg    = os->authCertificateArg; | 
| ss->getClientAuthData     = os->getClientAuthData; | 
| ss->getClientAuthDataArg  = os->getClientAuthDataArg; | 
| @@ -411,7 +425,7 @@ | 
| ss->sniSocketConfig       = os->sniSocketConfig; | 
| ss->sniSocketConfigArg    = os->sniSocketConfigArg; | 
| ss->handleBadCert         = os->handleBadCert; | 
| -@@ -1730,6 +1734,12 @@ SSL_ReconfigFD(PRFileDesc *model, PRFile | 
| +@@ -1645,6 +1649,12 @@ SSL_ReconfigFD(PRFileDesc *model, PRFile | 
| ss->getClientAuthData     = sm->getClientAuthData; | 
| if (sm->getClientAuthDataArg) | 
| ss->getClientAuthDataArg  = sm->getClientAuthDataArg; | 
| @@ -424,7 +438,7 @@ | 
| if (sm->sniSocketConfig) | 
| ss->sniSocketConfig       = sm->sniSocketConfig; | 
| if (sm->sniSocketConfigArg) | 
| -@@ -2980,6 +2990,10 @@ ssl_NewSocket(PRBool makeLocks, SSLProto | 
| +@@ -2899,6 +2909,10 @@ ssl_NewSocket(PRBool makeLocks, SSLProto | 
| ss->sniSocketConfig    = NULL; | 
| ss->sniSocketConfigArg = NULL; | 
| ss->getClientAuthData  = NULL; | 
|  |