summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/nss/patches/peercertchain.patch
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/nss/patches/peercertchain.patch')
-rw-r--r--chromium/net/third_party/nss/patches/peercertchain.patch67
1 files changed, 67 insertions, 0 deletions
diff --git a/chromium/net/third_party/nss/patches/peercertchain.patch b/chromium/net/third_party/nss/patches/peercertchain.patch
new file mode 100644
index 00000000000..0ddd316f85f
--- /dev/null
+++ b/chromium/net/third_party/nss/patches/peercertchain.patch
@@ -0,0 +1,67 @@
+diff -pu a/nss/lib/ssl/sslauth.c b/nss/lib/ssl/sslauth.c
+--- a/nss/lib/ssl/sslauth.c 2013-07-31 12:07:10.974699609 -0700
++++ b/nss/lib/ssl/sslauth.c 2013-07-31 12:32:07.996451064 -0700
+@@ -28,6 +28,41 @@ SSL_PeerCertificate(PRFileDesc *fd)
+ }
+
+ /* NEED LOCKS IN HERE. */
++SECStatus
++SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs,
++ unsigned int *numCerts, unsigned int maxNumCerts)
++{
++ sslSocket *ss;
++ 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) {
++ *numCerts = 0;
++ return SECSuccess;
++ }
++
++ *numCerts = 1; /* for the leaf certificate */
++ if (maxNumCerts > 0)
++ certs[0] = CERT_DupCertificate(ss->sec.peerCert);
++
++ for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) {
++ if (*numCerts < maxNumCerts)
++ certs[*numCerts] = CERT_DupCertificate(cur->cert);
++ (*numCerts)++;
++ }
++
++ return SECSuccess;
++}
++
++/* NEED LOCKS IN HERE. */
+ CERTCertificate *
+ SSL_LocalCertificate(PRFileDesc *fd)
+ {
+diff -pu a/nss/lib/ssl/ssl.h b/nss/lib/ssl/ssl.h
+--- a/nss/lib/ssl/ssl.h 2013-07-31 12:07:10.964699464 -0700
++++ b/nss/lib/ssl/ssl.h 2013-07-31 12:32:07.996451065 -0700
+@@ -426,6 +426,18 @@ SSL_SetStapledOCSPResponses(PRFileDesc *
+ 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.