Chromium Code Reviews| 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 <cert.h> | 5 #include <cert.h> |
| 6 #include <pk11pub.h> | 6 #include <pk11pub.h> |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 | 9 |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 if (cert_data.empty()) | 81 if (cert_data.empty()) |
| 82 return false; | 82 return false; |
| 83 | 83 |
| 84 X509Certificate* cert = X509Certificate::CreateFromBytes( | 84 X509Certificate* cert = X509Certificate::CreateFromBytes( |
| 85 cert_data.data(), cert_data.size()); | 85 cert_data.data(), cert_data.size()); |
| 86 if (!cert) | 86 if (!cert) |
| 87 return false; | 87 return false; |
| 88 | 88 |
| 89 certs->push_back(cert); | 89 certs->push_back(cert); |
| 90 return true; | 90 return true; |
| 91 } | 91 } |
|
Ryan Sleevi
2012/03/29 23:35:13
Can you use the net/test/cert_test_util function h
mattm
2012/05/16 03:30:45
Done.
| |
| 92 | 92 |
| 93 static CertificateList ListCertsInSlot(PK11SlotInfo* slot) { | 93 static CertificateList ListCertsInSlot(PK11SlotInfo* slot) { |
| 94 CertificateList result; | 94 CertificateList result; |
| 95 CERTCertList* cert_list = PK11_ListCertsInSlot(slot); | 95 CERTCertList* cert_list = PK11_ListCertsInSlot(slot); |
| 96 for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); | 96 for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); |
| 97 !CERT_LIST_END(node, cert_list); | 97 !CERT_LIST_END(node, cert_list); |
| 98 node = CERT_LIST_NEXT(node)) { | 98 node = CERT_LIST_NEXT(node)) { |
| 99 result.push_back(X509Certificate::CreateFromHandle( | 99 result.push_back(X509Certificate::CreateFromHandle( |
| 100 node->cert, X509Certificate::OSCertHandles())); | 100 node->cert, X509Certificate::OSCertHandles())); |
| 101 } | 101 } |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 528 // Need to import intermediate cert for the verify of google cert, otherwise | 528 // Need to import intermediate cert for the verify of google cert, otherwise |
| 529 // it will try to fetch it automatically with cert_pi_useAIACertFetch, which | 529 // it will try to fetch it automatically with cert_pi_useAIACertFetch, which |
| 530 // will cause OCSPCreateSession on the main thread, which is not allowed. | 530 // will cause OCSPCreateSession on the main thread, which is not allowed. |
| 531 std::string cert_data = ReadTestFile("google.chain.pem"); | 531 std::string cert_data = ReadTestFile("google.chain.pem"); |
| 532 CertificateList certs = | 532 CertificateList certs = |
| 533 X509Certificate::CreateCertificateListFromBytes( | 533 X509Certificate::CreateCertificateListFromBytes( |
| 534 cert_data.data(), cert_data.size(), X509Certificate::FORMAT_AUTO); | 534 cert_data.data(), cert_data.size(), X509Certificate::FORMAT_AUTO); |
| 535 ASSERT_EQ(2U, certs.size()); | 535 ASSERT_EQ(2U, certs.size()); |
| 536 | 536 |
| 537 CertDatabase::ImportCertFailureList failed; | 537 CertDatabase::ImportCertFailureList failed; |
| 538 EXPECT_TRUE(cert_db_.ImportServerCert(certs, &failed)); | 538 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::UNTRUSTED, |
| 539 &failed)); | |
| 539 | 540 |
| 540 EXPECT_EQ(0U, failed.size()); | 541 EXPECT_EQ(0U, failed.size()); |
| 541 | 542 |
| 542 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); | 543 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); |
| 543 ASSERT_EQ(2U, cert_list.size()); | 544 ASSERT_EQ(2U, cert_list.size()); |
| 544 scoped_refptr<X509Certificate> goog_cert(cert_list[0]); | 545 scoped_refptr<X509Certificate> goog_cert(cert_list[0]); |
| 545 scoped_refptr<X509Certificate> thawte_cert(cert_list[1]); | 546 scoped_refptr<X509Certificate> thawte_cert(cert_list[1]); |
| 546 EXPECT_EQ("www.google.com", goog_cert->subject().common_name); | 547 EXPECT_EQ("www.google.com", goog_cert->subject().common_name); |
| 547 EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name); | 548 EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name); |
| 548 | 549 |
| 549 EXPECT_EQ(CertDatabase::UNTRUSTED, | 550 EXPECT_EQ(CertDatabase::UNTRUSTED, |
| 550 cert_db_.GetCertTrust(goog_cert.get(), SERVER_CERT)); | 551 cert_db_.GetCertTrust(goog_cert.get(), SERVER_CERT)); |
| 551 psm::nsNSSCertTrust goog_trust(goog_cert->os_cert_handle()->trust); | 552 psm::nsNSSCertTrust goog_trust(goog_cert->os_cert_handle()->trust); |
| 552 EXPECT_TRUE(goog_trust.HasPeer(PR_TRUE, PR_TRUE, PR_TRUE)); | 553 EXPECT_TRUE(goog_trust.HasTerminalRecord(PR_TRUE, PR_TRUE, PR_TRUE)); |
| 553 | 554 |
| 554 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); | 555 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); |
| 555 int flags = 0; | 556 int flags = 0; |
| 556 CertVerifyResult verify_result; | 557 CertVerifyResult verify_result; |
| 557 int error = verify_proc->Verify(goog_cert, "www.google.com", flags, | 558 int error = verify_proc->Verify(goog_cert, "www.google.com", flags, |
| 558 NULL, &verify_result); | 559 NULL, &verify_result); |
| 559 EXPECT_EQ(OK, error); | 560 EXPECT_EQ(OK, error); |
| 560 EXPECT_EQ(0U, verify_result.cert_status); | 561 EXPECT_EQ(0U, verify_result.cert_status); |
| 561 } | 562 } |
| 562 | 563 |
| 563 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) { | 564 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) { |
| 564 CertificateList certs; | 565 CertificateList certs; |
| 565 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs)); | 566 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs)); |
| 566 | 567 |
| 567 CertDatabase::ImportCertFailureList failed; | 568 CertDatabase::ImportCertFailureList failed; |
| 568 EXPECT_TRUE(cert_db_.ImportServerCert(certs, &failed)); | 569 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::UNTRUSTED, |
| 570 &failed)); | |
| 569 | 571 |
| 570 EXPECT_EQ(0U, failed.size()); | 572 EXPECT_EQ(0U, failed.size()); |
| 571 | 573 |
| 572 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); | 574 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); |
| 573 ASSERT_EQ(1U, cert_list.size()); | 575 ASSERT_EQ(1U, cert_list.size()); |
| 574 scoped_refptr<X509Certificate> puny_cert(cert_list[0]); | 576 scoped_refptr<X509Certificate> puny_cert(cert_list[0]); |
| 575 | 577 |
| 576 EXPECT_EQ(CertDatabase::UNTRUSTED, | 578 EXPECT_EQ(CertDatabase::UNTRUSTED, |
| 577 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT)); | 579 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT)); |
| 578 psm::nsNSSCertTrust puny_trust(puny_cert->os_cert_handle()->trust); | 580 psm::nsNSSCertTrust puny_trust(puny_cert->os_cert_handle()->trust); |
| 579 EXPECT_TRUE(puny_trust.HasPeer(PR_TRUE, PR_TRUE, PR_TRUE)); | 581 EXPECT_FALSE(puny_trust.HasTerminalRecord(PR_TRUE, PR_FALSE, PR_FALSE)); |
| 582 EXPECT_FALSE(puny_trust.HasTerminalRecord(PR_FALSE, PR_TRUE, PR_FALSE)); | |
| 583 EXPECT_FALSE(puny_trust.HasTerminalRecord(PR_FALSE, PR_FALSE, PR_TRUE)); | |
| 580 | 584 |
| 581 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); | 585 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); |
| 582 int flags = 0; | 586 int flags = 0; |
| 583 CertVerifyResult verify_result; | 587 CertVerifyResult verify_result; |
| 584 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, | 588 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, |
| 585 NULL, &verify_result); | 589 NULL, &verify_result); |
| 586 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error); | 590 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error); |
| 587 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); | 591 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); |
| 588 | 592 |
| 589 // TODO(mattm): this should be SERVER_CERT, not CA_CERT, but that does not | 593 // TODO(mattm): this should be SERVER_CERT, not CA_CERT, but that does not |
| 590 // work due to NSS bug: https://bugzilla.mozilla.org/show_bug.cgi?id=531160 | 594 // work due to NSS bug: https://bugzilla.mozilla.org/show_bug.cgi?id=531160 |
| 591 EXPECT_TRUE(cert_db_.SetCertTrust( | 595 EXPECT_TRUE(cert_db_.SetCertTrust( |
| 592 puny_cert.get(), CA_CERT, | 596 puny_cert.get(), CA_CERT, |
| 593 CertDatabase::TRUSTED_SSL | CertDatabase::TRUSTED_EMAIL)); | 597 CertDatabase::TRUSTED_SSL | CertDatabase::TRUSTED_EMAIL)); |
| 594 | 598 |
| 595 verify_result.Reset(); | 599 verify_result.Reset(); |
| 596 error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, | 600 error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, |
| 597 NULL, &verify_result); | 601 NULL, &verify_result); |
| 598 EXPECT_EQ(OK, error); | 602 EXPECT_EQ(OK, error); |
| 599 EXPECT_EQ(0U, verify_result.cert_status); | 603 EXPECT_EQ(0U, verify_result.cert_status); |
| 600 } | 604 } |
| 601 | 605 |
| 606 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned_Trusted) { | |
| 607 // When using CERT_PKIXVerifyCert (which we do), server trust only works from | |
| 608 // 3.13.4 onwards. See https://bugzilla.mozilla.org/show_bug.cgi?id=647364. | |
| 609 if (!NSS_VersionCheck("3.13.4")) { | |
| 610 LOG(INFO) << "test skipped on NSS < 3.13.4"; | |
| 611 return; | |
| 612 } | |
| 613 | |
| 614 CertificateList certs; | |
| 615 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs)); | |
| 616 | |
| 617 CertDatabase::ImportCertFailureList failed; | |
| 618 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUSTED_SSL, | |
| 619 &failed)); | |
| 620 | |
| 621 EXPECT_EQ(0U, failed.size()); | |
| 622 | |
| 623 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); | |
| 624 ASSERT_EQ(1U, cert_list.size()); | |
| 625 scoped_refptr<X509Certificate> puny_cert(cert_list[0]); | |
| 626 | |
| 627 EXPECT_EQ(CertDatabase::TRUSTED_SSL, | |
| 628 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT)); | |
| 629 psm::nsNSSCertTrust puny_trust(puny_cert->os_cert_handle()->trust); | |
| 630 EXPECT_TRUE(puny_trust.HasTerminalRecord(PR_TRUE, PR_FALSE, PR_FALSE)); | |
| 631 EXPECT_FALSE(puny_trust.HasTerminalRecord(PR_FALSE, PR_TRUE, PR_FALSE)); | |
| 632 EXPECT_FALSE(puny_trust.HasTerminalRecord(PR_FALSE, PR_FALSE, PR_TRUE)); | |
| 633 | |
| 634 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); | |
| 635 int flags = 0; | |
| 636 CertVerifyResult verify_result; | |
| 637 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, | |
| 638 NULL, &verify_result); | |
| 639 EXPECT_EQ(OK, error); | |
| 640 EXPECT_EQ(0U, verify_result.cert_status); | |
| 641 } | |
| 642 | |
| 643 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert) { | |
| 644 std::string ca_cert_data = ReadTestFile("root_ca_cert.crt"); | |
| 645 | |
| 646 CertificateList ca_certs = | |
| 647 X509Certificate::CreateCertificateListFromBytes( | |
| 648 ca_cert_data.data(), ca_cert_data.size(), | |
| 649 X509Certificate::FORMAT_AUTO); | |
|
Ryan Sleevi
2012/03/29 23:35:13
Use the net/base/cert_test_util helpers here (and
mattm
2012/05/16 03:30:45
Done.
| |
| 650 ASSERT_EQ(1U, ca_certs.size()); | |
| 651 | |
| 652 // Import CA cert and trust it. | |
| 653 CertDatabase::ImportCertFailureList failed; | |
| 654 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL, | |
| 655 &failed)); | |
| 656 EXPECT_EQ(0U, failed.size()); | |
| 657 | |
| 658 std::string server_cert_data = ReadTestFile("ok_cert.pem"); | |
| 659 CertificateList certs = X509Certificate::CreateCertificateListFromBytes( | |
| 660 server_cert_data.data(), server_cert_data.size(), | |
| 661 X509Certificate::FORMAT_AUTO); | |
| 662 ASSERT_EQ(1U, certs.size()); | |
| 663 | |
| 664 // Import server cert with default trust. | |
| 665 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::UNTRUSTED, | |
| 666 &failed)); | |
| 667 EXPECT_EQ(0U, failed.size()); | |
| 668 | |
| 669 // Server cert should verify. | |
| 670 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); | |
| 671 int flags = 0; | |
| 672 CertVerifyResult verify_result; | |
| 673 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags, | |
| 674 NULL, &verify_result); | |
| 675 EXPECT_EQ(OK, error); | |
| 676 EXPECT_EQ(0U, verify_result.cert_status); | |
| 677 } | |
| 678 | |
| 679 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert_DistrustServer) { | |
| 680 // Explicit distrust only works starting in NSS 3.13. | |
| 681 if (!NSS_VersionCheck("3.13")) { | |
| 682 LOG(INFO) << "test skipped on NSS < 3.13"; | |
| 683 return; | |
| 684 } | |
| 685 | |
| 686 std::string ca_cert_data = ReadTestFile("root_ca_cert.crt"); | |
| 687 | |
| 688 CertificateList ca_certs = | |
| 689 X509Certificate::CreateCertificateListFromBytes( | |
| 690 ca_cert_data.data(), ca_cert_data.size(), | |
| 691 X509Certificate::FORMAT_AUTO); | |
| 692 ASSERT_EQ(1U, ca_certs.size()); | |
| 693 | |
| 694 // Import CA cert and trust it. | |
| 695 CertDatabase::ImportCertFailureList failed; | |
| 696 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL, | |
| 697 &failed)); | |
| 698 EXPECT_EQ(0U, failed.size()); | |
| 699 | |
| 700 std::string server_cert_data = ReadTestFile("ok_cert.pem"); | |
| 701 CertificateList certs = X509Certificate::CreateCertificateListFromBytes( | |
| 702 server_cert_data.data(), server_cert_data.size(), | |
| 703 X509Certificate::FORMAT_AUTO); | |
| 704 ASSERT_EQ(1U, certs.size()); | |
| 705 | |
| 706 // Import server cert without inheriting trust from issuer (explicit | |
| 707 // distrust). | |
| 708 EXPECT_TRUE(cert_db_.ImportServerCert( | |
| 709 certs, CertDatabase::TRUST_TERMINAL_RECORD, &failed)); | |
| 710 EXPECT_EQ(0U, failed.size()); | |
| 711 EXPECT_EQ(CertDatabase::TRUST_TERMINAL_RECORD, | |
| 712 cert_db_.GetCertTrust(certs[0], SERVER_CERT)); | |
| 713 | |
| 714 // Server cert should fail to verify. | |
| 715 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); | |
| 716 int flags = 0; | |
| 717 CertVerifyResult verify_result; | |
| 718 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags, | |
| 719 NULL, &verify_result); | |
| 720 EXPECT_EQ(ERR_CERT_REVOKED, error); | |
| 721 EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status); | |
| 722 } | |
| 723 | |
| 602 } // namespace net | 724 } // namespace net |
| OLD | NEW |