OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 #include "cert.h" | 4 #include "cert.h" |
5 #include "secitem.h" | 5 #include "secitem.h" |
6 #include "ssl.h" | 6 #include "ssl.h" |
7 #include "sslimpl.h" | 7 #include "sslimpl.h" |
8 #include "sslproto.h" | 8 #include "sslproto.h" |
9 #include "pk11func.h" | 9 #include "pk11func.h" |
10 #include "ocsp.h" | 10 #include "ocsp.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 SSL_GETPID(), fd)); | 21 SSL_GETPID(), fd)); |
22 return 0; | 22 return 0; |
23 } | 23 } |
24 if (ss->opt.useSecurity && ss->sec.peerCert) { | 24 if (ss->opt.useSecurity && ss->sec.peerCert) { |
25 return CERT_DupCertificate(ss->sec.peerCert); | 25 return CERT_DupCertificate(ss->sec.peerCert); |
26 } | 26 } |
27 return 0; | 27 return 0; |
28 } | 28 } |
29 | 29 |
30 /* NEED LOCKS IN HERE. */ | 30 /* NEED LOCKS IN HERE. */ |
31 SECStatus | 31 CERTCertList * |
32 SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs, | 32 SSL_PeerCertificateChain(PRFileDesc *fd) |
33 » » » unsigned int *numCerts, unsigned int maxNumCerts) | |
34 { | 33 { |
35 sslSocket *ss; | 34 sslSocket *ss; |
36 ssl3CertNode* cur; | 35 CERTCertList *chain = NULL; |
| 36 CERTCertificate *cert; |
| 37 ssl3CertNode *cur; |
37 | 38 |
38 ss = ssl_FindSocket(fd); | 39 ss = ssl_FindSocket(fd); |
39 if (!ss) { | 40 if (!ss) { |
40 SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain", | 41 SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain", |
41 SSL_GETPID(), fd)); | 42 SSL_GETPID(), fd)); |
42 » return SECFailure; | 43 » return NULL; |
43 } | 44 } |
44 if (!ss->opt.useSecurity) | 45 if (!ss->opt.useSecurity || !ss->sec.peerCert) { |
45 » return SECFailure; | 46 » PORT_SetError(SSL_ERROR_NO_CERTIFICATE); |
| 47 » return NULL; |
| 48 } |
| 49 chain = CERT_NewCertList(); |
| 50 if (!chain) { |
| 51 » return NULL; |
| 52 } |
| 53 cert = CERT_DupCertificate(ss->sec.peerCert); |
| 54 if (CERT_AddCertToListTail(chain, cert) != SECSuccess) { |
| 55 » goto loser; |
| 56 } |
| 57 for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) { |
| 58 » cert = CERT_DupCertificate(cur->cert); |
| 59 » if (CERT_AddCertToListTail(chain, cert) != SECSuccess) { |
| 60 » goto loser; |
| 61 » } |
| 62 } |
| 63 return chain; |
46 | 64 |
47 if (ss->sec.peerCert == NULL) { | 65 loser: |
48 *numCerts = 0; | 66 CERT_DestroyCertList(chain); |
49 return SECSuccess; | 67 return NULL; |
50 } | |
51 | |
52 *numCerts = 1; /* for the leaf certificate */ | |
53 if (maxNumCerts > 0) | |
54 » certs[0] = CERT_DupCertificate(ss->sec.peerCert); | |
55 | |
56 for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) { | |
57 » if (*numCerts < maxNumCerts) | |
58 » certs[*numCerts] = CERT_DupCertificate(cur->cert); | |
59 » (*numCerts)++; | |
60 } | |
61 | |
62 return SECSuccess; | |
63 } | 68 } |
64 | 69 |
65 /* NEED LOCKS IN HERE. */ | 70 /* NEED LOCKS IN HERE. */ |
66 CERTCertificate * | 71 CERTCertificate * |
67 SSL_LocalCertificate(PRFileDesc *fd) | 72 SSL_LocalCertificate(PRFileDesc *fd) |
68 { | 73 { |
69 sslSocket *ss; | 74 sslSocket *ss; |
70 | 75 |
71 ss = ssl_FindSocket(fd); | 76 ss = ssl_FindSocket(fd); |
72 if (!ss) { | 77 if (!ss) { |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 hostname = ss->url; | 328 hostname = ss->url; |
324 if (hostname && hostname[0]) | 329 if (hostname && hostname[0]) |
325 rv = CERT_VerifyCertName(ss->sec.peerCert, hostname); | 330 rv = CERT_VerifyCertName(ss->sec.peerCert, hostname); |
326 else | 331 else |
327 rv = SECFailure; | 332 rv = SECFailure; |
328 if (rv != SECSuccess) | 333 if (rv != SECSuccess) |
329 PORT_SetError(SSL_ERROR_BAD_CERT_DOMAIN); | 334 PORT_SetError(SSL_ERROR_BAD_CERT_DOMAIN); |
330 | 335 |
331 return rv; | 336 return rv; |
332 } | 337 } |
OLD | NEW |