| Index: net/third_party/nss/patches/peercertchain.patch
|
| ===================================================================
|
| --- net/third_party/nss/patches/peercertchain.patch (revision 0)
|
| +++ net/third_party/nss/patches/peercertchain.patch (revision 0)
|
| @@ -0,0 +1,81 @@
|
| +Index: net/third_party/nss/ssl/ssl.h
|
| +===================================================================
|
| +--- net/third_party/nss/ssl/ssl.h (revision 63749)
|
| ++++ net/third_party/nss/ssl/ssl.h (revision 63750)
|
| +@@ -273,6 +273,17 @@
|
| + SSL_IMPORT CERTCertificate *SSL_PeerCertificate(PRFileDesc *fd);
|
| +
|
| + /*
|
| ++** Return references to the certificates presented by the SSL peer. On entry,
|
| ++** |*certs_size| must contain the size of the |certs| array. On successful
|
| ++** return, |*certs_size| contains the number of certificates available and
|
| ++** |certs| will contain references to as many certificates as would fit.
|
| ++** Therefore if, on exit, |*certs_size| contains a value less than, or equal to,
|
| ++** the entry value then all certificates were returned.
|
| ++*/
|
| ++SSL_IMPORT SECStatus SSL_PeerCertificateChain(
|
| ++ PRFileDesc *fd, CERTCertificate **certs, unsigned int *certs_size);
|
| ++
|
| ++/*
|
| + ** 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 63749)
|
| ++++ net/third_party/nss/ssl/sslauth.c (revision 63750)
|
| +@@ -60,6 +60,42 @@
|
| + }
|
| +
|
| + /* NEED LOCKS IN HERE. */
|
| ++SECStatus
|
| ++SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs,
|
| ++ unsigned int *certsSize)
|
| ++{
|
| ++ sslSocket *ss;
|
| ++ unsigned int inSize = *certsSize;
|
| ++ ssl3CertNode* cur;
|
| ++
|
| ++ ss = ssl_FindSocket(fd);
|
| ++ if (!ss) {
|
| ++ SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain",
|
| ++ SSL_GETPID(), fd));
|
| ++ return SECFailure;
|
| ++ }
|
| ++ if (!ss->opt.useSecurity)
|
| ++ return SECFailure;
|
| ++
|
| ++ if (ss->sec.peerCert == NULL) {
|
| ++ *certsSize = 0;
|
| ++ return SECSuccess;
|
| ++ }
|
| ++
|
| ++ *certsSize = 1; /* for the leaf certificate */
|
| ++ if (inSize > 0)
|
| ++ certs[0] = CERT_DupCertificate(ss->sec.peerCert);
|
| ++
|
| ++ for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) {
|
| ++ if (*certsSize < inSize)
|
| ++ certs[*certsSize] = CERT_DupCertificate(cur->cert);
|
| ++ (*certsSize)++;
|
| ++ }
|
| ++
|
| ++ return SECSuccess;
|
| ++}
|
| ++
|
| ++/* NEED LOCKS IN HERE. */
|
| + CERTCertificate *
|
| + SSL_LocalCertificate(PRFileDesc *fd)
|
| + {
|
| +Index: net/third_party/nss/ssl/ssl.def
|
| +===================================================================
|
| +--- net/third_party/nss/ssl/ssl.def (revision 63749)
|
| ++++ net/third_party/nss/ssl/ssl.def (revision 63750)
|
| +@@ -163,6 +163,7 @@
|
| + ;+ global:
|
| + SSL_GetPredictedServerHelloData;
|
| + SSL_GetSnapStartResult;
|
| ++SSL_PeerCertificateChain;
|
| + SSL_SetPredictedPeerCertificates;
|
| + SSL_SetPredictedServerHelloData;
|
| + SSL_SetSnapStartApplicationData;
|
|
|