| 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/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/pickle.h" | 10 #include "base/pickle.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 // | 39 // |
| 40 // For fingerprint | 40 // For fingerprint |
| 41 // $ openssl x509 -inform DER -fingerprint -noout < /tmp/host.der | 41 // $ openssl x509 -inform DER -fingerprint -noout < /tmp/host.der |
| 42 | 42 |
| 43 // For valid_start, valid_expiry | 43 // For valid_start, valid_expiry |
| 44 // $ openssl x509 -inform DER -text -noout < /tmp/host.der | | 44 // $ openssl x509 -inform DER -text -noout < /tmp/host.der | |
| 45 // grep -A 2 Validity | 45 // grep -A 2 Validity |
| 46 // $ date +%s -d '<date str>' | 46 // $ date +%s -d '<date str>' |
| 47 | 47 |
| 48 // Google's cert. | 48 // Google's cert. |
| 49 uint8 google_fingerprint[] = { | 49 uint8 google_fingerprint[] = {0xab, 0xbe, 0x5e, 0xb4, 0x93, 0x88, 0x4e, |
| 50 0xab, 0xbe, 0x5e, 0xb4, 0x93, 0x88, 0x4e, 0xe4, 0x60, 0xc6, 0xef, 0xf8, | 50 0xe4, 0x60, 0xc6, 0xef, 0xf8, 0xea, 0xd4, |
| 51 0xea, 0xd4, 0xb1, 0x55, 0x4b, 0xc9, 0x59, 0x3c | 51 0xb1, 0x55, 0x4b, 0xc9, 0x59, 0x3c}; |
| 52 }; | |
| 53 | 52 |
| 54 // webkit.org's cert. | 53 // webkit.org's cert. |
| 55 uint8 webkit_fingerprint[] = { | 54 uint8 webkit_fingerprint[] = {0xa1, 0x4a, 0x94, 0x46, 0x22, 0x8e, 0x70, |
| 56 0xa1, 0x4a, 0x94, 0x46, 0x22, 0x8e, 0x70, 0x66, 0x2b, 0x94, 0xf9, 0xf8, | 55 0x66, 0x2b, 0x94, 0xf9, 0xf8, 0x57, 0x83, |
| 57 0x57, 0x83, 0x2d, 0xa2, 0xff, 0xbc, 0x84, 0xc2 | 56 0x2d, 0xa2, 0xff, 0xbc, 0x84, 0xc2}; |
| 58 }; | |
| 59 | 57 |
| 60 // thawte.com's cert (it's EV-licious!). | 58 // thawte.com's cert (it's EV-licious!). |
| 61 uint8 thawte_fingerprint[] = { | 59 uint8 thawte_fingerprint[] = {0x85, 0x04, 0x2d, 0xfd, 0x2b, 0x0e, 0xc6, |
| 62 0x85, 0x04, 0x2d, 0xfd, 0x2b, 0x0e, 0xc6, 0xc8, 0xaf, 0x2d, 0x77, 0xd6, | 60 0xc8, 0xaf, 0x2d, 0x77, 0xd6, 0xa1, 0x3a, |
| 63 0xa1, 0x3a, 0x64, 0x04, 0x27, 0x90, 0x97, 0x37 | 61 0x64, 0x04, 0x27, 0x90, 0x97, 0x37}; |
| 64 }; | |
| 65 | 62 |
| 66 // A certificate for https://www.unosoft.hu/, whose AIA extension contains | 63 // A certificate for https://www.unosoft.hu/, whose AIA extension contains |
| 67 // an LDAP URL without a host name. | 64 // an LDAP URL without a host name. |
| 68 uint8 unosoft_hu_fingerprint[] = { | 65 uint8 unosoft_hu_fingerprint[] = {0x32, 0xff, 0xe3, 0xbe, 0x2c, 0x3b, 0xc7, |
| 69 0x32, 0xff, 0xe3, 0xbe, 0x2c, 0x3b, 0xc7, 0xca, 0xbf, 0x2d, 0x64, 0xbd, | 66 0xca, 0xbf, 0x2d, 0x64, 0xbd, 0x25, 0x66, |
| 70 0x25, 0x66, 0xf2, 0xec, 0x8b, 0x0f, 0xbf, 0xd8 | 67 0xf2, 0xec, 0x8b, 0x0f, 0xbf, 0xd8}; |
| 71 }; | |
| 72 | 68 |
| 73 // The fingerprint of the Google certificate used in the parsing tests, | 69 // The fingerprint of the Google certificate used in the parsing tests, |
| 74 // which is newer than the one included in the x509_certificate_data.h | 70 // which is newer than the one included in the x509_certificate_data.h |
| 75 uint8 google_parse_fingerprint[] = { | 71 uint8 google_parse_fingerprint[] = {0x40, 0x50, 0x62, 0xe5, 0xbe, 0xfd, 0xe4, |
| 76 0x40, 0x50, 0x62, 0xe5, 0xbe, 0xfd, 0xe4, 0xaf, 0x97, 0xe9, 0x38, 0x2a, | 72 0xaf, 0x97, 0xe9, 0x38, 0x2a, 0xf1, 0x6c, |
| 77 0xf1, 0x6c, 0xc8, 0x7c, 0x8f, 0xb7, 0xc4, 0xe2 | 73 0xc8, 0x7c, 0x8f, 0xb7, 0xc4, 0xe2}; |
| 78 }; | |
| 79 | 74 |
| 80 // The fingerprint for the Thawte SGC certificate | 75 // The fingerprint for the Thawte SGC certificate |
| 81 uint8 thawte_parse_fingerprint[] = { | 76 uint8 thawte_parse_fingerprint[] = {0xec, 0x07, 0x10, 0x03, 0xd8, 0xf5, 0xa3, |
| 82 0xec, 0x07, 0x10, 0x03, 0xd8, 0xf5, 0xa3, 0x7f, 0x42, 0xc4, 0x55, 0x7f, | 77 0x7f, 0x42, 0xc4, 0x55, 0x7f, 0x65, 0x6a, |
| 83 0x65, 0x6a, 0xae, 0x86, 0x65, 0xfa, 0x4b, 0x02 | 78 0xae, 0x86, 0x65, 0xfa, 0x4b, 0x02}; |
| 84 }; | |
| 85 | 79 |
| 86 // Dec 18 00:00:00 2009 GMT | 80 // Dec 18 00:00:00 2009 GMT |
| 87 const double kGoogleParseValidFrom = 1261094400; | 81 const double kGoogleParseValidFrom = 1261094400; |
| 88 // Dec 18 23:59:59 2011 GMT | 82 // Dec 18 23:59:59 2011 GMT |
| 89 const double kGoogleParseValidTo = 1324252799; | 83 const double kGoogleParseValidTo = 1324252799; |
| 90 | 84 |
| 91 void CheckGoogleCert(const scoped_refptr<X509Certificate>& google_cert, | 85 void CheckGoogleCert(const scoped_refptr<X509Certificate>& google_cert, |
| 92 uint8* expected_fingerprint, | 86 uint8* expected_fingerprint, |
| 93 double valid_from, double valid_to) { | 87 double valid_from, |
| 88 double valid_to) { |
| 94 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); | 89 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); |
| 95 | 90 |
| 96 const CertPrincipal& subject = google_cert->subject(); | 91 const CertPrincipal& subject = google_cert->subject(); |
| 97 EXPECT_EQ("www.google.com", subject.common_name); | 92 EXPECT_EQ("www.google.com", subject.common_name); |
| 98 EXPECT_EQ("Mountain View", subject.locality_name); | 93 EXPECT_EQ("Mountain View", subject.locality_name); |
| 99 EXPECT_EQ("California", subject.state_or_province_name); | 94 EXPECT_EQ("California", subject.state_or_province_name); |
| 100 EXPECT_EQ("US", subject.country_name); | 95 EXPECT_EQ("US", subject.country_name); |
| 101 EXPECT_EQ(0U, subject.street_addresses.size()); | 96 EXPECT_EQ(0U, subject.street_addresses.size()); |
| 102 ASSERT_EQ(1U, subject.organization_names.size()); | 97 ASSERT_EQ(1U, subject.organization_names.size()); |
| 103 EXPECT_EQ("Google Inc", subject.organization_names[0]); | 98 EXPECT_EQ("Google Inc", subject.organization_names[0]); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 126 for (size_t i = 0; i < 20; ++i) | 121 for (size_t i = 0; i < 20; ++i) |
| 127 EXPECT_EQ(expected_fingerprint[i], fingerprint.data[i]); | 122 EXPECT_EQ(expected_fingerprint[i], fingerprint.data[i]); |
| 128 | 123 |
| 129 std::vector<std::string> dns_names; | 124 std::vector<std::string> dns_names; |
| 130 google_cert->GetDNSNames(&dns_names); | 125 google_cert->GetDNSNames(&dns_names); |
| 131 ASSERT_EQ(1U, dns_names.size()); | 126 ASSERT_EQ(1U, dns_names.size()); |
| 132 EXPECT_EQ("www.google.com", dns_names[0]); | 127 EXPECT_EQ("www.google.com", dns_names[0]); |
| 133 } | 128 } |
| 134 | 129 |
| 135 TEST(X509CertificateTest, GoogleCertParsing) { | 130 TEST(X509CertificateTest, GoogleCertParsing) { |
| 136 scoped_refptr<X509Certificate> google_cert( | 131 scoped_refptr<X509Certificate> google_cert(X509Certificate::CreateFromBytes( |
| 137 X509Certificate::CreateFromBytes( | 132 reinterpret_cast<const char*>(google_der), sizeof(google_der))); |
| 138 reinterpret_cast<const char*>(google_der), sizeof(google_der))); | |
| 139 | 133 |
| 140 CheckGoogleCert(google_cert, google_fingerprint, | 134 CheckGoogleCert(google_cert, |
| 135 google_fingerprint, |
| 141 1238192407, // Mar 27 22:20:07 2009 GMT | 136 1238192407, // Mar 27 22:20:07 2009 GMT |
| 142 1269728407); // Mar 27 22:20:07 2010 GMT | 137 1269728407); // Mar 27 22:20:07 2010 GMT |
| 143 } | 138 } |
| 144 | 139 |
| 145 TEST(X509CertificateTest, WebkitCertParsing) { | 140 TEST(X509CertificateTest, WebkitCertParsing) { |
| 146 scoped_refptr<X509Certificate> webkit_cert(X509Certificate::CreateFromBytes( | 141 scoped_refptr<X509Certificate> webkit_cert(X509Certificate::CreateFromBytes( |
| 147 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); | 142 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); |
| 148 | 143 |
| 149 ASSERT_NE(static_cast<X509Certificate*>(NULL), webkit_cert); | 144 ASSERT_NE(static_cast<X509Certificate*>(NULL), webkit_cert); |
| 150 | 145 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 162 const CertPrincipal& issuer = webkit_cert->issuer(); | 157 const CertPrincipal& issuer = webkit_cert->issuer(); |
| 163 EXPECT_EQ("Go Daddy Secure Certification Authority", issuer.common_name); | 158 EXPECT_EQ("Go Daddy Secure Certification Authority", issuer.common_name); |
| 164 EXPECT_EQ("Scottsdale", issuer.locality_name); | 159 EXPECT_EQ("Scottsdale", issuer.locality_name); |
| 165 EXPECT_EQ("Arizona", issuer.state_or_province_name); | 160 EXPECT_EQ("Arizona", issuer.state_or_province_name); |
| 166 EXPECT_EQ("US", issuer.country_name); | 161 EXPECT_EQ("US", issuer.country_name); |
| 167 EXPECT_EQ(0U, issuer.street_addresses.size()); | 162 EXPECT_EQ(0U, issuer.street_addresses.size()); |
| 168 ASSERT_EQ(1U, issuer.organization_names.size()); | 163 ASSERT_EQ(1U, issuer.organization_names.size()); |
| 169 EXPECT_EQ("GoDaddy.com, Inc.", issuer.organization_names[0]); | 164 EXPECT_EQ("GoDaddy.com, Inc.", issuer.organization_names[0]); |
| 170 ASSERT_EQ(1U, issuer.organization_unit_names.size()); | 165 ASSERT_EQ(1U, issuer.organization_unit_names.size()); |
| 171 EXPECT_EQ("http://certificates.godaddy.com/repository", | 166 EXPECT_EQ("http://certificates.godaddy.com/repository", |
| 172 issuer.organization_unit_names[0]); | 167 issuer.organization_unit_names[0]); |
| 173 EXPECT_EQ(0U, issuer.domain_components.size()); | 168 EXPECT_EQ(0U, issuer.domain_components.size()); |
| 174 | 169 |
| 175 // Use DoubleT because its epoch is the same on all platforms | 170 // Use DoubleT because its epoch is the same on all platforms |
| 176 const Time& valid_start = webkit_cert->valid_start(); | 171 const Time& valid_start = webkit_cert->valid_start(); |
| 177 EXPECT_EQ(1205883319, valid_start.ToDoubleT()); // Mar 18 23:35:19 2008 GMT | 172 EXPECT_EQ(1205883319, valid_start.ToDoubleT()); // Mar 18 23:35:19 2008 GMT |
| 178 | 173 |
| 179 const Time& valid_expiry = webkit_cert->valid_expiry(); | 174 const Time& valid_expiry = webkit_cert->valid_expiry(); |
| 180 EXPECT_EQ(1300491319, valid_expiry.ToDoubleT()); // Mar 18 23:35:19 2011 GMT | 175 EXPECT_EQ(1300491319, valid_expiry.ToDoubleT()); // Mar 18 23:35:19 2011 GMT |
| 181 | 176 |
| 182 const SHA1HashValue& fingerprint = webkit_cert->fingerprint(); | 177 const SHA1HashValue& fingerprint = webkit_cert->fingerprint(); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 EXPECT_EQ("1600 Amphitheatre Parkway", subject.street_addresses[0]); | 284 EXPECT_EQ("1600 Amphitheatre Parkway", subject.street_addresses[0]); |
| 290 ASSERT_EQ(1U, subject.organization_names.size()); | 285 ASSERT_EQ(1U, subject.organization_names.size()); |
| 291 EXPECT_EQ("Chromium = \"net_unittests\"", subject.organization_names[0]); | 286 EXPECT_EQ("Chromium = \"net_unittests\"", subject.organization_names[0]); |
| 292 ASSERT_EQ(2U, subject.organization_unit_names.size()); | 287 ASSERT_EQ(2U, subject.organization_unit_names.size()); |
| 293 EXPECT_EQ("net_unittests", subject.organization_unit_names[0]); | 288 EXPECT_EQ("net_unittests", subject.organization_unit_names[0]); |
| 294 EXPECT_EQ("Chromium", subject.organization_unit_names[1]); | 289 EXPECT_EQ("Chromium", subject.organization_unit_names[1]); |
| 295 EXPECT_EQ(0U, subject.domain_components.size()); | 290 EXPECT_EQ(0U, subject.domain_components.size()); |
| 296 } | 291 } |
| 297 | 292 |
| 298 TEST(X509CertificateTest, SerialNumbers) { | 293 TEST(X509CertificateTest, SerialNumbers) { |
| 299 scoped_refptr<X509Certificate> google_cert( | 294 scoped_refptr<X509Certificate> google_cert(X509Certificate::CreateFromBytes( |
| 300 X509Certificate::CreateFromBytes( | 295 reinterpret_cast<const char*>(google_der), sizeof(google_der))); |
| 301 reinterpret_cast<const char*>(google_der), sizeof(google_der))); | |
| 302 | 296 |
| 303 static const uint8 google_serial[16] = { | 297 static const uint8 google_serial[16] = { |
| 304 0x01,0x2a,0x39,0x76,0x0d,0x3f,0x4f,0xc9, | 298 0x01, 0x2a, 0x39, 0x76, 0x0d, 0x3f, 0x4f, 0xc9, |
| 305 0x0b,0xe7,0xbd,0x2b,0xcf,0x95,0x2e,0x7a, | 299 0x0b, 0xe7, 0xbd, 0x2b, 0xcf, 0x95, 0x2e, 0x7a, |
| 306 }; | 300 }; |
| 307 | 301 |
| 308 ASSERT_EQ(sizeof(google_serial), google_cert->serial_number().size()); | 302 ASSERT_EQ(sizeof(google_serial), google_cert->serial_number().size()); |
| 309 EXPECT_TRUE(memcmp(google_cert->serial_number().data(), google_serial, | 303 EXPECT_TRUE(memcmp(google_cert->serial_number().data(), |
| 304 google_serial, |
| 310 sizeof(google_serial)) == 0); | 305 sizeof(google_serial)) == 0); |
| 311 | 306 |
| 312 // We also want to check a serial number where the first byte is >= 0x80 in | 307 // We also want to check a serial number where the first byte is >= 0x80 in |
| 313 // case the underlying library tries to pad it. | 308 // case the underlying library tries to pad it. |
| 314 scoped_refptr<X509Certificate> paypal_null_cert( | 309 scoped_refptr<X509Certificate> paypal_null_cert( |
| 315 X509Certificate::CreateFromBytes( | 310 X509Certificate::CreateFromBytes( |
| 316 reinterpret_cast<const char*>(paypal_null_der), | 311 reinterpret_cast<const char*>(paypal_null_der), |
| 317 sizeof(paypal_null_der))); | 312 sizeof(paypal_null_der))); |
| 318 | 313 |
| 319 static const uint8 paypal_null_serial[3] = {0x00, 0xf0, 0x9b}; | 314 static const uint8 paypal_null_serial[3] = {0x00, 0xf0, 0x9b}; |
| 320 ASSERT_EQ(sizeof(paypal_null_serial), | 315 ASSERT_EQ(sizeof(paypal_null_serial), |
| 321 paypal_null_cert->serial_number().size()); | 316 paypal_null_cert->serial_number().size()); |
| 322 EXPECT_TRUE(memcmp(paypal_null_cert->serial_number().data(), | 317 EXPECT_TRUE(memcmp(paypal_null_cert->serial_number().data(), |
| 323 paypal_null_serial, sizeof(paypal_null_serial)) == 0); | 318 paypal_null_serial, |
| 319 sizeof(paypal_null_serial)) == 0); |
| 324 } | 320 } |
| 325 | 321 |
| 326 TEST(X509CertificateTest, CAFingerprints) { | 322 TEST(X509CertificateTest, CAFingerprints) { |
| 327 base::FilePath certs_dir = GetTestCertsDirectory(); | 323 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 328 | 324 |
| 329 scoped_refptr<X509Certificate> server_cert = | 325 scoped_refptr<X509Certificate> server_cert = |
| 330 ImportCertFromFile(certs_dir, "salesforce_com_test.pem"); | 326 ImportCertFromFile(certs_dir, "salesforce_com_test.pem"); |
| 331 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert); | 327 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert); |
| 332 | 328 |
| 333 scoped_refptr<X509Certificate> intermediate_cert1 = | 329 scoped_refptr<X509Certificate> intermediate_cert1 = |
| (...skipping 16 matching lines...) Expand all Loading... |
| 350 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 346 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), |
| 351 intermediates); | 347 intermediates); |
| 352 | 348 |
| 353 // No intermediate CA certicates. | 349 // No intermediate CA certicates. |
| 354 intermediates.clear(); | 350 intermediates.clear(); |
| 355 scoped_refptr<X509Certificate> cert_chain3 = | 351 scoped_refptr<X509Certificate> cert_chain3 = |
| 356 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 352 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), |
| 357 intermediates); | 353 intermediates); |
| 358 | 354 |
| 359 static const uint8 cert_chain1_ca_fingerprint[20] = { | 355 static const uint8 cert_chain1_ca_fingerprint[20] = { |
| 360 0xc2, 0xf0, 0x08, 0x7d, 0x01, 0xe6, 0x86, 0x05, 0x3a, 0x4d, | 356 0xc2, 0xf0, 0x08, 0x7d, 0x01, 0xe6, 0x86, 0x05, 0x3a, 0x4d, |
| 361 0x63, 0x3e, 0x7e, 0x70, 0xd4, 0xef, 0x65, 0xc2, 0xcc, 0x4f | 357 0x63, 0x3e, 0x7e, 0x70, 0xd4, 0xef, 0x65, 0xc2, 0xcc, 0x4f}; |
| 362 }; | |
| 363 static const uint8 cert_chain2_ca_fingerprint[20] = { | 358 static const uint8 cert_chain2_ca_fingerprint[20] = { |
| 364 0xd5, 0x59, 0xa5, 0x86, 0x66, 0x9b, 0x08, 0xf4, 0x6a, 0x30, | 359 0xd5, 0x59, 0xa5, 0x86, 0x66, 0x9b, 0x08, 0xf4, 0x6a, 0x30, |
| 365 0xa1, 0x33, 0xf8, 0xa9, 0xed, 0x3d, 0x03, 0x8e, 0x2e, 0xa8 | 360 0xa1, 0x33, 0xf8, 0xa9, 0xed, 0x3d, 0x03, 0x8e, 0x2e, 0xa8}; |
| 366 }; | |
| 367 // The SHA-1 hash of nothing. | 361 // The SHA-1 hash of nothing. |
| 368 static const uint8 cert_chain3_ca_fingerprint[20] = { | 362 static const uint8 cert_chain3_ca_fingerprint[20] = { |
| 369 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, | 363 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, |
| 370 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09 | 364 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09}; |
| 371 }; | |
| 372 EXPECT_TRUE(memcmp(cert_chain1->ca_fingerprint().data, | 365 EXPECT_TRUE(memcmp(cert_chain1->ca_fingerprint().data, |
| 373 cert_chain1_ca_fingerprint, 20) == 0); | 366 cert_chain1_ca_fingerprint, |
| 367 20) == 0); |
| 374 EXPECT_TRUE(memcmp(cert_chain2->ca_fingerprint().data, | 368 EXPECT_TRUE(memcmp(cert_chain2->ca_fingerprint().data, |
| 375 cert_chain2_ca_fingerprint, 20) == 0); | 369 cert_chain2_ca_fingerprint, |
| 370 20) == 0); |
| 376 EXPECT_TRUE(memcmp(cert_chain3->ca_fingerprint().data, | 371 EXPECT_TRUE(memcmp(cert_chain3->ca_fingerprint().data, |
| 377 cert_chain3_ca_fingerprint, 20) == 0); | 372 cert_chain3_ca_fingerprint, |
| 373 20) == 0); |
| 378 } | 374 } |
| 379 | 375 |
| 380 TEST(X509CertificateTest, ParseSubjectAltNames) { | 376 TEST(X509CertificateTest, ParseSubjectAltNames) { |
| 381 base::FilePath certs_dir = GetTestCertsDirectory(); | 377 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 382 | 378 |
| 383 scoped_refptr<X509Certificate> san_cert = | 379 scoped_refptr<X509Certificate> san_cert = |
| 384 ImportCertFromFile(certs_dir, "subjectAltName_sanity_check.pem"); | 380 ImportCertFromFile(certs_dir, "subjectAltName_sanity_check.pem"); |
| 385 ASSERT_NE(static_cast<X509Certificate*>(NULL), san_cert); | 381 ASSERT_NE(static_cast<X509Certificate*>(NULL), san_cert); |
| 386 | 382 |
| 387 std::vector<std::string> dns_names; | 383 std::vector<std::string> dns_names; |
| 388 std::vector<std::string> ip_addresses; | 384 std::vector<std::string> ip_addresses; |
| 389 san_cert->GetSubjectAltName(&dns_names, &ip_addresses); | 385 san_cert->GetSubjectAltName(&dns_names, &ip_addresses); |
| 390 | 386 |
| 391 // Ensure that DNS names are correctly parsed. | 387 // Ensure that DNS names are correctly parsed. |
| 392 ASSERT_EQ(1U, dns_names.size()); | 388 ASSERT_EQ(1U, dns_names.size()); |
| 393 EXPECT_EQ("test.example", dns_names[0]); | 389 EXPECT_EQ("test.example", dns_names[0]); |
| 394 | 390 |
| 395 // Ensure that both IPv4 and IPv6 addresses are correctly parsed. | 391 // Ensure that both IPv4 and IPv6 addresses are correctly parsed. |
| 396 ASSERT_EQ(2U, ip_addresses.size()); | 392 ASSERT_EQ(2U, ip_addresses.size()); |
| 397 | 393 |
| 398 static const uint8 kIPv4Address[] = { | 394 static const uint8 kIPv4Address[] = {0x7F, 0x00, 0x00, 0x02}; |
| 399 0x7F, 0x00, 0x00, 0x02 | |
| 400 }; | |
| 401 ASSERT_EQ(arraysize(kIPv4Address), ip_addresses[0].size()); | 395 ASSERT_EQ(arraysize(kIPv4Address), ip_addresses[0].size()); |
| 402 EXPECT_EQ(0, memcmp(ip_addresses[0].data(), kIPv4Address, | 396 EXPECT_EQ( |
| 403 arraysize(kIPv4Address))); | 397 0, memcmp(ip_addresses[0].data(), kIPv4Address, arraysize(kIPv4Address))); |
| 404 | 398 |
| 405 static const uint8 kIPv6Address[] = { | 399 static const uint8 kIPv6Address[] = {0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, |
| 406 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 | 401 0x00, 0x00, 0x00, 0x01}; |
| 408 }; | |
| 409 ASSERT_EQ(arraysize(kIPv6Address), ip_addresses[1].size()); | 402 ASSERT_EQ(arraysize(kIPv6Address), ip_addresses[1].size()); |
| 410 EXPECT_EQ(0, memcmp(ip_addresses[1].data(), kIPv6Address, | 403 EXPECT_EQ( |
| 411 arraysize(kIPv6Address))); | 404 0, memcmp(ip_addresses[1].data(), kIPv6Address, arraysize(kIPv6Address))); |
| 412 | 405 |
| 413 // Ensure the subjectAltName dirName has not influenced the handling of | 406 // Ensure the subjectAltName dirName has not influenced the handling of |
| 414 // the subject commonName. | 407 // the subject commonName. |
| 415 EXPECT_EQ("127.0.0.1", san_cert->subject().common_name); | 408 EXPECT_EQ("127.0.0.1", san_cert->subject().common_name); |
| 416 } | 409 } |
| 417 | 410 |
| 418 TEST(X509CertificateTest, ExtractSPKIFromDERCert) { | 411 TEST(X509CertificateTest, ExtractSPKIFromDERCert) { |
| 419 base::FilePath certs_dir = GetTestCertsDirectory(); | 412 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 420 scoped_refptr<X509Certificate> cert = | 413 scoped_refptr<X509Certificate> cert = |
| 421 ImportCertFromFile(certs_dir, "nist.der"); | 414 ImportCertFromFile(certs_dir, "nist.der"); |
| 422 ASSERT_NE(static_cast<X509Certificate*>(NULL), cert); | 415 ASSERT_NE(static_cast<X509Certificate*>(NULL), cert); |
| 423 | 416 |
| 424 std::string derBytes; | 417 std::string derBytes; |
| 425 EXPECT_TRUE(X509Certificate::GetDEREncoded(cert->os_cert_handle(), | 418 EXPECT_TRUE( |
| 426 &derBytes)); | 419 X509Certificate::GetDEREncoded(cert->os_cert_handle(), &derBytes)); |
| 427 | 420 |
| 428 base::StringPiece spkiBytes; | 421 base::StringPiece spkiBytes; |
| 429 EXPECT_TRUE(asn1::ExtractSPKIFromDERCert(derBytes, &spkiBytes)); | 422 EXPECT_TRUE(asn1::ExtractSPKIFromDERCert(derBytes, &spkiBytes)); |
| 430 | 423 |
| 431 uint8 hash[base::kSHA1Length]; | 424 uint8 hash[base::kSHA1Length]; |
| 432 base::SHA1HashBytes(reinterpret_cast<const uint8*>(spkiBytes.data()), | 425 base::SHA1HashBytes( |
| 433 spkiBytes.size(), hash); | 426 reinterpret_cast<const uint8*>(spkiBytes.data()), spkiBytes.size(), hash); |
| 434 | 427 |
| 435 EXPECT_EQ(0, memcmp(hash, kNistSPKIHash, sizeof(hash))); | 428 EXPECT_EQ(0, memcmp(hash, kNistSPKIHash, sizeof(hash))); |
| 436 } | 429 } |
| 437 | 430 |
| 438 TEST(X509CertificateTest, ExtractCRLURLsFromDERCert) { | 431 TEST(X509CertificateTest, ExtractCRLURLsFromDERCert) { |
| 439 base::FilePath certs_dir = GetTestCertsDirectory(); | 432 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 440 scoped_refptr<X509Certificate> cert = | 433 scoped_refptr<X509Certificate> cert = |
| 441 ImportCertFromFile(certs_dir, "nist.der"); | 434 ImportCertFromFile(certs_dir, "nist.der"); |
| 442 ASSERT_NE(static_cast<X509Certificate*>(NULL), cert); | 435 ASSERT_NE(static_cast<X509Certificate*>(NULL), cert); |
| 443 | 436 |
| 444 std::string derBytes; | 437 std::string derBytes; |
| 445 EXPECT_TRUE(X509Certificate::GetDEREncoded(cert->os_cert_handle(), | 438 EXPECT_TRUE( |
| 446 &derBytes)); | 439 X509Certificate::GetDEREncoded(cert->os_cert_handle(), &derBytes)); |
| 447 | 440 |
| 448 std::vector<base::StringPiece> crl_urls; | 441 std::vector<base::StringPiece> crl_urls; |
| 449 EXPECT_TRUE(asn1::ExtractCRLURLsFromDERCert(derBytes, &crl_urls)); | 442 EXPECT_TRUE(asn1::ExtractCRLURLsFromDERCert(derBytes, &crl_urls)); |
| 450 | 443 |
| 451 EXPECT_EQ(1u, crl_urls.size()); | 444 EXPECT_EQ(1u, crl_urls.size()); |
| 452 if (crl_urls.size() > 0) { | 445 if (crl_urls.size() > 0) { |
| 453 EXPECT_EQ("http://SVRSecure-G3-crl.verisign.com/SVRSecureG3.crl", | 446 EXPECT_EQ("http://SVRSecure-G3-crl.verisign.com/SVRSecureG3.crl", |
| 454 crl_urls[0].as_string()); | 447 crl_urls[0].as_string()); |
| 455 } | 448 } |
| 456 } | 449 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 485 | 478 |
| 486 // Add the same certificate, but this time with an intermediate. This | 479 // Add the same certificate, but this time with an intermediate. This |
| 487 // should result in the intermediate being cached. Note that this is not | 480 // should result in the intermediate being cached. Note that this is not |
| 488 // a legitimate chain, but is suitable for testing. | 481 // a legitimate chain, but is suitable for testing. |
| 489 google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( | 482 google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( |
| 490 reinterpret_cast<const char*>(google_der), sizeof(google_der)); | 483 reinterpret_cast<const char*>(google_der), sizeof(google_der)); |
| 491 thawte_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( | 484 thawte_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( |
| 492 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)); | 485 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)); |
| 493 X509Certificate::OSCertHandles intermediates; | 486 X509Certificate::OSCertHandles intermediates; |
| 494 intermediates.push_back(thawte_cert_handle); | 487 intermediates.push_back(thawte_cert_handle); |
| 495 scoped_refptr<X509Certificate> cert3(X509Certificate::CreateFromHandle( | 488 scoped_refptr<X509Certificate> cert3( |
| 496 google_cert_handle, intermediates)); | 489 X509Certificate::CreateFromHandle(google_cert_handle, intermediates)); |
| 497 X509Certificate::FreeOSCertHandle(google_cert_handle); | 490 X509Certificate::FreeOSCertHandle(google_cert_handle); |
| 498 X509Certificate::FreeOSCertHandle(thawte_cert_handle); | 491 X509Certificate::FreeOSCertHandle(thawte_cert_handle); |
| 499 | 492 |
| 500 // Test that the new certificate, even with intermediates, results in the | 493 // Test that the new certificate, even with intermediates, results in the |
| 501 // same underlying handle being used. | 494 // same underlying handle being used. |
| 502 EXPECT_EQ(cert1->os_cert_handle(), cert3->os_cert_handle()); | 495 EXPECT_EQ(cert1->os_cert_handle(), cert3->os_cert_handle()); |
| 503 // Though they use the same OS handle, the intermediates should be different. | 496 // Though they use the same OS handle, the intermediates should be different. |
| 504 EXPECT_NE(cert1->GetIntermediateCertificates().size(), | 497 EXPECT_NE(cert1->GetIntermediateCertificates().size(), |
| 505 cert3->GetIntermediateCertificates().size()); | 498 cert3->GetIntermediateCertificates().size()); |
| 506 } | 499 } |
| 507 | 500 |
| 508 TEST(X509CertificateTest, Pickle) { | 501 TEST(X509CertificateTest, Pickle) { |
| 509 X509Certificate::OSCertHandle google_cert_handle = | 502 X509Certificate::OSCertHandle google_cert_handle = |
| 510 X509Certificate::CreateOSCertHandleFromBytes( | 503 X509Certificate::CreateOSCertHandleFromBytes( |
| 511 reinterpret_cast<const char*>(google_der), sizeof(google_der)); | 504 reinterpret_cast<const char*>(google_der), sizeof(google_der)); |
| 512 X509Certificate::OSCertHandle thawte_cert_handle = | 505 X509Certificate::OSCertHandle thawte_cert_handle = |
| 513 X509Certificate::CreateOSCertHandleFromBytes( | 506 X509Certificate::CreateOSCertHandleFromBytes( |
| 514 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)); | 507 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)); |
| 515 | 508 |
| 516 X509Certificate::OSCertHandles intermediates; | 509 X509Certificate::OSCertHandles intermediates; |
| 517 intermediates.push_back(thawte_cert_handle); | 510 intermediates.push_back(thawte_cert_handle); |
| 518 scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( | 511 scoped_refptr<X509Certificate> cert = |
| 519 google_cert_handle, intermediates); | 512 X509Certificate::CreateFromHandle(google_cert_handle, intermediates); |
| 520 ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get()); | 513 ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get()); |
| 521 | 514 |
| 522 X509Certificate::FreeOSCertHandle(google_cert_handle); | 515 X509Certificate::FreeOSCertHandle(google_cert_handle); |
| 523 X509Certificate::FreeOSCertHandle(thawte_cert_handle); | 516 X509Certificate::FreeOSCertHandle(thawte_cert_handle); |
| 524 | 517 |
| 525 Pickle pickle; | 518 Pickle pickle; |
| 526 cert->Persist(&pickle); | 519 cert->Persist(&pickle); |
| 527 | 520 |
| 528 PickleIterator iter(pickle); | 521 PickleIterator iter(pickle); |
| 529 scoped_refptr<X509Certificate> cert_from_pickle = | 522 scoped_refptr<X509Certificate> cert_from_pickle = |
| (...skipping 29 matching lines...) Expand all Loading... |
| 559 policy.Check(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); | 552 policy.Check(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); |
| 560 EXPECT_FALSE(policy.HasAllowedCert()); | 553 EXPECT_FALSE(policy.HasAllowedCert()); |
| 561 EXPECT_FALSE(policy.HasDeniedCert()); | 554 EXPECT_FALSE(policy.HasDeniedCert()); |
| 562 | 555 |
| 563 // Test adding one certificate with one error. | 556 // Test adding one certificate with one error. |
| 564 policy.Allow(google_cert.get(), CERT_STATUS_DATE_INVALID); | 557 policy.Allow(google_cert.get(), CERT_STATUS_DATE_INVALID); |
| 565 EXPECT_EQ(CertPolicy::ALLOWED, | 558 EXPECT_EQ(CertPolicy::ALLOWED, |
| 566 policy.Check(google_cert.get(), CERT_STATUS_DATE_INVALID)); | 559 policy.Check(google_cert.get(), CERT_STATUS_DATE_INVALID)); |
| 567 EXPECT_EQ(CertPolicy::UNKNOWN, | 560 EXPECT_EQ(CertPolicy::UNKNOWN, |
| 568 policy.Check(google_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); | 561 policy.Check(google_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); |
| 569 EXPECT_EQ(CertPolicy::UNKNOWN, | 562 EXPECT_EQ( |
| 570 policy.Check(google_cert.get(), | 563 CertPolicy::UNKNOWN, |
| 571 CERT_STATUS_DATE_INVALID | CERT_STATUS_COMMON_NAME_INVALID)); | 564 policy.Check(google_cert.get(), |
| 565 CERT_STATUS_DATE_INVALID | CERT_STATUS_COMMON_NAME_INVALID)); |
| 572 EXPECT_EQ(CertPolicy::UNKNOWN, | 566 EXPECT_EQ(CertPolicy::UNKNOWN, |
| 573 policy.Check(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); | 567 policy.Check(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); |
| 574 EXPECT_TRUE(policy.HasAllowedCert()); | 568 EXPECT_TRUE(policy.HasAllowedCert()); |
| 575 EXPECT_FALSE(policy.HasDeniedCert()); | 569 EXPECT_FALSE(policy.HasDeniedCert()); |
| 576 | 570 |
| 577 // Test saving the same certificate with a new error. | 571 // Test saving the same certificate with a new error. |
| 578 policy.Allow(google_cert.get(), CERT_STATUS_AUTHORITY_INVALID); | 572 policy.Allow(google_cert.get(), CERT_STATUS_AUTHORITY_INVALID); |
| 579 EXPECT_EQ(CertPolicy::UNKNOWN, | 573 EXPECT_EQ(CertPolicy::UNKNOWN, |
| 580 policy.Check(google_cert.get(), CERT_STATUS_DATE_INVALID)); | 574 policy.Check(google_cert.get(), CERT_STATUS_DATE_INVALID)); |
| 581 EXPECT_EQ(CertPolicy::ALLOWED, | 575 EXPECT_EQ(CertPolicy::ALLOWED, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 EXPECT_TRUE(policy.HasDeniedCert()); | 621 EXPECT_TRUE(policy.HasDeniedCert()); |
| 628 | 622 |
| 629 // Test denying an overlapping certificate. | 623 // Test denying an overlapping certificate. |
| 630 policy.Allow(google_cert.get(), | 624 policy.Allow(google_cert.get(), |
| 631 CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_DATE_INVALID); | 625 CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_DATE_INVALID); |
| 632 policy.Deny(google_cert.get(), CERT_STATUS_DATE_INVALID); | 626 policy.Deny(google_cert.get(), CERT_STATUS_DATE_INVALID); |
| 633 EXPECT_EQ(CertPolicy::DENIED, | 627 EXPECT_EQ(CertPolicy::DENIED, |
| 634 policy.Check(google_cert.get(), CERT_STATUS_DATE_INVALID)); | 628 policy.Check(google_cert.get(), CERT_STATUS_DATE_INVALID)); |
| 635 EXPECT_EQ(CertPolicy::UNKNOWN, | 629 EXPECT_EQ(CertPolicy::UNKNOWN, |
| 636 policy.Check(google_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); | 630 policy.Check(google_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); |
| 637 EXPECT_EQ(CertPolicy::DENIED, | 631 EXPECT_EQ( |
| 638 policy.Check(google_cert.get(), | 632 CertPolicy::DENIED, |
| 639 CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_DATE_INVALID)); | 633 policy.Check(google_cert.get(), |
| 634 CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_DATE_INVALID)); |
| 640 | 635 |
| 641 // Test denying an overlapping certificate (other direction). | 636 // Test denying an overlapping certificate (other direction). |
| 642 policy.Allow(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID); | 637 policy.Allow(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID); |
| 643 policy.Deny(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID); | 638 policy.Deny(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID); |
| 644 policy.Deny(webkit_cert.get(), CERT_STATUS_DATE_INVALID); | 639 policy.Deny(webkit_cert.get(), CERT_STATUS_DATE_INVALID); |
| 645 EXPECT_EQ(CertPolicy::DENIED, | 640 EXPECT_EQ(CertPolicy::DENIED, |
| 646 policy.Check(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); | 641 policy.Check(webkit_cert.get(), CERT_STATUS_COMMON_NAME_INVALID)); |
| 647 EXPECT_EQ(CertPolicy::DENIED, | 642 EXPECT_EQ(CertPolicy::DENIED, |
| 648 policy.Check(webkit_cert.get(), CERT_STATUS_DATE_INVALID)); | 643 policy.Check(webkit_cert.get(), CERT_STATUS_DATE_INVALID)); |
| 649 } | 644 } |
| 650 | 645 |
| 651 TEST(X509CertificateTest, IntermediateCertificates) { | 646 TEST(X509CertificateTest, IntermediateCertificates) { |
| 652 scoped_refptr<X509Certificate> webkit_cert( | 647 scoped_refptr<X509Certificate> webkit_cert(X509Certificate::CreateFromBytes( |
| 653 X509Certificate::CreateFromBytes( | 648 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); |
| 654 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); | |
| 655 | 649 |
| 656 scoped_refptr<X509Certificate> thawte_cert( | 650 scoped_refptr<X509Certificate> thawte_cert(X509Certificate::CreateFromBytes( |
| 657 X509Certificate::CreateFromBytes( | 651 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der))); |
| 658 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der))); | |
| 659 | 652 |
| 660 X509Certificate::OSCertHandle google_handle; | 653 X509Certificate::OSCertHandle google_handle; |
| 661 // Create object with no intermediates: | 654 // Create object with no intermediates: |
| 662 google_handle = X509Certificate::CreateOSCertHandleFromBytes( | 655 google_handle = X509Certificate::CreateOSCertHandleFromBytes( |
| 663 reinterpret_cast<const char*>(google_der), sizeof(google_der)); | 656 reinterpret_cast<const char*>(google_der), sizeof(google_der)); |
| 664 X509Certificate::OSCertHandles intermediates1; | 657 X509Certificate::OSCertHandles intermediates1; |
| 665 scoped_refptr<X509Certificate> cert1; | 658 scoped_refptr<X509Certificate> cert1; |
| 666 cert1 = X509Certificate::CreateFromHandle(google_handle, intermediates1); | 659 cert1 = X509Certificate::CreateFromHandle(google_handle, intermediates1); |
| 667 EXPECT_EQ(0u, cert1->GetIntermediateCertificates().size()); | 660 EXPECT_EQ(0u, cert1->GetIntermediateCertificates().size()); |
| 668 | 661 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 687 } | 680 } |
| 688 | 681 |
| 689 TEST(X509CertificateTest, IsIssuedByEncoded) { | 682 TEST(X509CertificateTest, IsIssuedByEncoded) { |
| 690 base::FilePath certs_dir = GetTestCertsDirectory(); | 683 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 691 | 684 |
| 692 // Test a client certificate from MIT. | 685 // Test a client certificate from MIT. |
| 693 scoped_refptr<X509Certificate> mit_davidben_cert( | 686 scoped_refptr<X509Certificate> mit_davidben_cert( |
| 694 ImportCertFromFile(certs_dir, "mit.davidben.der")); | 687 ImportCertFromFile(certs_dir, "mit.davidben.der")); |
| 695 ASSERT_NE(static_cast<X509Certificate*>(NULL), mit_davidben_cert); | 688 ASSERT_NE(static_cast<X509Certificate*>(NULL), mit_davidben_cert); |
| 696 | 689 |
| 697 std::string mit_issuer(reinterpret_cast<const char*>(MITDN), | 690 std::string mit_issuer(reinterpret_cast<const char*>(MITDN), sizeof(MITDN)); |
| 698 sizeof(MITDN)); | |
| 699 | 691 |
| 700 // Test a certificate from Google, issued by Thawte | 692 // Test a certificate from Google, issued by Thawte |
| 701 scoped_refptr<X509Certificate> google_cert( | 693 scoped_refptr<X509Certificate> google_cert( |
| 702 ImportCertFromFile(certs_dir, "google.single.der")); | 694 ImportCertFromFile(certs_dir, "google.single.der")); |
| 703 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); | 695 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); |
| 704 | 696 |
| 705 std::string thawte_issuer(reinterpret_cast<const char*>(ThawteDN), | 697 std::string thawte_issuer(reinterpret_cast<const char*>(ThawteDN), |
| 706 sizeof(ThawteDN)); | 698 sizeof(ThawteDN)); |
| 707 | 699 |
| 708 // Check that the David Ben certificate is issued by MIT, but not | 700 // Check that the David Ben certificate is issued by MIT, but not |
| (...skipping 14 matching lines...) Expand all Loading... |
| 723 // Check that they both pass when given a list of the two issuers. | 715 // Check that they both pass when given a list of the two issuers. |
| 724 issuers.clear(); | 716 issuers.clear(); |
| 725 issuers.push_back(mit_issuer); | 717 issuers.push_back(mit_issuer); |
| 726 issuers.push_back(thawte_issuer); | 718 issuers.push_back(thawte_issuer); |
| 727 EXPECT_TRUE(mit_davidben_cert->IsIssuedByEncoded(issuers)); | 719 EXPECT_TRUE(mit_davidben_cert->IsIssuedByEncoded(issuers)); |
| 728 EXPECT_TRUE(google_cert->IsIssuedByEncoded(issuers)); | 720 EXPECT_TRUE(google_cert->IsIssuedByEncoded(issuers)); |
| 729 } | 721 } |
| 730 | 722 |
| 731 TEST(X509CertificateTest, IsIssuedByEncodedWithIntermediates) { | 723 TEST(X509CertificateTest, IsIssuedByEncodedWithIntermediates) { |
| 732 static const unsigned char kPolicyRootDN[] = { | 724 static const unsigned char kPolicyRootDN[] = { |
| 733 0x30, 0x1e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, | 725 0x30, 0x1e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, |
| 734 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x54, 0x65, 0x73, 0x74, | 726 0x0c, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x54, 0x65, |
| 735 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41 | 727 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41}; |
| 736 }; | |
| 737 static const unsigned char kPolicyIntermediateDN[] = { | 728 static const unsigned char kPolicyIntermediateDN[] = { |
| 738 0x30, 0x26, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, | 729 0x30, 0x26, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, |
| 739 0x1b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x54, 0x65, 0x73, 0x74, | 730 0x03, 0x0c, 0x1b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, |
| 740 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, | 731 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, |
| 741 0x65, 0x20, 0x43, 0x41 | 732 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x43, 0x41}; |
| 742 }; | |
| 743 | 733 |
| 744 base::FilePath certs_dir = GetTestCertsDirectory(); | 734 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 745 | 735 |
| 746 CertificateList policy_chain = CreateCertificateListFromFile( | 736 CertificateList policy_chain = CreateCertificateListFromFile( |
| 747 certs_dir, "explicit-policy-chain.pem", X509Certificate::FORMAT_AUTO); | 737 certs_dir, "explicit-policy-chain.pem", X509Certificate::FORMAT_AUTO); |
| 748 ASSERT_EQ(3u, policy_chain.size()); | 738 ASSERT_EQ(3u, policy_chain.size()); |
| 749 | 739 |
| 750 // The intermediate CA certificate's policyConstraints extension has a | 740 // The intermediate CA certificate's policyConstraints extension has a |
| 751 // requireExplicitPolicy field with SkipCerts=0. | 741 // requireExplicitPolicy field with SkipCerts=0. |
| 752 std::string policy_intermediate_dn( | 742 std::string policy_intermediate_dn( |
| 753 reinterpret_cast<const char*>(kPolicyIntermediateDN), | 743 reinterpret_cast<const char*>(kPolicyIntermediateDN), |
| 754 sizeof(kPolicyIntermediateDN)); | 744 sizeof(kPolicyIntermediateDN)); |
| 755 std::string policy_root_dn(reinterpret_cast<const char*>(kPolicyRootDN), | 745 std::string policy_root_dn(reinterpret_cast<const char*>(kPolicyRootDN), |
| 756 sizeof(kPolicyRootDN)); | 746 sizeof(kPolicyRootDN)); |
| 757 | 747 |
| 758 X509Certificate::OSCertHandles intermediates; | 748 X509Certificate::OSCertHandles intermediates; |
| 759 intermediates.push_back(policy_chain[1]->os_cert_handle()); | 749 intermediates.push_back(policy_chain[1]->os_cert_handle()); |
| 760 scoped_refptr<X509Certificate> cert_chain = | 750 scoped_refptr<X509Certificate> cert_chain = X509Certificate::CreateFromHandle( |
| 761 X509Certificate::CreateFromHandle(policy_chain[0]->os_cert_handle(), | 751 policy_chain[0]->os_cert_handle(), intermediates); |
| 762 intermediates); | |
| 763 | 752 |
| 764 std::vector<std::string> issuers; | 753 std::vector<std::string> issuers; |
| 765 | 754 |
| 766 // Check that the chain is issued by the intermediate. | 755 // Check that the chain is issued by the intermediate. |
| 767 issuers.clear(); | 756 issuers.clear(); |
| 768 issuers.push_back(policy_intermediate_dn); | 757 issuers.push_back(policy_intermediate_dn); |
| 769 EXPECT_TRUE(cert_chain->IsIssuedByEncoded(issuers)); | 758 EXPECT_TRUE(cert_chain->IsIssuedByEncoded(issuers)); |
| 770 | 759 |
| 771 // Check that the chain is also issued by the root. | 760 // Check that the chain is also issued by the root. |
| 772 issuers.clear(); | 761 issuers.clear(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 793 | 782 |
| 794 #if defined(USE_NSS) | 783 #if defined(USE_NSS) |
| 795 TEST(X509CertificateTest, GetDefaultNickname) { | 784 TEST(X509CertificateTest, GetDefaultNickname) { |
| 796 base::FilePath certs_dir = GetTestCertsDirectory(); | 785 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 797 | 786 |
| 798 scoped_refptr<X509Certificate> test_cert( | 787 scoped_refptr<X509Certificate> test_cert( |
| 799 ImportCertFromFile(certs_dir, "no_subject_common_name_cert.pem")); | 788 ImportCertFromFile(certs_dir, "no_subject_common_name_cert.pem")); |
| 800 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 789 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
| 801 | 790 |
| 802 std::string nickname = test_cert->GetDefaultNickname(USER_CERT); | 791 std::string nickname = test_cert->GetDefaultNickname(USER_CERT); |
| 803 EXPECT_EQ("wtc@google.com's COMODO Client Authentication and " | 792 EXPECT_EQ( |
| 804 "Secure Email CA ID", nickname); | 793 "wtc@google.com's COMODO Client Authentication and " |
| 794 "Secure Email CA ID", |
| 795 nickname); |
| 805 } | 796 } |
| 806 #endif | 797 #endif |
| 807 | 798 |
| 808 const struct CertificateFormatTestData { | 799 const struct CertificateFormatTestData { |
| 809 const char* file_name; | 800 const char* file_name; |
| 810 X509Certificate::Format format; | 801 X509Certificate::Format format; |
| 811 uint8* chain_fingerprints[3]; | 802 uint8* chain_fingerprints[3]; |
| 812 } kFormatTestData[] = { | 803 } kFormatTestData[] = { |
| 813 // DER Parsing - single certificate, DER encoded | 804 // DER Parsing - single certificate, DER encoded |
| 814 { "google.single.der", X509Certificate::FORMAT_SINGLE_CERTIFICATE, | 805 {"google.single.der", |
| 815 { google_parse_fingerprint, | 806 X509Certificate::FORMAT_SINGLE_CERTIFICATE, |
| 816 NULL, } }, | 807 { |
| 817 // DER parsing - single certificate, PEM encoded | 808 google_parse_fingerprint, NULL, |
| 818 { "google.single.pem", X509Certificate::FORMAT_SINGLE_CERTIFICATE, | 809 }}, |
| 819 { google_parse_fingerprint, | 810 // DER parsing - single certificate, PEM encoded |
| 820 NULL, } }, | 811 {"google.single.pem", |
| 821 // PEM parsing - single certificate, PEM encoded with a PEB of | 812 X509Certificate::FORMAT_SINGLE_CERTIFICATE, |
| 822 // "CERTIFICATE" | 813 { |
| 823 { "google.single.pem", X509Certificate::FORMAT_PEM_CERT_SEQUENCE, | 814 google_parse_fingerprint, NULL, |
| 824 { google_parse_fingerprint, | 815 }}, |
| 825 NULL, } }, | 816 // PEM parsing - single certificate, PEM encoded with a PEB of |
| 826 // PEM parsing - sequence of certificates, PEM encoded with a PEB of | 817 // "CERTIFICATE" |
| 827 // "CERTIFICATE" | 818 {"google.single.pem", |
| 828 { "google.chain.pem", X509Certificate::FORMAT_PEM_CERT_SEQUENCE, | 819 X509Certificate::FORMAT_PEM_CERT_SEQUENCE, |
| 829 { google_parse_fingerprint, | 820 { |
| 830 thawte_parse_fingerprint, | 821 google_parse_fingerprint, NULL, |
| 831 NULL, } }, | 822 }}, |
| 832 // PKCS#7 parsing - "degenerate" SignedData collection of certificates, DER | 823 // PEM parsing - sequence of certificates, PEM encoded with a PEB of |
| 833 // encoding | 824 // "CERTIFICATE" |
| 834 { "google.binary.p7b", X509Certificate::FORMAT_PKCS7, | 825 {"google.chain.pem", |
| 835 { google_parse_fingerprint, | 826 X509Certificate::FORMAT_PEM_CERT_SEQUENCE, |
| 836 thawte_parse_fingerprint, | 827 { |
| 837 NULL, } }, | 828 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 838 // PKCS#7 parsing - "degenerate" SignedData collection of certificates, PEM | 829 }}, |
| 839 // encoded with a PEM PEB of "CERTIFICATE" | 830 // PKCS#7 parsing - "degenerate" SignedData collection of certificates, |
| 840 { "google.pem_cert.p7b", X509Certificate::FORMAT_PKCS7, | 831 // DER |
| 841 { google_parse_fingerprint, | 832 // encoding |
| 842 thawte_parse_fingerprint, | 833 {"google.binary.p7b", |
| 843 NULL, } }, | 834 X509Certificate::FORMAT_PKCS7, |
| 844 // PKCS#7 parsing - "degenerate" SignedData collection of certificates, PEM | 835 { |
| 845 // encoded with a PEM PEB of "PKCS7" | 836 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 846 { "google.pem_pkcs7.p7b", X509Certificate::FORMAT_PKCS7, | 837 }}, |
| 847 { google_parse_fingerprint, | 838 // PKCS#7 parsing - "degenerate" SignedData collection of certificates, |
| 848 thawte_parse_fingerprint, | 839 // PEM |
| 849 NULL, } }, | 840 // encoded with a PEM PEB of "CERTIFICATE" |
| 850 // All of the above, this time using auto-detection | 841 {"google.pem_cert.p7b", |
| 851 { "google.single.der", X509Certificate::FORMAT_AUTO, | 842 X509Certificate::FORMAT_PKCS7, |
| 852 { google_parse_fingerprint, | 843 { |
| 853 NULL, } }, | 844 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 854 { "google.single.pem", X509Certificate::FORMAT_AUTO, | 845 }}, |
| 855 { google_parse_fingerprint, | 846 // PKCS#7 parsing - "degenerate" SignedData collection of certificates, |
| 856 NULL, } }, | 847 // PEM |
| 857 { "google.chain.pem", X509Certificate::FORMAT_AUTO, | 848 // encoded with a PEM PEB of "PKCS7" |
| 858 { google_parse_fingerprint, | 849 {"google.pem_pkcs7.p7b", |
| 859 thawte_parse_fingerprint, | 850 X509Certificate::FORMAT_PKCS7, |
| 860 NULL, } }, | 851 { |
| 861 { "google.binary.p7b", X509Certificate::FORMAT_AUTO, | 852 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 862 { google_parse_fingerprint, | 853 }}, |
| 863 thawte_parse_fingerprint, | 854 // All of the above, this time using auto-detection |
| 864 NULL, } }, | 855 {"google.single.der", |
| 865 { "google.pem_cert.p7b", X509Certificate::FORMAT_AUTO, | 856 X509Certificate::FORMAT_AUTO, |
| 866 { google_parse_fingerprint, | 857 { |
| 867 thawte_parse_fingerprint, | 858 google_parse_fingerprint, NULL, |
| 868 NULL, } }, | 859 }}, |
| 869 { "google.pem_pkcs7.p7b", X509Certificate::FORMAT_AUTO, | 860 {"google.single.pem", |
| 870 { google_parse_fingerprint, | 861 X509Certificate::FORMAT_AUTO, |
| 871 thawte_parse_fingerprint, | 862 { |
| 872 NULL, } }, | 863 google_parse_fingerprint, NULL, |
| 864 }}, |
| 865 {"google.chain.pem", |
| 866 X509Certificate::FORMAT_AUTO, |
| 867 { |
| 868 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 869 }}, |
| 870 {"google.binary.p7b", |
| 871 X509Certificate::FORMAT_AUTO, |
| 872 { |
| 873 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 874 }}, |
| 875 {"google.pem_cert.p7b", |
| 876 X509Certificate::FORMAT_AUTO, |
| 877 { |
| 878 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 879 }}, |
| 880 {"google.pem_pkcs7.p7b", |
| 881 X509Certificate::FORMAT_AUTO, |
| 882 { |
| 883 google_parse_fingerprint, thawte_parse_fingerprint, NULL, |
| 884 }}, |
| 873 }; | 885 }; |
| 874 | 886 |
| 875 class X509CertificateParseTest | 887 class X509CertificateParseTest |
| 876 : public testing::TestWithParam<CertificateFormatTestData> { | 888 : public testing::TestWithParam<CertificateFormatTestData> { |
| 877 public: | 889 public: |
| 878 virtual ~X509CertificateParseTest() {} | 890 virtual ~X509CertificateParseTest() {} |
| 879 virtual void SetUp() { | 891 virtual void SetUp() { test_data_ = GetParam(); } |
| 880 test_data_ = GetParam(); | |
| 881 } | |
| 882 virtual void TearDown() {} | 892 virtual void TearDown() {} |
| 883 | 893 |
| 884 protected: | 894 protected: |
| 885 CertificateFormatTestData test_data_; | 895 CertificateFormatTestData test_data_; |
| 886 }; | 896 }; |
| 887 | 897 |
| 888 TEST_P(X509CertificateParseTest, CanParseFormat) { | 898 TEST_P(X509CertificateParseTest, CanParseFormat) { |
| 889 base::FilePath certs_dir = GetTestCertsDirectory(); | 899 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 890 CertificateList certs = CreateCertificateListFromFile( | 900 CertificateList certs = CreateCertificateListFromFile( |
| 891 certs_dir, test_data_.file_name, test_data_.format); | 901 certs_dir, test_data_.file_name, test_data_.format); |
| 892 ASSERT_FALSE(certs.empty()); | 902 ASSERT_FALSE(certs.empty()); |
| 893 ASSERT_LE(certs.size(), arraysize(test_data_.chain_fingerprints)); | 903 ASSERT_LE(certs.size(), arraysize(test_data_.chain_fingerprints)); |
| 894 CheckGoogleCert(certs.front(), google_parse_fingerprint, | 904 CheckGoogleCert(certs.front(), |
| 895 kGoogleParseValidFrom, kGoogleParseValidTo); | 905 google_parse_fingerprint, |
| 906 kGoogleParseValidFrom, |
| 907 kGoogleParseValidTo); |
| 896 | 908 |
| 897 size_t i; | 909 size_t i; |
| 898 for (i = 0; i < arraysize(test_data_.chain_fingerprints); ++i) { | 910 for (i = 0; i < arraysize(test_data_.chain_fingerprints); ++i) { |
| 899 if (test_data_.chain_fingerprints[i] == NULL) { | 911 if (test_data_.chain_fingerprints[i] == NULL) { |
| 900 // No more test certificates expected - make sure no more were | 912 // No more test certificates expected - make sure no more were |
| 901 // returned before marking this test a success. | 913 // returned before marking this test a success. |
| 902 EXPECT_EQ(i, certs.size()); | 914 EXPECT_EQ(i, certs.size()); |
| 903 break; | 915 break; |
| 904 } | 916 } |
| 905 | 917 |
| 906 // A cert is expected - make sure that one was parsed. | 918 // A cert is expected - make sure that one was parsed. |
| 907 ASSERT_LT(i, certs.size()); | 919 ASSERT_LT(i, certs.size()); |
| 908 | 920 |
| 909 // Compare the parsed certificate with the expected certificate, by | 921 // Compare the parsed certificate with the expected certificate, by |
| 910 // comparing fingerprints. | 922 // comparing fingerprints. |
| 911 const X509Certificate* cert = certs[i].get(); | 923 const X509Certificate* cert = certs[i].get(); |
| 912 const SHA1HashValue& actual_fingerprint = cert->fingerprint(); | 924 const SHA1HashValue& actual_fingerprint = cert->fingerprint(); |
| 913 uint8* expected_fingerprint = test_data_.chain_fingerprints[i]; | 925 uint8* expected_fingerprint = test_data_.chain_fingerprints[i]; |
| 914 | 926 |
| 915 for (size_t j = 0; j < 20; ++j) | 927 for (size_t j = 0; j < 20; ++j) |
| 916 EXPECT_EQ(expected_fingerprint[j], actual_fingerprint.data[j]); | 928 EXPECT_EQ(expected_fingerprint[j], actual_fingerprint.data[j]); |
| 917 } | 929 } |
| 918 } | 930 } |
| 919 | 931 |
| 920 INSTANTIATE_TEST_CASE_P(, X509CertificateParseTest, | 932 INSTANTIATE_TEST_CASE_P(, |
| 933 X509CertificateParseTest, |
| 921 testing::ValuesIn(kFormatTestData)); | 934 testing::ValuesIn(kFormatTestData)); |
| 922 | 935 |
| 923 struct CertificateNameVerifyTestData { | 936 struct CertificateNameVerifyTestData { |
| 924 // true iff we expect hostname to match an entry in cert_names. | 937 // true iff we expect hostname to match an entry in cert_names. |
| 925 bool expected; | 938 bool expected; |
| 926 // The hostname to match. | 939 // The hostname to match. |
| 927 const char* hostname; | 940 const char* hostname; |
| 928 // Common name, may be used if |dns_names| or |ip_addrs| are empty. | 941 // Common name, may be used if |dns_names| or |ip_addrs| are empty. |
| 929 const char* common_name; | 942 const char* common_name; |
| 930 // Comma separated list of certificate names to match against. Any occurrence | 943 // Comma separated list of certificate names to match against. Any occurrence |
| 931 // of '#' will be replaced with a null character before processing. | 944 // of '#' will be replaced with a null character before processing. |
| 932 const char* dns_names; | 945 const char* dns_names; |
| 933 // Comma separated list of certificate IP Addresses to match against. Each | 946 // Comma separated list of certificate IP Addresses to match against. Each |
| 934 // address is x prefixed 16 byte hex code for v6 or dotted-decimals for v4. | 947 // address is x prefixed 16 byte hex code for v6 or dotted-decimals for v4. |
| 935 const char* ip_addrs; | 948 const char* ip_addrs; |
| 936 }; | 949 }; |
| 937 | 950 |
| 938 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how | 951 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how |
| 939 // to output the parameter that was passed. Without this, it will simply | 952 // to output the parameter that was passed. Without this, it will simply |
| 940 // attempt to print out the first twenty bytes of the object, which depending | 953 // attempt to print out the first twenty bytes of the object, which depending |
| 941 // on platform and alignment, may result in an invalid read. | 954 // on platform and alignment, may result in an invalid read. |
| 942 void PrintTo(const CertificateNameVerifyTestData& data, std::ostream* os) { | 955 void PrintTo(const CertificateNameVerifyTestData& data, std::ostream* os) { |
| 943 ASSERT_TRUE(data.hostname && data.common_name); | 956 ASSERT_TRUE(data.hostname && data.common_name); |
| 944 // Using StringPiece to allow for optional fields being NULL. | 957 // Using StringPiece to allow for optional fields being NULL. |
| 945 *os << " expected: " << data.expected | 958 *os << " expected: " << data.expected << "; hostname: " << data.hostname |
| 946 << "; hostname: " << data.hostname | |
| 947 << "; common_name: " << data.common_name | 959 << "; common_name: " << data.common_name |
| 948 << "; dns_names: " << base::StringPiece(data.dns_names) | 960 << "; dns_names: " << base::StringPiece(data.dns_names) |
| 949 << "; ip_addrs: " << base::StringPiece(data.ip_addrs); | 961 << "; ip_addrs: " << base::StringPiece(data.ip_addrs); |
| 950 } | 962 } |
| 951 | 963 |
| 952 const CertificateNameVerifyTestData kNameVerifyTestData[] = { | 964 const CertificateNameVerifyTestData kNameVerifyTestData[] = { |
| 953 { true, "foo.com", "foo.com" }, | 965 {true, "foo.com", "foo.com"}, |
| 954 { true, "f", "f" }, | 966 {true, "f", "f"}, |
| 955 { false, "h", "i" }, | 967 {false, "h", "i"}, |
| 956 { true, "bar.foo.com", "*.foo.com" }, | 968 {true, "bar.foo.com", "*.foo.com"}, |
| 957 { true, "www.test.fr", "common.name", | 969 {true, "www.test.fr", "common.name", |
| 958 "*.test.com,*.test.co.uk,*.test.de,*.test.fr" }, | 970 "*.test.com,*.test.co.uk,*.test.de,*.test.fr"}, |
| 959 { true, "wwW.tESt.fr", "common.name", | 971 {true, "wwW.tESt.fr", "common.name", ",*.*,*.test.de,*.test.FR,www"}, |
| 960 ",*.*,*.test.de,*.test.FR,www" }, | 972 {false, "f.uk", ".uk"}, |
| 961 { false, "f.uk", ".uk" }, | 973 {false, "w.bar.foo.com", "?.bar.foo.com"}, |
| 962 { false, "w.bar.foo.com", "?.bar.foo.com" }, | 974 {false, "www.foo.com", "(www|ftp).foo.com"}, |
| 963 { false, "www.foo.com", "(www|ftp).foo.com" }, | 975 {false, "www.foo.com", "www.foo.com#"}, // # = null char. |
| 964 { false, "www.foo.com", "www.foo.com#" }, // # = null char. | 976 {false, "www.foo.com", "", "www.foo.com#*.foo.com,#,#"}, |
| 965 { false, "www.foo.com", "", "www.foo.com#*.foo.com,#,#" }, | 977 {false, "www.house.example", "ww.house.example"}, |
| 966 { false, "www.house.example", "ww.house.example" }, | 978 {false, "test.org", "", "www.test.org,*.test.org,*.org"}, |
| 967 { false, "test.org", "", "www.test.org,*.test.org,*.org" }, | 979 {false, "w.bar.foo.com", "w*.bar.foo.com"}, |
| 968 { false, "w.bar.foo.com", "w*.bar.foo.com" }, | 980 {false, "www.bar.foo.com", "ww*ww.bar.foo.com"}, |
| 969 { false, "www.bar.foo.com", "ww*ww.bar.foo.com" }, | 981 {false, "wwww.bar.foo.com", "ww*ww.bar.foo.com"}, |
| 970 { false, "wwww.bar.foo.com", "ww*ww.bar.foo.com" }, | 982 {true, "wwww.bar.foo.com", "w*w.bar.foo.com"}, |
| 971 { true, "wwww.bar.foo.com", "w*w.bar.foo.com" }, | 983 {false, "wwww.bar.foo.com", "w*w.bar.foo.c0m"}, |
| 972 { false, "wwww.bar.foo.com", "w*w.bar.foo.c0m" }, | 984 {true, "WALLY.bar.foo.com", "wa*.bar.foo.com"}, |
| 973 { true, "WALLY.bar.foo.com", "wa*.bar.foo.com" }, | 985 {true, "wally.bar.foo.com", "*Ly.bar.foo.com"}, |
| 974 { true, "wally.bar.foo.com", "*Ly.bar.foo.com" }, | 986 {true, "ww%57.foo.com", "", "www.foo.com"}, |
| 975 { true, "ww%57.foo.com", "", "www.foo.com" }, | 987 {true, "www&.foo.com", "www%26.foo.com"}, |
| 976 { true, "www&.foo.com", "www%26.foo.com" }, | |
| 977 // Common name must not be used if subject alternative name was provided. | 988 // Common name must not be used if subject alternative name was provided. |
| 978 { false, "www.test.co.jp", "www.test.co.jp", | 989 {false, "www.test.co.jp", "www.test.co.jp", |
| 979 "*.test.de,*.jp,www.test.co.uk,www.*.co.jp" }, | 990 "*.test.de,*.jp,www.test.co.uk,www.*.co.jp"}, |
| 980 { false, "www.bar.foo.com", "www.bar.foo.com", | 991 {false, "www.bar.foo.com", "www.bar.foo.com", |
| 981 "*.foo.com,*.*.foo.com,*.*.bar.foo.com,*..bar.foo.com," }, | 992 "*.foo.com,*.*.foo.com,*.*.bar.foo.com,*..bar.foo.com,"}, |
| 982 { false, "www.bath.org", "www.bath.org", "", "20.30.40.50" }, | 993 {false, "www.bath.org", "www.bath.org", "", "20.30.40.50"}, |
| 983 { false, "66.77.88.99", "www.bath.org", "www.bath.org" }, | 994 {false, "66.77.88.99", "www.bath.org", "www.bath.org"}, |
| 984 // IDN tests | 995 // IDN tests |
| 985 { true, "xn--poema-9qae5a.com.br", "xn--poema-9qae5a.com.br" }, | 996 {true, "xn--poema-9qae5a.com.br", "xn--poema-9qae5a.com.br"}, |
| 986 { true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br" }, | 997 {true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br"}, |
| 987 { false, "xn--poema-9qae5a.com.br", "", "*.xn--poema-9qae5a.com.br," | 998 {false, "xn--poema-9qae5a.com.br", "", |
| 988 "xn--poema-*.com.br," | 999 "*.xn--poema-9qae5a.com.br," |
| 989 "xn--*-9qae5a.com.br," | 1000 "xn--poema-*.com.br," |
| 990 "*--poema-9qae5a.com.br" }, | 1001 "xn--*-9qae5a.com.br," |
| 1002 "*--poema-9qae5a.com.br"}, |
| 991 // The following are adapted from the examples quoted from | 1003 // The following are adapted from the examples quoted from |
| 992 // http://tools.ietf.org/html/rfc6125#section-6.4.3 | 1004 // http://tools.ietf.org/html/rfc6125#section-6.4.3 |
| 993 // (e.g., *.example.com would match foo.example.com but | 1005 // (e.g., *.example.com would match foo.example.com but |
| 994 // not bar.foo.example.com or example.com). | 1006 // not bar.foo.example.com or example.com). |
| 995 { true, "foo.example.com", "*.example.com" }, | 1007 {true, "foo.example.com", "*.example.com"}, |
| 996 { false, "bar.foo.example.com", "*.example.com" }, | 1008 {false, "bar.foo.example.com", "*.example.com"}, |
| 997 { false, "example.com", "*.example.com" }, | 1009 {false, "example.com", "*.example.com"}, |
| 998 // (e.g., baz*.example.net and *baz.example.net and b*z.example.net would | 1010 // (e.g., baz*.example.net and *baz.example.net and b*z.example.net would |
| 999 // be taken to match baz1.example.net and foobaz.example.net and | 1011 // be taken to match baz1.example.net and foobaz.example.net and |
| 1000 // buzz.example.net, respectively | 1012 // buzz.example.net, respectively |
| 1001 { true, "baz1.example.net", "baz*.example.net" }, | 1013 {true, "baz1.example.net", "baz*.example.net"}, |
| 1002 { true, "foobaz.example.net", "*baz.example.net" }, | 1014 {true, "foobaz.example.net", "*baz.example.net"}, |
| 1003 { true, "buzz.example.net", "b*z.example.net" }, | 1015 {true, "buzz.example.net", "b*z.example.net"}, |
| 1004 // Wildcards should not be valid for public registry controlled domains, | 1016 // Wildcards should not be valid for public registry controlled domains, |
| 1005 // and unknown/unrecognized domains, at least three domain components must | 1017 // and unknown/unrecognized domains, at least three domain components must |
| 1006 // be present. | 1018 // be present. |
| 1007 { true, "www.test.example", "*.test.example" }, | 1019 {true, "www.test.example", "*.test.example"}, |
| 1008 { true, "test.example.co.uk", "*.example.co.uk" }, | 1020 {true, "test.example.co.uk", "*.example.co.uk"}, |
| 1009 { false, "test.example", "*.exmaple" }, | 1021 {false, "test.example", "*.exmaple"}, |
| 1010 { false, "example.co.uk", "*.co.uk" }, | 1022 {false, "example.co.uk", "*.co.uk"}, |
| 1011 { false, "foo.com", "*.com" }, | 1023 {false, "foo.com", "*.com"}, |
| 1012 { false, "foo.us", "*.us" }, | 1024 {false, "foo.us", "*.us"}, |
| 1013 { false, "foo", "*" }, | 1025 {false, "foo", "*"}, |
| 1014 // IDN variants of wildcards and registry controlled domains. | 1026 // IDN variants of wildcards and registry controlled domains. |
| 1015 { true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br" }, | 1027 {true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br"}, |
| 1016 { true, "test.example.xn--mgbaam7a8h", "*.example.xn--mgbaam7a8h" }, | 1028 {true, "test.example.xn--mgbaam7a8h", "*.example.xn--mgbaam7a8h"}, |
| 1017 { false, "xn--poema-9qae5a.com.br", "*.com.br" }, | 1029 {false, "xn--poema-9qae5a.com.br", "*.com.br"}, |
| 1018 { false, "example.xn--mgbaam7a8h", "*.xn--mgbaam7a8h" }, | 1030 {false, "example.xn--mgbaam7a8h", "*.xn--mgbaam7a8h"}, |
| 1019 // Wildcards should be permissible for 'private' registry controlled | 1031 // Wildcards should be permissible for 'private' registry controlled |
| 1020 // domains. | 1032 // domains. |
| 1021 { true, "www.appspot.com", "*.appspot.com" }, | 1033 {true, "www.appspot.com", "*.appspot.com"}, |
| 1022 { true, "foo.s3.amazonaws.com", "*.s3.amazonaws.com" }, | 1034 {true, "foo.s3.amazonaws.com", "*.s3.amazonaws.com"}, |
| 1023 // Multiple wildcards are not valid. | 1035 // Multiple wildcards are not valid. |
| 1024 { false, "foo.example.com", "*.*.com" }, | 1036 {false, "foo.example.com", "*.*.com"}, |
| 1025 { false, "foo.bar.example.com", "*.bar.*.com" }, | 1037 {false, "foo.bar.example.com", "*.bar.*.com"}, |
| 1026 // Absolute vs relative DNS name tests. Although not explicitly specified | 1038 // Absolute vs relative DNS name tests. Although not explicitly specified |
| 1027 // in RFC 6125, absolute reference names (those ending in a .) should | 1039 // in RFC 6125, absolute reference names (those ending in a .) should |
| 1028 // match either absolute or relative presented names. | 1040 // match either absolute or relative presented names. |
| 1029 { true, "foo.com", "foo.com." }, | 1041 {true, "foo.com", "foo.com."}, |
| 1030 { true, "foo.com.", "foo.com" }, | 1042 {true, "foo.com.", "foo.com"}, |
| 1031 { true, "foo.com.", "foo.com." }, | 1043 {true, "foo.com.", "foo.com."}, |
| 1032 { true, "f", "f." }, | 1044 {true, "f", "f."}, |
| 1033 { true, "f.", "f" }, | 1045 {true, "f.", "f"}, |
| 1034 { true, "f.", "f." }, | 1046 {true, "f.", "f."}, |
| 1035 { true, "www-3.bar.foo.com", "*.bar.foo.com." }, | 1047 {true, "www-3.bar.foo.com", "*.bar.foo.com."}, |
| 1036 { true, "www-3.bar.foo.com.", "*.bar.foo.com" }, | 1048 {true, "www-3.bar.foo.com.", "*.bar.foo.com"}, |
| 1037 { true, "www-3.bar.foo.com.", "*.bar.foo.com." }, | 1049 {true, "www-3.bar.foo.com.", "*.bar.foo.com."}, |
| 1038 { false, ".", "." }, | 1050 {false, ".", "."}, |
| 1039 { false, "example.com", "*.com." }, | 1051 {false, "example.com", "*.com."}, |
| 1040 { false, "example.com.", "*.com" }, | 1052 {false, "example.com.", "*.com"}, |
| 1041 { false, "example.com.", "*.com." }, | 1053 {false, "example.com.", "*.com."}, |
| 1042 { false, "foo.", "*." }, | 1054 {false, "foo.", "*."}, |
| 1043 { false, "foo", "*." }, | 1055 {false, "foo", "*."}, |
| 1044 { false, "foo.co.uk", "*.co.uk." }, | 1056 {false, "foo.co.uk", "*.co.uk."}, |
| 1045 { false, "foo.co.uk.", "*.co.uk." }, | 1057 {false, "foo.co.uk.", "*.co.uk."}, |
| 1046 // IP addresses in common name; IPv4 only. | 1058 // IP addresses in common name; IPv4 only. |
| 1047 { true, "127.0.0.1", "127.0.0.1" }, | 1059 {true, "127.0.0.1", "127.0.0.1"}, |
| 1048 { true, "192.168.1.1", "192.168.1.1" }, | 1060 {true, "192.168.1.1", "192.168.1.1"}, |
| 1049 { true, "676768", "0.10.83.160" }, | 1061 {true, "676768", "0.10.83.160"}, |
| 1050 { true, "1.2.3", "1.2.0.3" }, | 1062 {true, "1.2.3", "1.2.0.3"}, |
| 1051 { false, "192.169.1.1", "192.168.1.1" }, | 1063 {false, "192.169.1.1", "192.168.1.1"}, |
| 1052 { false, "12.19.1.1", "12.19.1.1/255.255.255.0" }, | 1064 {false, "12.19.1.1", "12.19.1.1/255.255.255.0"}, |
| 1053 { false, "FEDC:ba98:7654:3210:FEDC:BA98:7654:3210", | 1065 {false, "FEDC:ba98:7654:3210:FEDC:BA98:7654:3210", |
| 1054 "FEDC:BA98:7654:3210:FEDC:ba98:7654:3210" }, | 1066 "FEDC:BA98:7654:3210:FEDC:ba98:7654:3210"}, |
| 1055 { false, "1111:2222:3333:4444:5555:6666:7777:8888", | 1067 {false, "1111:2222:3333:4444:5555:6666:7777:8888", |
| 1056 "1111:2222:3333:4444:5555:6666:7777:8888" }, | 1068 "1111:2222:3333:4444:5555:6666:7777:8888"}, |
| 1057 { false, "::192.9.5.5", "[::192.9.5.5]" }, | 1069 {false, "::192.9.5.5", "[::192.9.5.5]"}, |
| 1058 // No wildcard matching in valid IP addresses | 1070 // No wildcard matching in valid IP addresses |
| 1059 { false, "::192.9.5.5", "*.9.5.5" }, | 1071 {false, "::192.9.5.5", "*.9.5.5"}, |
| 1060 { false, "2010:836B:4179::836B:4179", "*:836B:4179::836B:4179" }, | 1072 {false, "2010:836B:4179::836B:4179", "*:836B:4179::836B:4179"}, |
| 1061 { false, "192.168.1.11", "*.168.1.11" }, | 1073 {false, "192.168.1.11", "*.168.1.11"}, |
| 1062 { false, "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", "*.]" }, | 1074 {false, "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", "*.]"}, |
| 1063 // IP addresses in subject alternative name (common name ignored) | 1075 // IP addresses in subject alternative name (common name ignored) |
| 1064 { true, "10.1.2.3", "", "", "10.1.2.3" }, | 1076 {true, "10.1.2.3", "", "", "10.1.2.3"}, |
| 1065 { true, "14.15", "", "", "14.0.0.15" }, | 1077 {true, "14.15", "", "", "14.0.0.15"}, |
| 1066 { false, "10.1.2.7", "10.1.2.7", "", "10.1.2.6,10.1.2.8" }, | 1078 {false, "10.1.2.7", "10.1.2.7", "", "10.1.2.6,10.1.2.8"}, |
| 1067 { false, "10.1.2.8", "10.20.2.8", "foo" }, | 1079 {false, "10.1.2.8", "10.20.2.8", "foo"}, |
| 1068 { true, "::4.5.6.7", "", "", "x00000000000000000000000004050607" }, | 1080 {true, "::4.5.6.7", "", "", "x00000000000000000000000004050607"}, |
| 1069 { false, "::6.7.8.9", "::6.7.8.9", "::6.7.8.9", | 1081 {false, "::6.7.8.9", "::6.7.8.9", "::6.7.8.9", |
| 1070 "x00000000000000000000000006070808,x0000000000000000000000000607080a," | 1082 "x00000000000000000000000006070808,x0000000000000000000000000607080a," |
| 1071 "xff000000000000000000000006070809,6.7.8.9" }, | 1083 "xff000000000000000000000006070809,6.7.8.9"}, |
| 1072 { true, "FE80::200:f8ff:fe21:67cf", "no.common.name", "", | 1084 {true, "FE80::200:f8ff:fe21:67cf", "no.common.name", "", |
| 1073 "x00000000000000000000000006070808,xfe800000000000000200f8fffe2167cf," | 1085 "x00000000000000000000000006070808,xfe800000000000000200f8fffe2167cf," |
| 1074 "xff0000000000000000000000060708ff,10.0.0.1" }, | 1086 "xff0000000000000000000000060708ff,10.0.0.1"}, |
| 1075 // Numeric only hostnames (none of these are considered valid IP addresses). | 1087 // Numeric only hostnames (none of these are considered valid IP addresses). |
| 1076 { false, "12345.6", "12345.6" }, | 1088 {false, "12345.6", "12345.6"}, |
| 1077 { false, "121.2.3.512", "", "1*1.2.3.512,*1.2.3.512,1*.2.3.512,*.2.3.512", | 1089 {false, "121.2.3.512", "", "1*1.2.3.512,*1.2.3.512,1*.2.3.512,*.2.3.512", |
| 1078 "121.2.3.0"}, | 1090 "121.2.3.0"}, |
| 1079 { false, "1.2.3.4.5.6", "*.2.3.4.5.6" }, | 1091 {false, "1.2.3.4.5.6", "*.2.3.4.5.6"}, |
| 1080 { true, "1.2.3.4.5", "", "1.2.3.4.5" }, | 1092 {true, "1.2.3.4.5", "", "1.2.3.4.5"}, |
| 1081 // Invalid host names. | 1093 // Invalid host names. |
| 1082 { false, "junk)(£)$*!@~#", "junk)(£)$*!@~#" }, | 1094 {false, "junk)(£)$*!@~#", "junk)(£)$*!@~#"}, |
| 1083 { false, "www.*.com", "www.*.com" }, | 1095 {false, "www.*.com", "www.*.com"}, |
| 1084 { false, "w$w.f.com", "w$w.f.com" }, | 1096 {false, "w$w.f.com", "w$w.f.com"}, |
| 1085 { false, "nocolonallowed:example", "", "nocolonallowed:example" }, | 1097 {false, "nocolonallowed:example", "", "nocolonallowed:example"}, |
| 1086 { false, "www-1.[::FFFF:129.144.52.38]", "*.[::FFFF:129.144.52.38]" }, | 1098 {false, "www-1.[::FFFF:129.144.52.38]", "*.[::FFFF:129.144.52.38]"}, |
| 1087 { false, "[::4.5.6.9]", "", "", "x00000000000000000000000004050609" }, | 1099 {false, "[::4.5.6.9]", "", "", "x00000000000000000000000004050609"}, |
| 1088 }; | 1100 }; |
| 1089 | 1101 |
| 1090 class X509CertificateNameVerifyTest | 1102 class X509CertificateNameVerifyTest |
| 1091 : public testing::TestWithParam<CertificateNameVerifyTestData> { | 1103 : public testing::TestWithParam<CertificateNameVerifyTestData> {}; |
| 1092 }; | |
| 1093 | 1104 |
| 1094 TEST_P(X509CertificateNameVerifyTest, VerifyHostname) { | 1105 TEST_P(X509CertificateNameVerifyTest, VerifyHostname) { |
| 1095 CertificateNameVerifyTestData test_data = GetParam(); | 1106 CertificateNameVerifyTestData test_data = GetParam(); |
| 1096 | 1107 |
| 1097 std::string common_name(test_data.common_name); | 1108 std::string common_name(test_data.common_name); |
| 1098 ASSERT_EQ(std::string::npos, common_name.find(',')); | 1109 ASSERT_EQ(std::string::npos, common_name.find(',')); |
| 1099 std::replace(common_name.begin(), common_name.end(), '#', '\0'); | 1110 std::replace(common_name.begin(), common_name.end(), '#', '\0'); |
| 1100 | 1111 |
| 1101 std::vector<std::string> dns_names, ip_addressses; | 1112 std::vector<std::string> dns_names, ip_addressses; |
| 1102 if (test_data.dns_names) { | 1113 if (test_data.dns_names) { |
| 1103 // Build up the certificate DNS names list. | 1114 // Build up the certificate DNS names list. |
| 1104 std::string dns_name_line(test_data.dns_names); | 1115 std::string dns_name_line(test_data.dns_names); |
| 1105 std::replace(dns_name_line.begin(), dns_name_line.end(), '#', '\0'); | 1116 std::replace(dns_name_line.begin(), dns_name_line.end(), '#', '\0'); |
| 1106 base::SplitString(dns_name_line, ',', &dns_names); | 1117 base::SplitString(dns_name_line, ',', &dns_names); |
| 1107 } | 1118 } |
| 1108 | 1119 |
| 1109 if (test_data.ip_addrs) { | 1120 if (test_data.ip_addrs) { |
| 1110 // Build up the certificate IP address list. | 1121 // Build up the certificate IP address list. |
| 1111 std::string ip_addrs_line(test_data.ip_addrs); | 1122 std::string ip_addrs_line(test_data.ip_addrs); |
| 1112 std::vector<std::string> ip_addressses_ascii; | 1123 std::vector<std::string> ip_addressses_ascii; |
| 1113 base::SplitString(ip_addrs_line, ',', &ip_addressses_ascii); | 1124 base::SplitString(ip_addrs_line, ',', &ip_addressses_ascii); |
| 1114 for (size_t i = 0; i < ip_addressses_ascii.size(); ++i) { | 1125 for (size_t i = 0; i < ip_addressses_ascii.size(); ++i) { |
| 1115 std::string& addr_ascii = ip_addressses_ascii[i]; | 1126 std::string& addr_ascii = ip_addressses_ascii[i]; |
| 1116 ASSERT_NE(0U, addr_ascii.length()); | 1127 ASSERT_NE(0U, addr_ascii.length()); |
| 1117 if (addr_ascii[0] == 'x') { // Hex encoded address | 1128 if (addr_ascii[0] == 'x') { // Hex encoded address |
| 1118 addr_ascii.erase(0, 1); | 1129 addr_ascii.erase(0, 1); |
| 1119 std::vector<uint8> bytes; | 1130 std::vector<uint8> bytes; |
| 1120 EXPECT_TRUE(base::HexStringToBytes(addr_ascii, &bytes)) | 1131 EXPECT_TRUE(base::HexStringToBytes(addr_ascii, &bytes)) |
| 1121 << "Could not parse hex address " << addr_ascii << " i = " << i; | 1132 << "Could not parse hex address " << addr_ascii << " i = " << i; |
| 1122 ip_addressses.push_back(std::string(reinterpret_cast<char*>(&bytes[0]), | 1133 ip_addressses.push_back( |
| 1123 bytes.size())); | 1134 std::string(reinterpret_cast<char*>(&bytes[0]), bytes.size())); |
| 1124 ASSERT_EQ(16U, ip_addressses.back().size()) << i; | 1135 ASSERT_EQ(16U, ip_addressses.back().size()) << i; |
| 1125 } else { // Decimal groups | 1136 } else { // Decimal groups |
| 1126 std::vector<std::string> decimals_ascii; | 1137 std::vector<std::string> decimals_ascii; |
| 1127 base::SplitString(addr_ascii, '.', &decimals_ascii); | 1138 base::SplitString(addr_ascii, '.', &decimals_ascii); |
| 1128 EXPECT_EQ(4U, decimals_ascii.size()) << i; | 1139 EXPECT_EQ(4U, decimals_ascii.size()) << i; |
| 1129 std::string addr_bytes; | 1140 std::string addr_bytes; |
| 1130 for (size_t j = 0; j < decimals_ascii.size(); ++j) { | 1141 for (size_t j = 0; j < decimals_ascii.size(); ++j) { |
| 1131 int decimal_value; | 1142 int decimal_value; |
| 1132 EXPECT_TRUE(base::StringToInt(decimals_ascii[j], &decimal_value)); | 1143 EXPECT_TRUE(base::StringToInt(decimals_ascii[j], &decimal_value)); |
| 1133 EXPECT_GE(decimal_value, 0); | 1144 EXPECT_GE(decimal_value, 0); |
| 1134 EXPECT_LE(decimal_value, 255); | 1145 EXPECT_LE(decimal_value, 255); |
| 1135 addr_bytes.push_back(static_cast<char>(decimal_value)); | 1146 addr_bytes.push_back(static_cast<char>(decimal_value)); |
| 1136 } | 1147 } |
| 1137 ip_addressses.push_back(addr_bytes); | 1148 ip_addressses.push_back(addr_bytes); |
| 1138 ASSERT_EQ(4U, ip_addressses.back().size()) << i; | 1149 ASSERT_EQ(4U, ip_addressses.back().size()) << i; |
| 1139 } | 1150 } |
| 1140 } | 1151 } |
| 1141 } | 1152 } |
| 1142 | 1153 |
| 1143 bool unused = false; | 1154 bool unused = false; |
| 1144 EXPECT_EQ(test_data.expected, X509Certificate::VerifyHostname( | 1155 EXPECT_EQ( |
| 1145 test_data.hostname, common_name, dns_names, ip_addressses, &unused)); | 1156 test_data.expected, |
| 1157 X509Certificate::VerifyHostname( |
| 1158 test_data.hostname, common_name, dns_names, ip_addressses, &unused)); |
| 1146 } | 1159 } |
| 1147 | 1160 |
| 1148 INSTANTIATE_TEST_CASE_P(, X509CertificateNameVerifyTest, | 1161 INSTANTIATE_TEST_CASE_P(, |
| 1162 X509CertificateNameVerifyTest, |
| 1149 testing::ValuesIn(kNameVerifyTestData)); | 1163 testing::ValuesIn(kNameVerifyTestData)); |
| 1150 | 1164 |
| 1151 const struct PublicKeyInfoTestData { | 1165 const struct PublicKeyInfoTestData { |
| 1152 const char* cert_file; | 1166 const char* cert_file; |
| 1153 size_t expected_bits; | 1167 size_t expected_bits; |
| 1154 X509Certificate::PublicKeyType expected_type; | 1168 X509Certificate::PublicKeyType expected_type; |
| 1155 } kPublicKeyInfoTestData[] = { | 1169 } kPublicKeyInfoTestData[] = { |
| 1156 { "768-rsa-ee-by-768-rsa-intermediate.pem", 768, | 1170 {"768-rsa-ee-by-768-rsa-intermediate.pem", 768, |
| 1157 X509Certificate::kPublicKeyTypeRSA }, | 1171 X509Certificate::kPublicKeyTypeRSA}, |
| 1158 { "1024-rsa-ee-by-768-rsa-intermediate.pem", 1024, | 1172 {"1024-rsa-ee-by-768-rsa-intermediate.pem", 1024, |
| 1159 X509Certificate::kPublicKeyTypeRSA }, | 1173 X509Certificate::kPublicKeyTypeRSA}, |
| 1160 { "prime256v1-ecdsa-ee-by-1024-rsa-intermediate.pem", 256, | 1174 {"prime256v1-ecdsa-ee-by-1024-rsa-intermediate.pem", 256, |
| 1161 X509Certificate::kPublicKeyTypeECDSA }, | 1175 X509Certificate::kPublicKeyTypeECDSA}, |
| 1162 }; | 1176 }; |
| 1163 | 1177 |
| 1164 class X509CertificatePublicKeyInfoTest | 1178 class X509CertificatePublicKeyInfoTest |
| 1165 : public testing::TestWithParam<PublicKeyInfoTestData> { | 1179 : public testing::TestWithParam<PublicKeyInfoTestData> {}; |
| 1166 }; | |
| 1167 | 1180 |
| 1168 TEST_P(X509CertificatePublicKeyInfoTest, GetPublicKeyInfo) { | 1181 TEST_P(X509CertificatePublicKeyInfoTest, GetPublicKeyInfo) { |
| 1169 PublicKeyInfoTestData data = GetParam(); | 1182 PublicKeyInfoTestData data = GetParam(); |
| 1170 | 1183 |
| 1171 #if defined(OS_WIN) | 1184 #if defined(OS_WIN) |
| 1172 if (base::win::GetVersion() < base::win::VERSION_VISTA && | 1185 if (base::win::GetVersion() < base::win::VERSION_VISTA && |
| 1173 data.expected_type == X509Certificate::kPublicKeyTypeECDSA) { | 1186 data.expected_type == X509Certificate::kPublicKeyTypeECDSA) { |
| 1174 // ECC is only supported on Vista+. Skip the test. | 1187 // ECC is only supported on Vista+. Skip the test. |
| 1175 return; | 1188 return; |
| 1176 } | 1189 } |
| 1177 #endif | 1190 #endif |
| 1178 | 1191 |
| 1179 scoped_refptr<X509Certificate> cert( | 1192 scoped_refptr<X509Certificate> cert( |
| 1180 ImportCertFromFile(GetTestCertsDirectory(), data.cert_file)); | 1193 ImportCertFromFile(GetTestCertsDirectory(), data.cert_file)); |
| 1181 ASSERT_TRUE(cert.get()); | 1194 ASSERT_TRUE(cert.get()); |
| 1182 | 1195 |
| 1183 size_t actual_bits = 0; | 1196 size_t actual_bits = 0; |
| 1184 X509Certificate::PublicKeyType actual_type = | 1197 X509Certificate::PublicKeyType actual_type = |
| 1185 X509Certificate::kPublicKeyTypeUnknown; | 1198 X509Certificate::kPublicKeyTypeUnknown; |
| 1186 | 1199 |
| 1187 X509Certificate::GetPublicKeyInfo(cert->os_cert_handle(), &actual_bits, | 1200 X509Certificate::GetPublicKeyInfo( |
| 1188 &actual_type); | 1201 cert->os_cert_handle(), &actual_bits, &actual_type); |
| 1189 | 1202 |
| 1190 EXPECT_EQ(data.expected_bits, actual_bits); | 1203 EXPECT_EQ(data.expected_bits, actual_bits); |
| 1191 EXPECT_EQ(data.expected_type, actual_type); | 1204 EXPECT_EQ(data.expected_type, actual_type); |
| 1192 } | 1205 } |
| 1193 | 1206 |
| 1194 INSTANTIATE_TEST_CASE_P(, X509CertificatePublicKeyInfoTest, | 1207 INSTANTIATE_TEST_CASE_P(, |
| 1208 X509CertificatePublicKeyInfoTest, |
| 1195 testing::ValuesIn(kPublicKeyInfoTestData)); | 1209 testing::ValuesIn(kPublicKeyInfoTestData)); |
| 1196 | 1210 |
| 1197 } // namespace net | 1211 } // namespace net |
| OLD | NEW |