| 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. */
|
|
|