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 |