OLD | NEW |
(Empty) | |
| 1 Index: net/third_party/nss/ssl/ssl.h |
| 2 =================================================================== |
| 3 --- net/third_party/nss/ssl/ssl.h (revision 225295) |
| 4 +++ net/third_party/nss/ssl/ssl.h (working copy) |
| 5 @@ -434,6 +434,15 @@ |
| 6 */ |
| 7 SSL_IMPORT CERTCertificate *SSL_PeerCertificate(PRFileDesc *fd); |
| 8 |
| 9 +/* |
| 10 +** Return the certificates presented by the SSL peer. If the SSL peer |
| 11 +** did not present certificates, return NULL with the |
| 12 +** SSL_ERROR_NO_CERTIFICATE error. On failure, return NULL with an error |
| 13 +** code other than SSL_ERROR_NO_CERTIFICATE. |
| 14 +** "fd" the socket "file" descriptor |
| 15 +*/ |
| 16 +SSL_IMPORT CERTCertList *SSL_PeerCertificateChain(PRFileDesc *fd); |
| 17 + |
| 18 /* SSL_PeerStapledOCSPResponses returns the OCSP responses that were provided |
| 19 * by the TLS server. The return value is a pointer to an internal SECItemArray |
| 20 * that contains the returned OCSP responses; it is only valid until the |
| 21 @@ -463,18 +472,6 @@ |
| 22 SSLKEAType kea); |
| 23 |
| 24 /* |
| 25 -** Return references to the certificates presented by the SSL peer. |
| 26 -** |maxNumCerts| must contain the size of the |certs| array. On successful |
| 27 -** return, |*numCerts| contains the number of certificates available and |
| 28 -** |certs| will contain references to as many certificates as would fit. |
| 29 -** Therefore if |*numCerts| contains a value less than or equal to |
| 30 -** |maxNumCerts|, then all certificates were returned. |
| 31 -*/ |
| 32 -SSL_IMPORT SECStatus SSL_PeerCertificateChain( |
| 33 - PRFileDesc *fd, CERTCertificate **certs, |
| 34 - unsigned int *numCerts, unsigned int maxNumCerts); |
| 35 - |
| 36 -/* |
| 37 ** Authenticate certificate hook. Called when a certificate comes in |
| 38 ** (because of SSL_REQUIRE_CERTIFICATE in SSL_Enable) to authenticate the |
| 39 ** certificate. |
| 40 Index: net/third_party/nss/ssl/sslauth.c |
| 41 =================================================================== |
| 42 --- net/third_party/nss/ssl/sslauth.c (revision 225295) |
| 43 +++ net/third_party/nss/ssl/sslauth.c (working copy) |
| 44 @@ -28,38 +28,43 @@ |
| 45 } |
| 46 |
| 47 /* NEED LOCKS IN HERE. */ |
| 48 -SECStatus |
| 49 -SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs, |
| 50 - unsigned int *numCerts, unsigned int maxNumCerts) |
| 51 +CERTCertList * |
| 52 +SSL_PeerCertificateChain(PRFileDesc *fd) |
| 53 { |
| 54 sslSocket *ss; |
| 55 - ssl3CertNode* cur; |
| 56 + CERTCertList *chain = NULL; |
| 57 + CERTCertificate *cert; |
| 58 + ssl3CertNode *cur; |
| 59 |
| 60 ss = ssl_FindSocket(fd); |
| 61 if (!ss) { |
| 62 SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain", |
| 63 SSL_GETPID(), fd)); |
| 64 - return SECFailure; |
| 65 + return NULL; |
| 66 } |
| 67 - if (!ss->opt.useSecurity) |
| 68 - return SECFailure; |
| 69 - |
| 70 - if (ss->sec.peerCert == NULL) { |
| 71 - *numCerts = 0; |
| 72 - return SECSuccess; |
| 73 + if (!ss->opt.useSecurity || !ss->sec.peerCert) { |
| 74 + PORT_SetError(SSL_ERROR_NO_CERTIFICATE); |
| 75 + return NULL; |
| 76 } |
| 77 - |
| 78 - *numCerts = 1; /* for the leaf certificate */ |
| 79 - if (maxNumCerts > 0) |
| 80 - certs[0] = CERT_DupCertificate(ss->sec.peerCert); |
| 81 - |
| 82 + chain = CERT_NewCertList(); |
| 83 + if (!chain) { |
| 84 + return NULL; |
| 85 + } |
| 86 + cert = CERT_DupCertificate(ss->sec.peerCert); |
| 87 + if (CERT_AddCertToListTail(chain, cert) != SECSuccess) { |
| 88 + goto loser; |
| 89 + } |
| 90 for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) { |
| 91 - if (*numCerts < maxNumCerts) |
| 92 - certs[*numCerts] = CERT_DupCertificate(cur->cert); |
| 93 - (*numCerts)++; |
| 94 + cert = CERT_DupCertificate(cur->cert); |
| 95 + if (CERT_AddCertToListTail(chain, cert) != SECSuccess) { |
| 96 + goto loser; |
| 97 + } |
| 98 } |
| 99 + return chain; |
| 100 |
| 101 - return SECSuccess; |
| 102 +loser: |
| 103 + CERT_DestroyCertList(chain); |
| 104 + return NULL; |
| 105 } |
| 106 |
| 107 /* NEED LOCKS IN HERE. */ |
OLD | NEW |