| 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/x509_certificate.h" | 5 #include "net/cert/x509_certificate.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/memory/singleton.h" | 8 #include "base/memory/singleton.h" |
| 9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
| 10 #include "base/pickle.h" | 10 #include "base/pickle.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 std::vector<std::string>* fields) { | 61 std::vector<std::string>* fields) { |
| 62 for (int index = -1; | 62 for (int index = -1; |
| 63 (index = X509_NAME_get_index_by_NID(name, nid, index)) != -1;) { | 63 (index = X509_NAME_get_index_by_NID(name, nid, index)) != -1;) { |
| 64 std::string field; | 64 std::string field; |
| 65 if (!x509_util::ParsePrincipalValueByIndex(name, index, &field)) | 65 if (!x509_util::ParsePrincipalValueByIndex(name, index, &field)) |
| 66 break; | 66 break; |
| 67 fields->push_back(field); | 67 fields->push_back(field); |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 void ParsePrincipal(X509Certificate::OSCertHandle cert, | 71 bool ParsePrincipal(X509Certificate::OSCertHandle cert, |
| 72 X509_NAME* x509_name, | 72 X509_NAME* x509_name, |
| 73 CertPrincipal* principal) { | 73 CertPrincipal* principal) { |
| 74 if (!x509_name) | 74 if (!x509_name) |
| 75 return; | 75 return false; |
| 76 | 76 |
| 77 ParsePrincipalValues(x509_name, NID_streetAddress, | 77 ParsePrincipalValues(x509_name, NID_streetAddress, |
| 78 &principal->street_addresses); | 78 &principal->street_addresses); |
| 79 ParsePrincipalValues(x509_name, NID_organizationName, | 79 ParsePrincipalValues(x509_name, NID_organizationName, |
| 80 &principal->organization_names); | 80 &principal->organization_names); |
| 81 ParsePrincipalValues(x509_name, NID_organizationalUnitName, | 81 ParsePrincipalValues(x509_name, NID_organizationalUnitName, |
| 82 &principal->organization_unit_names); | 82 &principal->organization_unit_names); |
| 83 ParsePrincipalValues(x509_name, NID_domainComponent, | 83 ParsePrincipalValues(x509_name, NID_domainComponent, |
| 84 &principal->domain_components); | 84 &principal->domain_components); |
| 85 | 85 |
| 86 x509_util::ParsePrincipalValueByNID(x509_name, NID_commonName, | 86 x509_util::ParsePrincipalValueByNID(x509_name, NID_commonName, |
| 87 &principal->common_name); | 87 &principal->common_name); |
| 88 x509_util::ParsePrincipalValueByNID(x509_name, NID_localityName, | 88 x509_util::ParsePrincipalValueByNID(x509_name, NID_localityName, |
| 89 &principal->locality_name); | 89 &principal->locality_name); |
| 90 x509_util::ParsePrincipalValueByNID(x509_name, NID_stateOrProvinceName, | 90 x509_util::ParsePrincipalValueByNID(x509_name, NID_stateOrProvinceName, |
| 91 &principal->state_or_province_name); | 91 &principal->state_or_province_name); |
| 92 x509_util::ParsePrincipalValueByNID(x509_name, NID_countryName, | 92 x509_util::ParsePrincipalValueByNID(x509_name, NID_countryName, |
| 93 &principal->country_name); | 93 &principal->country_name); |
| 94 return true; |
| 94 } | 95 } |
| 95 | 96 |
| 96 bool ParseSubjectAltName(X509Certificate::OSCertHandle cert, | 97 bool ParseSubjectAltName(X509Certificate::OSCertHandle cert, |
| 97 std::vector<std::string>* dns_names, | 98 std::vector<std::string>* dns_names, |
| 98 std::vector<std::string>* ip_addresses) { | 99 std::vector<std::string>* ip_addresses) { |
| 99 int index = X509_get_ext_by_NID(cert, NID_subject_alt_name, -1); | 100 int index = X509_get_ext_by_NID(cert, NID_subject_alt_name, -1); |
| 100 X509_EXTENSION* alt_name_ext = X509_get_ext(cert, index); | 101 X509_EXTENSION* alt_name_ext = X509_get_ext(cert, index); |
| 101 if (!alt_name_ext) | 102 if (!alt_name_ext) |
| 102 return false; | 103 return false; |
| 103 | 104 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 } | 180 } |
| 180 | 181 |
| 181 // static | 182 // static |
| 182 void X509Certificate::FreeOSCertHandle(OSCertHandle cert_handle) { | 183 void X509Certificate::FreeOSCertHandle(OSCertHandle cert_handle) { |
| 183 // Decrement the ref-count for the cert and, if all references are gone, | 184 // Decrement the ref-count for the cert and, if all references are gone, |
| 184 // free the memory and any application-specific data associated with the | 185 // free the memory and any application-specific data associated with the |
| 185 // certificate. | 186 // certificate. |
| 186 X509_free(cert_handle); | 187 X509_free(cert_handle); |
| 187 } | 188 } |
| 188 | 189 |
| 189 void X509Certificate::Initialize() { | 190 bool X509Certificate::Initialize() { |
| 190 crypto::EnsureOpenSSLInit(); | 191 crypto::EnsureOpenSSLInit(); |
| 191 | 192 |
| 192 ASN1_INTEGER* serial_num = X509_get_serialNumber(cert_handle_); | 193 ASN1_INTEGER* serial_num = X509_get_serialNumber(cert_handle_); |
| 193 if (serial_num) { | 194 if (!serial_num) |
| 194 // ASN1_INTEGERS represent the decoded number, in a format internal to | 195 return false; |
| 195 // OpenSSL. Most notably, this may have leading zeroes stripped off for | 196 // ASN1_INTEGERS represent the decoded number, in a format internal to |
| 196 // numbers whose first byte is >= 0x80. Thus, it is necessary to | 197 // OpenSSL. Most notably, this may have leading zeroes stripped off for |
| 197 // re-encoded the integer back into DER, which is what the interface | 198 // numbers whose first byte is >= 0x80. Thus, it is necessary to |
| 198 // of X509Certificate exposes, to ensure callers get the proper (DER) | 199 // re-encoded the integer back into DER, which is what the interface |
| 199 // value. | 200 // of X509Certificate exposes, to ensure callers get the proper (DER) |
| 200 int bytes_required = i2c_ASN1_INTEGER(serial_num, NULL); | 201 // value. |
| 201 unsigned char* buffer = reinterpret_cast<unsigned char*>( | 202 int bytes_required = i2c_ASN1_INTEGER(serial_num, NULL); |
| 202 base::WriteInto(&serial_number_, bytes_required + 1)); | 203 unsigned char* buffer = reinterpret_cast<unsigned char*>( |
| 203 int bytes_written = i2c_ASN1_INTEGER(serial_num, &buffer); | 204 base::WriteInto(&serial_number_, bytes_required + 1)); |
| 204 DCHECK_EQ(static_cast<size_t>(bytes_written), serial_number_.size()); | 205 int bytes_written = i2c_ASN1_INTEGER(serial_num, &buffer); |
| 205 } | 206 DCHECK_EQ(static_cast<size_t>(bytes_written), serial_number_.size()); |
| 206 | 207 |
| 207 ParsePrincipal(cert_handle_, X509_get_subject_name(cert_handle_), &subject_); | 208 return ( |
| 208 ParsePrincipal(cert_handle_, X509_get_issuer_name(cert_handle_), &issuer_); | 209 ParsePrincipal(cert_handle_, X509_get_subject_name(cert_handle_), |
| 209 x509_util::ParseDate(X509_get_notBefore(cert_handle_), &valid_start_); | 210 &subject_) && |
| 210 x509_util::ParseDate(X509_get_notAfter(cert_handle_), &valid_expiry_); | 211 ParsePrincipal(cert_handle_, X509_get_issuer_name(cert_handle_), |
| 212 &issuer_) && |
| 213 x509_util::ParseDate(X509_get_notBefore(cert_handle_), &valid_start_) && |
| 214 x509_util::ParseDate(X509_get_notAfter(cert_handle_), &valid_expiry_)); |
| 211 } | 215 } |
| 212 | 216 |
| 213 // static | 217 // static |
| 214 void X509Certificate::ResetCertStore() { | 218 void X509Certificate::ResetCertStore() { |
| 215 X509InitSingleton::GetInstance()->ResetCertStore(); | 219 X509InitSingleton::GetInstance()->ResetCertStore(); |
| 216 } | 220 } |
| 217 | 221 |
| 218 // static | 222 // static |
| 219 SHA256HashValue X509Certificate::CalculateFingerprint256(OSCertHandle cert) { | 223 SHA256HashValue X509Certificate::CalculateFingerprint256(OSCertHandle cert) { |
| 220 SHA256HashValue sha256; | 224 SHA256HashValue sha256; |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 bool X509Certificate::IsSelfSigned(OSCertHandle cert_handle) { | 437 bool X509Certificate::IsSelfSigned(OSCertHandle cert_handle) { |
| 434 bssl::UniquePtr<EVP_PKEY> scoped_key(X509_get_pubkey(cert_handle)); | 438 bssl::UniquePtr<EVP_PKEY> scoped_key(X509_get_pubkey(cert_handle)); |
| 435 if (!scoped_key) | 439 if (!scoped_key) |
| 436 return false; | 440 return false; |
| 437 if (!X509_verify(cert_handle, scoped_key.get())) | 441 if (!X509_verify(cert_handle, scoped_key.get())) |
| 438 return false; | 442 return false; |
| 439 return X509_check_issued(cert_handle, cert_handle) == X509_V_OK; | 443 return X509_check_issued(cert_handle, cert_handle) == X509_V_OK; |
| 440 } | 444 } |
| 441 | 445 |
| 442 } // namespace net | 446 } // namespace net |
| OLD | NEW |