| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/cert/cert_verify_proc_nss.h" | 5 #include "net/cert/cert_verify_proc_nss.h" |
| 6 | 6 |
| 7 #include <cert.h> | 7 #include <cert.h> |
| 8 #include <nss.h> | 8 #include <nss.h> |
| 9 #include <prerror.h> | 9 #include <prerror.h> |
| 10 #include <secerr.h> | 10 #include <secerr.h> |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 // Map PORT_GetError() return values to our cert status flags. | 145 // Map PORT_GetError() return values to our cert status flags. |
| 146 CertStatus MapCertErrorToCertStatus(int err) { | 146 CertStatus MapCertErrorToCertStatus(int err) { |
| 147 int net_error = MapSecurityError(err); | 147 int net_error = MapSecurityError(err); |
| 148 return MapNetErrorToCertStatus(net_error); | 148 return MapNetErrorToCertStatus(net_error); |
| 149 } | 149 } |
| 150 | 150 |
| 151 // Saves some information about the certificate chain cert_list in | 151 // Saves some information about the certificate chain cert_list in |
| 152 // *verify_result. The caller MUST initialize *verify_result before calling | 152 // *verify_result. The caller MUST initialize *verify_result before calling |
| 153 // this function. | 153 // this function. |
| 154 // Note that cert_list[0] is the end entity certificate. | 154 // Note that cert_list[0] is the end entity certificate. |
| 155 void GetCertChainInfo(CERTCertList* cert_list, | 155 bool GetCertChainInfo(CERTCertList* cert_list, |
| 156 CERTCertificate* root_cert, | 156 CERTCertificate* root_cert, |
| 157 CertVerifyResult* verify_result) { | 157 CertVerifyResult* verify_result) { |
| 158 DCHECK(cert_list); | 158 DCHECK(cert_list); |
| 159 | 159 |
| 160 CERTCertificate* verified_cert = NULL; | 160 CERTCertificate* verified_cert = NULL; |
| 161 std::vector<CERTCertificate*> verified_chain; | 161 std::vector<CERTCertificate*> verified_chain; |
| 162 size_t i = 0; | 162 size_t i = 0; |
| 163 for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); | 163 for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); |
| 164 !CERT_LIST_END(node, cert_list); | 164 !CERT_LIST_END(node, cert_list); |
| 165 node = CERT_LIST_NEXT(node), ++i) { | 165 node = CERT_LIST_NEXT(node), ++i) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 190 } | 190 } |
| 191 } | 191 } |
| 192 verified_chain.push_back(node->cert); | 192 verified_chain.push_back(node->cert); |
| 193 } | 193 } |
| 194 } | 194 } |
| 195 | 195 |
| 196 if (root_cert) | 196 if (root_cert) |
| 197 verified_chain.push_back(root_cert); | 197 verified_chain.push_back(root_cert); |
| 198 verify_result->verified_cert = | 198 verify_result->verified_cert = |
| 199 X509Certificate::CreateFromHandle(verified_cert, verified_chain); | 199 X509Certificate::CreateFromHandle(verified_cert, verified_chain); |
| 200 return !!verify_result->verified_cert; |
| 200 } | 201 } |
| 201 | 202 |
| 202 // IsKnownRoot returns true if the given certificate is one that we believe | 203 // IsKnownRoot returns true if the given certificate is one that we believe |
| 203 // is a standard (as opposed to user-installed) root. | 204 // is a standard (as opposed to user-installed) root. |
| 204 bool IsKnownRoot(CERTCertificate* root) { | 205 bool IsKnownRoot(CERTCertificate* root) { |
| 205 if (!root || !root->slot) | 206 if (!root || !root->slot) |
| 206 return false; | 207 return false; |
| 207 | 208 |
| 208 // This magic name is taken from | 209 // This magic name is taken from |
| 209 // http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/security/nss/lib/ckfw/b
uiltins/constants.c&rev=1.13&mark=86,89#79 | 210 // http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/security/nss/lib/ckfw/b
uiltins/constants.c&rev=1.13&mark=86,89#79 |
| (...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 cvout[cvout_trust_anchor_index].value.pointer.cert, | 873 cvout[cvout_trust_anchor_index].value.pointer.cert, |
| 873 &verify_result->public_key_hashes); | 874 &verify_result->public_key_hashes); |
| 874 | 875 |
| 875 verify_result->is_issued_by_known_root = | 876 verify_result->is_issued_by_known_root = |
| 876 IsKnownRoot(cvout[cvout_trust_anchor_index].value.pointer.cert); | 877 IsKnownRoot(cvout[cvout_trust_anchor_index].value.pointer.cert); |
| 877 verify_result->is_issued_by_additional_trust_anchor = | 878 verify_result->is_issued_by_additional_trust_anchor = |
| 878 IsAdditionalTrustAnchor( | 879 IsAdditionalTrustAnchor( |
| 879 trust_anchors.get(), | 880 trust_anchors.get(), |
| 880 cvout[cvout_trust_anchor_index].value.pointer.cert); | 881 cvout[cvout_trust_anchor_index].value.pointer.cert); |
| 881 | 882 |
| 882 GetCertChainInfo(cvout[cvout_cert_list_index].value.pointer.chain, | 883 if (!GetCertChainInfo(cvout[cvout_cert_list_index].value.pointer.chain, |
| 883 cvout[cvout_trust_anchor_index].value.pointer.cert, | 884 cvout[cvout_trust_anchor_index].value.pointer.cert, |
| 884 verify_result); | 885 verify_result)) |
| 886 return ERR_CERT_INVALID; |
| 885 } | 887 } |
| 886 | 888 |
| 887 CRLSetResult crl_set_result = kCRLSetUnknown; | 889 CRLSetResult crl_set_result = kCRLSetUnknown; |
| 888 if (crl_set) { | 890 if (crl_set) { |
| 889 if (status == SECSuccess) { | 891 if (status == SECSuccess) { |
| 890 // Reverify the returned chain; NSS should have already called | 892 // Reverify the returned chain; NSS should have already called |
| 891 // CheckChainRevocationWithCRLSet prior to returning, but given the | 893 // CheckChainRevocationWithCRLSet prior to returning, but given the |
| 892 // edge cases (self-signed certs that are trusted; cached chains; | 894 // edge cases (self-signed certs that are trusted; cached chains; |
| 893 // unreadable code), this is more about defense in depth than | 895 // unreadable code), this is more about defense in depth than |
| 894 // functional necessity. | 896 // functional necessity. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 CRLSet* crl_set, | 956 CRLSet* crl_set, |
| 955 const CertificateList& additional_trust_anchors, | 957 const CertificateList& additional_trust_anchors, |
| 956 CertVerifyResult* verify_result) { | 958 CertVerifyResult* verify_result) { |
| 957 return VerifyInternalImpl(cert, hostname, ocsp_response, flags, crl_set, | 959 return VerifyInternalImpl(cert, hostname, ocsp_response, flags, crl_set, |
| 958 additional_trust_anchors, | 960 additional_trust_anchors, |
| 959 NULL, // chain_verify_callback | 961 NULL, // chain_verify_callback |
| 960 verify_result); | 962 verify_result); |
| 961 } | 963 } |
| 962 | 964 |
| 963 } // namespace net | 965 } // namespace net |
| OLD | NEW |