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_util.h" | 5 #include "net/cert/x509_util.h" |
6 #include "net/cert/x509_util_openssl.h" | 6 #include "net/cert/x509_util_openssl.h" |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/strings/string_piece.h" | 11 #include "base/strings/string_piece.h" |
12 #include "crypto/openssl_util.h" | 12 #include "crypto/openssl_util.h" |
13 #include "crypto/rsa_private_key.h" | 13 #include "crypto/rsa_private_key.h" |
14 #include "net/cert/x509_cert_types.h" | 14 #include "net/cert/x509_cert_types.h" |
15 | 15 |
16 namespace net { | 16 namespace net { |
17 | 17 |
| 18 namespace { |
| 19 |
| 20 const EVP_MD* HashAlgorithmToEVP(crypto::HMAC::HashAlgorithm alg) { |
| 21 switch (alg) { |
| 22 case crypto::HMAC::SHA1: |
| 23 return EVP_sha1(); |
| 24 case crypto::HMAC::SHA256: |
| 25 return EVP_sha256(); |
| 26 } |
| 27 return NULL; |
| 28 } |
| 29 |
| 30 } // namespace |
| 31 |
18 namespace x509_util { | 32 namespace x509_util { |
19 | 33 |
20 bool IsSupportedValidityRange(base::Time not_valid_before, | 34 bool IsSupportedValidityRange(base::Time not_valid_before, |
21 base::Time not_valid_after) { | 35 base::Time not_valid_after) { |
22 if (not_valid_before > not_valid_after) | 36 if (not_valid_before > not_valid_after) |
23 return false; | 37 return false; |
24 | 38 |
25 // The validity field of a certificate can only encode years 1-9999. | 39 // The validity field of a certificate can only encode years 1-9999. |
26 | 40 |
27 // Compute the base::Time values corresponding to Jan 1st,0001 and | 41 // Compute the base::Time values corresponding to Jan 1st,0001 and |
(...skipping 15 matching lines...) Expand all Loading... |
43 const base::Time kYear10000 = kEpoch + | 57 const base::Time kYear10000 = kEpoch + |
44 base::TimeDelta::FromDays(kDaysFromUnixEpochToYear10000); | 58 base::TimeDelta::FromDays(kDaysFromUnixEpochToYear10000); |
45 | 59 |
46 if (not_valid_before < kYear0001 || not_valid_before >= kYear10000 || | 60 if (not_valid_before < kYear0001 || not_valid_before >= kYear10000 || |
47 not_valid_after < kYear0001 || not_valid_after >= kYear10000) | 61 not_valid_after < kYear0001 || not_valid_after >= kYear10000) |
48 return false; | 62 return false; |
49 | 63 |
50 return true; | 64 return true; |
51 } | 65 } |
52 | 66 |
53 bool CreateDomainBoundCertEC( | 67 bool CreateDomainBoundCertECInternal( |
54 crypto::ECPrivateKey* key, | 68 crypto::ECPrivateKey* key, |
| 69 crypto::HMAC::HashAlgorithm alg, |
55 const std::string& domain, | 70 const std::string& domain, |
56 uint32 serial_number, | 71 uint32 serial_number, |
57 base::Time not_valid_before, | 72 base::Time not_valid_before, |
58 base::Time not_valid_after, | 73 base::Time not_valid_after, |
59 std::string* der_cert) { | 74 std::string* der_cert) { |
60 NOTIMPLEMENTED(); | 75 NOTIMPLEMENTED(); |
61 return false; | 76 return false; |
62 } | 77 } |
63 | 78 |
64 bool CreateSelfSignedCert(crypto::RSAPrivateKey* key, | 79 bool CreateSelfSignedCertInternal(crypto::RSAPrivateKey* key, |
65 const std::string& common_name, | 80 crypto::HMAC::HashAlgorithm alg, |
66 uint32 serial_number, | 81 const std::string& common_name, |
67 base::Time not_valid_before, | 82 uint32 serial_number, |
68 base::Time not_valid_after, | 83 base::Time not_valid_before, |
69 std::string* der_encoded) { | 84 base::Time not_valid_after, |
| 85 std::string* der_encoded) { |
70 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 86 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
71 static const char kCommonNamePrefix[] = "CN="; | 87 static const char kCommonNamePrefix[] = "CN="; |
72 const size_t kCommonNamePrefixLen = sizeof(kCommonNamePrefix) - 1; | 88 const size_t kCommonNamePrefixLen = sizeof(kCommonNamePrefix) - 1; |
73 | 89 |
74 // Put the serial number into an OpenSSL-friendly object. | 90 // Put the serial number into an OpenSSL-friendly object. |
75 crypto::ScopedOpenSSL<ASN1_INTEGER, ASN1_INTEGER_free> asn1_serial( | 91 crypto::ScopedOpenSSL<ASN1_INTEGER, ASN1_INTEGER_free> asn1_serial( |
76 ASN1_INTEGER_new()); | 92 ASN1_INTEGER_new()); |
77 if (!asn1_serial.get() || | 93 if (!asn1_serial.get() || |
78 !ASN1_INTEGER_set(asn1_serial.get(), static_cast<long>(serial_number))) { | 94 !ASN1_INTEGER_set(asn1_serial.get(), static_cast<long>(serial_number))) { |
79 LOG(ERROR) << "Invalid serial number " << serial_number; | 95 LOG(ERROR) << "Invalid serial number " << serial_number; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 !X509_set_pubkey(cert.get(), key->key()) || | 148 !X509_set_pubkey(cert.get(), key->key()) || |
133 !X509_set_serialNumber(cert.get(), asn1_serial.get()) || | 149 !X509_set_serialNumber(cert.get(), asn1_serial.get()) || |
134 !X509_set_notBefore(cert.get(), asn1_not_before_time.get()) || | 150 !X509_set_notBefore(cert.get(), asn1_not_before_time.get()) || |
135 !X509_set_notAfter(cert.get(), asn1_not_after_time.get()) || | 151 !X509_set_notAfter(cert.get(), asn1_not_after_time.get()) || |
136 !X509_set_subject_name(cert.get(), name.get()) || | 152 !X509_set_subject_name(cert.get(), name.get()) || |
137 !X509_set_issuer_name(cert.get(), name.get())) { | 153 !X509_set_issuer_name(cert.get(), name.get())) { |
138 LOG(ERROR) << "Could not create certificate"; | 154 LOG(ERROR) << "Could not create certificate"; |
139 return false; | 155 return false; |
140 } | 156 } |
141 | 157 |
| 158 // Get the message digest algorithm |
| 159 const EVP_MD* md = HashAlgorithmToEVP(alg); |
| 160 if (!md) { |
| 161 LOG(ERROR) << "Unrecognized hash algorithm."; |
| 162 return false; |
| 163 } |
| 164 |
142 // Sign it with the private key. | 165 // Sign it with the private key. |
143 if (!X509_sign(cert.get(), key->key(), EVP_sha1())) { | 166 if (!X509_sign(cert.get(), key->key(), md)) { |
144 LOG(ERROR) << "Could not sign certificate with key."; | 167 LOG(ERROR) << "Could not sign certificate with key."; |
145 return false; | 168 return false; |
146 } | 169 } |
147 | 170 |
148 // Convert it into a DER-encoded string copied to |der_encoded|. | 171 // Convert it into a DER-encoded string copied to |der_encoded|. |
149 int der_data_length = i2d_X509(cert.get(), NULL); | 172 int der_data_length = i2d_X509(cert.get(), NULL); |
150 if (der_data_length < 0) | 173 if (der_data_length < 0) |
151 return false; | 174 return false; |
152 | 175 |
153 der_encoded->resize(static_cast<size_t>(der_data_length)); | 176 der_encoded->resize(static_cast<size_t>(der_data_length)); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 x509_time->length); | 234 x509_time->length); |
212 | 235 |
213 CertDateFormat format = x509_time->type == V_ASN1_UTCTIME ? | 236 CertDateFormat format = x509_time->type == V_ASN1_UTCTIME ? |
214 CERT_DATE_FORMAT_UTC_TIME : CERT_DATE_FORMAT_GENERALIZED_TIME; | 237 CERT_DATE_FORMAT_UTC_TIME : CERT_DATE_FORMAT_GENERALIZED_TIME; |
215 return ParseCertificateDate(str_date, format, time); | 238 return ParseCertificateDate(str_date, format, time); |
216 } | 239 } |
217 | 240 |
218 } // namespace x509_util | 241 } // namespace x509_util |
219 | 242 |
220 } // namespace net | 243 } // namespace net |
OLD | NEW |