Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(941)

Side by Side Diff: net/base/x509_certificate_unittest.cc

Issue 3112013: Move chain building/verification out of X509Certificate (Closed)
Patch Set: Rebase to trunk - Without OpenSSL fixes Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "base/file_path.h" 5 #include "base/file_path.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/path_service.h" 7 #include "base/path_service.h"
8 #include "base/pickle.h" 8 #include "base/pickle.h"
9 #include "net/base/cert_status_flags.h" 9 #include "net/base/cert_status_flags.h"
10 #include "net/base/cert_test_util.h" 10 #include "net/base/cert_test_util.h"
11 #include "net/base/cert_verify_result.h" 11 #include "net/base/cert_verify_result.h"
12 #include "net/base/net_errors.h" 12 #include "net/base/net_errors.h"
13 #include "net/base/test_certificate_data.h" 13 #include "net/base/test_certificate_data.h"
14 #include "net/base/x509_certificate.h" 14 #include "net/base/x509_certificate.h"
15 #include "net/base/x509_chain.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 17
17 // Unit tests aren't allowed to access external resources. Unfortunately, to 18 // Unit tests aren't allowed to access external resources. Unfortunately, to
18 // properly verify the EV-ness of a cert, we need to check for its revocation 19 // properly verify the EV-ness of a cert, we need to check for its revocation
19 // through online servers. If you're manually running unit tests, feel free to 20 // through online servers. If you're manually running unit tests, feel free to
20 // turn this on to test EV certs. But leave it turned off for the automated 21 // turn this on to test EV certs. But leave it turned off for the automated
21 // testing. 22 // testing.
22 #define ALLOW_EXTERNAL_ACCESS 0 23 #define ALLOW_EXTERNAL_ACCESS 0
23 24
24 #if ALLOW_EXTERNAL_ACCESS && defined(OS_WIN) 25 #if ALLOW_EXTERNAL_ACCESS && defined(OS_WIN)
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 EXPECT_EQ(expected_fingerprint[i], fingerprint.data[i]); 238 EXPECT_EQ(expected_fingerprint[i], fingerprint.data[i]);
238 239
239 std::vector<std::string> dns_names; 240 std::vector<std::string> dns_names;
240 google_cert->GetDNSNames(&dns_names); 241 google_cert->GetDNSNames(&dns_names);
241 ASSERT_EQ(1U, dns_names.size()); 242 ASSERT_EQ(1U, dns_names.size());
242 EXPECT_EQ("www.google.com", dns_names[0]); 243 EXPECT_EQ("www.google.com", dns_names[0]);
243 244
244 #if TEST_EV 245 #if TEST_EV
245 // TODO(avi): turn this on for the Mac once EV checking is implemented. 246 // TODO(avi): turn this on for the Mac once EV checking is implemented.
246 CertVerifyResult verify_result; 247 CertVerifyResult verify_result;
247 int flags = X509Certificate::VERIFY_REV_CHECKING_ENABLED | 248 int flags = x509_chain::VERIFY_REV_CHECKING_ENABLED |
248 X509Certificate::VERIFY_EV_CERT; 249 x509_chain::VERIFY_EV_CERT;
249 EXPECT_EQ(OK, google_cert->Verify("www.google.com", flags, &verify_result)); 250 EXPECT_EQ(OK, x509_chain::VerifySSLServer(google_cert, "www.google.com",
251 flags, &verify_result));
250 EXPECT_EQ(0, verify_result.cert_status & CERT_STATUS_IS_EV); 252 EXPECT_EQ(0, verify_result.cert_status & CERT_STATUS_IS_EV);
251 #endif 253 #endif
252 } 254 }
253 255
254 TEST(X509CertificateTest, GoogleCertParsing) { 256 TEST(X509CertificateTest, GoogleCertParsing) {
255 scoped_refptr<X509Certificate> google_cert = 257 scoped_refptr<X509Certificate> google_cert =
256 X509Certificate::CreateFromBytes( 258 X509Certificate::CreateFromBytes(
257 reinterpret_cast<const char*>(google_der), sizeof(google_der)); 259 reinterpret_cast<const char*>(google_der), sizeof(google_der));
258 260
259 CheckGoogleCert(google_cert, google_fingerprint, 261 CheckGoogleCert(google_cert, google_fingerprint,
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 const SHA1Fingerprint& fingerprint = thawte_cert->fingerprint(); 359 const SHA1Fingerprint& fingerprint = thawte_cert->fingerprint();
358 for (size_t i = 0; i < 20; ++i) 360 for (size_t i = 0; i < 20; ++i)
359 EXPECT_EQ(thawte_fingerprint[i], fingerprint.data[i]); 361 EXPECT_EQ(thawte_fingerprint[i], fingerprint.data[i]);
360 362
361 std::vector<std::string> dns_names; 363 std::vector<std::string> dns_names;
362 thawte_cert->GetDNSNames(&dns_names); 364 thawte_cert->GetDNSNames(&dns_names);
363 ASSERT_EQ(1U, dns_names.size()); 365 ASSERT_EQ(1U, dns_names.size());
364 EXPECT_EQ("www.thawte.com", dns_names[0]); 366 EXPECT_EQ("www.thawte.com", dns_names[0]);
365 367
366 #if TEST_EV 368 #if TEST_EV
367 int flags = X509Certificate::VERIFY_REV_CHECKING_ENABLED | 369 int flags = x509_chain::VERIFY_REV_CHECKING_ENABLED |
368 X509Certificate::VERIFY_EV_CERT; 370 x509_chain::VERIFY_EV_CERT;
369 CertVerifyResult verify_result; 371 CertVerifyResult verify_result;
370 // EV cert verification requires revocation checking. 372 // EV cert verification requires revocation checking.
371 EXPECT_EQ(OK, thawte_cert->Verify("www.thawte.com", flags, &verify_result)); 373 EXPECT_EQ(OK, thawte_cert->Verify("www.thawte.com", flags, &verify_result));
372 EXPECT_NE(0, verify_result.cert_status & CERT_STATUS_IS_EV); 374 EXPECT_NE(0, verify_result.cert_status & CERT_STATUS_IS_EV);
373 // Consequently, if we don't have revocation checking enabled, we can't claim 375 // Consequently, if we don't have revocation checking enabled, we can't claim
374 // any cert is EV. 376 // any cert is EV.
375 flags = X509Certificate::VERIFY_EV_CERT; 377 flags = X509Certificate::VERIFY_EV_CERT;
376 EXPECT_EQ(OK, thawte_cert->Verify("www.thawte.com", flags, &verify_result)); 378 EXPECT_EQ(OK, thawte_cert->Verify("www.thawte.com", flags, &verify_result));
377 EXPECT_EQ(0, verify_result.cert_status & CERT_STATUS_IS_EV); 379 EXPECT_EQ(0, verify_result.cert_status & CERT_STATUS_IS_EV);
378 #endif 380 #endif
379 } 381 }
380 382
381 TEST(X509CertificateTest, PaypalNullCertParsing) { 383 TEST(X509CertificateTest, PaypalNullCertParsing) {
382 scoped_refptr<X509Certificate> paypal_null_cert = 384 scoped_refptr<X509Certificate> paypal_null_cert =
383 X509Certificate::CreateFromBytes( 385 X509Certificate::CreateFromBytes(
384 reinterpret_cast<const char*>(paypal_null_der), 386 reinterpret_cast<const char*>(paypal_null_der),
385 sizeof(paypal_null_der)); 387 sizeof(paypal_null_der));
386 388
387 ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert); 389 ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert);
388 390
389 const SHA1Fingerprint& fingerprint = 391 const SHA1Fingerprint& fingerprint =
390 paypal_null_cert->fingerprint(); 392 paypal_null_cert->fingerprint();
391 for (size_t i = 0; i < 20; ++i) 393 for (size_t i = 0; i < 20; ++i)
392 EXPECT_EQ(paypal_null_fingerprint[i], fingerprint.data[i]); 394 EXPECT_EQ(paypal_null_fingerprint[i], fingerprint.data[i]);
393 395
394 int flags = 0; 396 int flags = 0;
395 CertVerifyResult verify_result; 397 CertVerifyResult verify_result;
396 int error = paypal_null_cert->Verify("www.paypal.com", flags, 398 int error = x509_chain::VerifySSLServer(paypal_null_cert, "www.paypal.com",
397 &verify_result); 399 flags, &verify_result);
398 EXPECT_NE(OK, error); 400 EXPECT_NE(OK, error);
399 // Either the system crypto library should correctly report a certificate 401 // Either the system crypto library should correctly report a certificate
400 // name mismatch, or our certificate blacklist should cause us to report an 402 // name mismatch, or our certificate blacklist should cause us to report an
401 // invalid certificate. 403 // invalid certificate.
402 #if !defined(OS_MACOSX) && !defined(USE_OPENSSL) 404 #if !defined(OS_MACOSX) && !defined(USE_OPENSSL)
403 EXPECT_NE(0, verify_result.cert_status & 405 EXPECT_NE(0, verify_result.cert_status &
404 (CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_INVALID)); 406 (CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_INVALID));
405 #endif 407 #endif
406 } 408 }
407 409
408 // A certificate whose AIA extension contains an LDAP URL without a host name. 410 // A certificate whose AIA extension contains an LDAP URL without a host name.
409 // This certificate will expire on 2011-09-08. 411 // This certificate will expire on 2011-09-08.
410 TEST(X509CertificateTest, UnoSoftCertParsing) { 412 TEST(X509CertificateTest, UnoSoftCertParsing) {
411 FilePath certs_dir = GetTestCertsDirectory(); 413 FilePath certs_dir = GetTestCertsDirectory();
412 scoped_refptr<X509Certificate> unosoft_hu_cert = 414 scoped_refptr<X509Certificate> unosoft_hu_cert =
413 ImportCertFromFile(certs_dir, "unosoft_hu_cert.der"); 415 ImportCertFromFile(certs_dir, "unosoft_hu_cert.der");
414 416
415 ASSERT_NE(static_cast<X509Certificate*>(NULL), unosoft_hu_cert); 417 ASSERT_NE(static_cast<X509Certificate*>(NULL), unosoft_hu_cert);
416 418
417 const SHA1Fingerprint& fingerprint = 419 const SHA1Fingerprint& fingerprint =
418 unosoft_hu_cert->fingerprint(); 420 unosoft_hu_cert->fingerprint();
419 for (size_t i = 0; i < 20; ++i) 421 for (size_t i = 0; i < 20; ++i)
420 EXPECT_EQ(unosoft_hu_fingerprint[i], fingerprint.data[i]); 422 EXPECT_EQ(unosoft_hu_fingerprint[i], fingerprint.data[i]);
421 423
422 int flags = 0; 424 int flags = 0;
423 CertVerifyResult verify_result; 425 CertVerifyResult verify_result;
424 int error = unosoft_hu_cert->Verify("www.unosoft.hu", flags, 426 int error = x509_chain::VerifySSLServer(unosoft_hu_cert, "www.unosoft.hu",
425 &verify_result); 427 flags, &verify_result);
426 EXPECT_NE(OK, error); 428 EXPECT_NE(OK, error);
427 EXPECT_NE(0, verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID); 429 EXPECT_NE(0, verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
428 } 430 }
429 431
430 #if defined(USE_NSS) || defined(USE_OPENSSL) 432 #if defined(USE_NSS) || defined(USE_OPENSSL)
431 // A regression test for http://crbug.com/31497. 433 // A regression test for http://crbug.com/31497.
432 // This certificate will expire on 2012-04-08. 434 // This certificate will expire on 2012-04-08.
433 // TODO(wtc): we can't run this test on Mac because MacTrustedCertificates 435 // TODO(wtc): we can't run this test on Mac because MacTrustedCertificates
434 // can hold only one additional trusted root certificate for unit tests. 436 // can hold only one additional trusted root certificate for unit tests.
435 // TODO(wtc): we can't run this test on Windows because LoadTemporaryRootCert 437 // TODO(wtc): we can't run this test on Windows because LoadTemporaryRootCert
(...skipping 17 matching lines...) Expand all
453 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert); 455 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert);
454 456
455 X509Certificate::OSCertHandles intermediates; 457 X509Certificate::OSCertHandles intermediates;
456 intermediates.push_back(intermediate_cert->os_cert_handle()); 458 intermediates.push_back(intermediate_cert->os_cert_handle());
457 scoped_refptr<X509Certificate> cert_chain = 459 scoped_refptr<X509Certificate> cert_chain =
458 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), 460 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
459 intermediates); 461 intermediates);
460 462
461 int flags = 0; 463 int flags = 0;
462 CertVerifyResult verify_result; 464 CertVerifyResult verify_result;
463 int error = cert_chain->Verify("www.us.army.mil", flags, &verify_result); 465 int error = x509_chain::VerifySSLServer(server_cert, "www.us.army.mil",
466 flags, &verify_result);
464 EXPECT_EQ(OK, error); 467 EXPECT_EQ(OK, error);
465 EXPECT_EQ(0, verify_result.cert_status); 468 EXPECT_EQ(0, verify_result.cert_status);
466 } 469 }
467 #endif 470 #endif
468 471
469 // Tests X509Certificate::Cache via X509Certificate::CreateFromHandle. We 472 // Tests X509Certificate::Cache via X509Certificate::CreateFromHandle. We
470 // call X509Certificate::CreateFromHandle several times and observe whether 473 // call X509Certificate::CreateFromHandle several times and observe whether
471 // it returns a cached or new X509Certificate object. 474 // it returns a cached or new X509Certificate object.
472 // 475 //
473 // All the OS certificate handles in this test are actually from the same 476 // All the OS certificate handles in this test are actually from the same
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 720
718 for (size_t j = 0; j < 20; ++j) 721 for (size_t j = 0; j < 20; ++j)
719 EXPECT_EQ(expected_fingerprint[j], actual_fingerprint.data[j]); 722 EXPECT_EQ(expected_fingerprint[j], actual_fingerprint.data[j]);
720 } 723 }
721 } 724 }
722 725
723 INSTANTIATE_TEST_CASE_P(, X509CertificateParseTest, 726 INSTANTIATE_TEST_CASE_P(, X509CertificateParseTest,
724 testing::ValuesIn(FormatTestData)); 727 testing::ValuesIn(FormatTestData));
725 728
726 } // namespace net 729 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698