| Index: net/third_party/nss/patches/peercertchain2.patch
 | 
| ===================================================================
 | 
| --- net/third_party/nss/patches/peercertchain2.patch	(revision 0)
 | 
| +++ net/third_party/nss/patches/peercertchain2.patch	(revision 0)
 | 
| @@ -0,0 +1,107 @@
 | 
| +Index: net/third_party/nss/ssl/ssl.h
 | 
| +===================================================================
 | 
| +--- net/third_party/nss/ssl/ssl.h	(revision 225295)
 | 
| ++++ net/third_party/nss/ssl/ssl.h	(working copy)
 | 
| +@@ -434,6 +434,15 @@
 | 
| + */
 | 
| + SSL_IMPORT CERTCertificate *SSL_PeerCertificate(PRFileDesc *fd);
 | 
| + 
 | 
| ++/*
 | 
| ++** Return the certificates presented by the SSL peer. If the SSL peer
 | 
| ++** did not present certificates, return NULL with the
 | 
| ++** SSL_ERROR_NO_CERTIFICATE error. On failure, return NULL with an error
 | 
| ++** code other than SSL_ERROR_NO_CERTIFICATE.
 | 
| ++**	"fd" the socket "file" descriptor
 | 
| ++*/
 | 
| ++SSL_IMPORT CERTCertList *SSL_PeerCertificateChain(PRFileDesc *fd);
 | 
| ++
 | 
| + /* SSL_PeerStapledOCSPResponses returns the OCSP responses that were provided
 | 
| +  * by the TLS server. The return value is a pointer to an internal SECItemArray
 | 
| +  * that contains the returned OCSP responses; it is only valid until the
 | 
| +@@ -463,18 +472,6 @@
 | 
| + 			    SSLKEAType kea);
 | 
| + 
 | 
| + /*
 | 
| +-** Return references to the certificates presented by the SSL peer.
 | 
| +-** |maxNumCerts| must contain the size of the |certs| array. On successful
 | 
| +-** return, |*numCerts| contains the number of certificates available and
 | 
| +-** |certs| will contain references to as many certificates as would fit.
 | 
| +-** Therefore if |*numCerts| contains a value less than or equal to
 | 
| +-** |maxNumCerts|, then all certificates were returned.
 | 
| +-*/
 | 
| +-SSL_IMPORT SECStatus SSL_PeerCertificateChain(
 | 
| +-	PRFileDesc *fd, CERTCertificate **certs,
 | 
| +-	unsigned int *numCerts, unsigned int maxNumCerts);
 | 
| +-
 | 
| +-/*
 | 
| + ** Authenticate certificate hook. Called when a certificate comes in
 | 
| + ** (because of SSL_REQUIRE_CERTIFICATE in SSL_Enable) to authenticate the
 | 
| + ** certificate.
 | 
| +Index: net/third_party/nss/ssl/sslauth.c
 | 
| +===================================================================
 | 
| +--- net/third_party/nss/ssl/sslauth.c	(revision 225295)
 | 
| ++++ net/third_party/nss/ssl/sslauth.c	(working copy)
 | 
| +@@ -28,38 +28,43 @@
 | 
| + }
 | 
| + 
 | 
| + /* NEED LOCKS IN HERE.  */
 | 
| +-SECStatus
 | 
| +-SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs,
 | 
| +-			 unsigned int *numCerts, unsigned int maxNumCerts)
 | 
| ++CERTCertList *
 | 
| ++SSL_PeerCertificateChain(PRFileDesc *fd)
 | 
| + {
 | 
| +     sslSocket *ss;
 | 
| +-    ssl3CertNode* cur;
 | 
| ++    CERTCertList *chain = NULL;
 | 
| ++    CERTCertificate *cert;
 | 
| ++    ssl3CertNode *cur;
 | 
| + 
 | 
| +     ss = ssl_FindSocket(fd);
 | 
| +     if (!ss) {
 | 
| + 	SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain",
 | 
| + 		 SSL_GETPID(), fd));
 | 
| +-	return SECFailure;
 | 
| ++	return NULL;
 | 
| +     }
 | 
| +-    if (!ss->opt.useSecurity)
 | 
| +-	return SECFailure;
 | 
| +-
 | 
| +-    if (ss->sec.peerCert == NULL) {
 | 
| +-      *numCerts = 0;
 | 
| +-      return SECSuccess;
 | 
| ++    if (!ss->opt.useSecurity || !ss->sec.peerCert) {
 | 
| ++	PORT_SetError(SSL_ERROR_NO_CERTIFICATE);
 | 
| ++	return NULL;
 | 
| +     }
 | 
| +-
 | 
| +-    *numCerts = 1;  /* for the leaf certificate */
 | 
| +-    if (maxNumCerts > 0)
 | 
| +-	certs[0] = CERT_DupCertificate(ss->sec.peerCert);
 | 
| +-
 | 
| ++    chain = CERT_NewCertList();
 | 
| ++    if (!chain) {
 | 
| ++	return NULL;
 | 
| ++    }
 | 
| ++    cert = CERT_DupCertificate(ss->sec.peerCert);
 | 
| ++    if (CERT_AddCertToListTail(chain, cert) != SECSuccess) {
 | 
| ++	goto loser;
 | 
| ++    }
 | 
| +     for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) {
 | 
| +-	if (*numCerts < maxNumCerts)
 | 
| +-	    certs[*numCerts] = CERT_DupCertificate(cur->cert);
 | 
| +-	(*numCerts)++;
 | 
| ++	cert = CERT_DupCertificate(cur->cert);
 | 
| ++	if (CERT_AddCertToListTail(chain, cert) != SECSuccess) {
 | 
| ++	    goto loser;
 | 
| ++	}
 | 
| +     }
 | 
| ++    return chain;
 | 
| + 
 | 
| +-    return SECSuccess;
 | 
| ++loser:
 | 
| ++    CERT_DestroyCertList(chain);
 | 
| ++    return NULL;
 | 
| + }
 | 
| + 
 | 
| + /* NEED LOCKS IN HERE.  */
 | 
| 
 |