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

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

Issue 9940001: Fix imported server certs being distrusted in NSS 3.13. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 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 | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698