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

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: rebase Created 8 years, 6 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 <certdb.h>
6 #include <pk11pub.h> 7 #include <pk11pub.h>
7 8
8 #include <algorithm> 9 #include <algorithm>
9 10
10 #include "base/file_path.h" 11 #include "base/file_path.h"
11 #include "base/file_util.h" 12 #include "base/file_util.h"
12 #include "base/lazy_instance.h" 13 #include "base/lazy_instance.h"
13 #include "base/message_loop.h" 14 #include "base/message_loop.h"
14 #include "base/path_service.h" 15 #include "base/path_service.h"
15 #include "base/string16.h" 16 #include "base/string16.h"
16 #include "base/string_util.h" 17 #include "base/string_util.h"
17 #include "base/utf_string_conversions.h" 18 #include "base/utf_string_conversions.h"
18 #include "crypto/nss_util.h" 19 #include "crypto/nss_util.h"
19 #include "crypto/nss_util_internal.h" 20 #include "crypto/nss_util_internal.h"
20 #include "crypto/scoped_nss_types.h" 21 #include "crypto/scoped_nss_types.h"
21 #include "net/base/cert_database.h" 22 #include "net/base/cert_database.h"
22 #include "net/base/cert_status_flags.h" 23 #include "net/base/cert_status_flags.h"
23 #include "net/base/cert_test_util.h" 24 #include "net/base/cert_test_util.h"
24 #include "net/base/cert_verify_proc.h" 25 #include "net/base/cert_verify_proc.h"
25 #include "net/base/cert_verify_result.h" 26 #include "net/base/cert_verify_result.h"
26 #include "net/base/crypto_module.h" 27 #include "net/base/crypto_module.h"
27 #include "net/base/net_errors.h" 28 #include "net/base/net_errors.h"
28 #include "net/base/x509_certificate.h" 29 #include "net/base/x509_certificate.h"
29 #include "net/third_party/mozilla_security_manager/nsNSSCertTrust.h"
30 #include "net/third_party/mozilla_security_manager/nsNSSCertificateDB.h" 30 #include "net/third_party/mozilla_security_manager/nsNSSCertificateDB.h"
31 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
32 32
33 namespace psm = mozilla_security_manager; 33 // In NSS 3.13, CERTDB_VALID_PEER was renamed CERTDB_TERMINAL_RECORD. So we use
34 // the new name of the macro.
35 #if !defined(CERTDB_TERMINAL_RECORD)
36 #define CERTDB_TERMINAL_RECORD CERTDB_VALID_PEER
37 #endif
34 38
35 namespace net { 39 namespace net {
36 40
37 // TODO(mattm): when https://bugzilla.mozilla.org/show_bug.cgi?id=588269 is 41 // TODO(mattm): when https://bugzilla.mozilla.org/show_bug.cgi?id=588269 is
38 // fixed, switch back to using a separate userdb for each test. 42 // fixed, switch back to using a separate userdb for each test.
39 // (When doing so, remember to add some standalone tests of DeleteCert since it 43 // (When doing so, remember to add some standalone tests of DeleteCert since it
40 // won't be tested by TearDown anymore.) 44 // won't be tested by TearDown anymore.)
41 class CertDatabaseNSSTest : public testing::Test { 45 class CertDatabaseNSSTest : public testing::Test {
42 public: 46 public:
43 static void SetUpTestCase() { 47 static void SetUpTestCase() {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 } 108 }
105 109
106 scoped_refptr<CryptoModule> slot_; 110 scoped_refptr<CryptoModule> slot_;
107 CertDatabase cert_db_; 111 CertDatabase cert_db_;
108 112
109 private: 113 private:
110 static bool CleanupSlotContents(PK11SlotInfo* slot) { 114 static bool CleanupSlotContents(PK11SlotInfo* slot) {
111 CertDatabase cert_db; 115 CertDatabase cert_db;
112 bool ok = true; 116 bool ok = true;
113 CertificateList certs = ListCertsInSlot(slot); 117 CertificateList certs = ListCertsInSlot(slot);
118 CERTCertTrust default_trust = {0};
114 for (size_t i = 0; i < certs.size(); ++i) { 119 for (size_t i = 0; i < certs.size(); ++i) {
120 // Reset cert trust values to defaults before deleting. Otherwise NSS (at
121 // least 3.12.9, but not 3.13.4) somehow seems to remember the trust which
122 // can break following tests.
wtc 2012/05/30 00:19:24 We should track down exactly which NSS change caus
wtc 2012/05/30 00:39:54 I happened to see this CERT_ChangeCertTrust call i
mattm 2012/05/30 22:40:58 Okay, after further testing I had narrowed it down
123 SECStatus srv = CERT_ChangeCertTrust(
124 CERT_GetDefaultCertDB(), certs[i]->os_cert_handle(), &default_trust);
125 if (srv != SECSuccess)
126 ok = false;
127
115 if (!cert_db.DeleteCertAndKey(certs[i])) 128 if (!cert_db.DeleteCertAndKey(certs[i]))
116 ok = false; 129 ok = false;
117 } 130 }
118 return ok; 131 return ok;
119 } 132 }
120 }; 133 };
121 134
122 TEST_F(CertDatabaseNSSTest, ListCerts) { 135 TEST_F(CertDatabaseNSSTest, ListCerts) {
123 // This test isn't terribly useful, though it will at least let valgrind test 136 // This test isn't terribly useful, though it will at least let valgrind test
124 // for leaks. 137 // for leaks.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 EXPECT_EQ(0U, failed.size()); 281 EXPECT_EQ(0U, failed.size());
269 282
270 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 283 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
271 ASSERT_EQ(1U, cert_list.size()); 284 ASSERT_EQ(1U, cert_list.size());
272 scoped_refptr<X509Certificate> cert(cert_list[0]); 285 scoped_refptr<X509Certificate> cert(cert_list[0]);
273 EXPECT_EQ("Test CA", cert->subject().common_name); 286 EXPECT_EQ("Test CA", cert->subject().common_name);
274 287
275 EXPECT_EQ(CertDatabase::TRUSTED_SSL, 288 EXPECT_EQ(CertDatabase::TRUSTED_SSL,
276 cert_db_.GetCertTrust(cert.get(), CA_CERT)); 289 cert_db_.GetCertTrust(cert.get(), CA_CERT));
277 290
278 psm::nsNSSCertTrust trust(cert->os_cert_handle()->trust); 291 EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
279 EXPECT_TRUE(trust.HasTrustedCA(PR_TRUE, PR_FALSE, PR_FALSE)); 292 CERTDB_TRUSTED_CLIENT_CA),
280 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE)); 293 cert->os_cert_handle()->trust->sslFlags);
281 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE)); 294 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
282 EXPECT_FALSE(trust.HasTrustedCA(PR_TRUE, PR_TRUE, PR_TRUE)); 295 cert->os_cert_handle()->trust->emailFlags);
283 EXPECT_TRUE(trust.HasCA(PR_TRUE, PR_TRUE, PR_TRUE)); 296 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
297 cert->os_cert_handle()->trust->objectSigningFlags);
284 } 298 }
285 299
286 TEST_F(CertDatabaseNSSTest, ImportCACert_EmailTrust) { 300 TEST_F(CertDatabaseNSSTest, ImportCACert_EmailTrust) {
287 CertificateList certs = CreateCertificateListFromFile( 301 CertificateList certs = CreateCertificateListFromFile(
288 GetTestCertsDirectory(), "root_ca_cert.crt", 302 GetTestCertsDirectory(), "root_ca_cert.crt",
289 X509Certificate::FORMAT_AUTO); 303 X509Certificate::FORMAT_AUTO);
290 ASSERT_EQ(1U, certs.size()); 304 ASSERT_EQ(1U, certs.size());
291 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm); 305 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
292 306
293 // Import it. 307 // Import it.
294 CertDatabase::ImportCertFailureList failed; 308 CertDatabase::ImportCertFailureList failed;
295 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_EMAIL, 309 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_EMAIL,
296 &failed)); 310 &failed));
297 311
298 EXPECT_EQ(0U, failed.size()); 312 EXPECT_EQ(0U, failed.size());
299 313
300 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 314 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
301 ASSERT_EQ(1U, cert_list.size()); 315 ASSERT_EQ(1U, cert_list.size());
302 scoped_refptr<X509Certificate> cert(cert_list[0]); 316 scoped_refptr<X509Certificate> cert(cert_list[0]);
303 EXPECT_EQ("Test CA", cert->subject().common_name); 317 EXPECT_EQ("Test CA", cert->subject().common_name);
304 318
305 EXPECT_EQ(CertDatabase::TRUSTED_EMAIL, 319 EXPECT_EQ(CertDatabase::TRUSTED_EMAIL,
306 cert_db_.GetCertTrust(cert.get(), CA_CERT)); 320 cert_db_.GetCertTrust(cert.get(), CA_CERT));
307 321
308 psm::nsNSSCertTrust trust(cert->os_cert_handle()->trust); 322 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
309 EXPECT_FALSE(trust.HasTrustedCA(PR_TRUE, PR_FALSE, PR_FALSE)); 323 cert->os_cert_handle()->trust->sslFlags);
310 EXPECT_TRUE(trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE)); 324 EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
311 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE)); 325 CERTDB_TRUSTED_CLIENT_CA),
312 EXPECT_TRUE(trust.HasCA(PR_TRUE, PR_TRUE, PR_TRUE)); 326 cert->os_cert_handle()->trust->emailFlags);
327 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
328 cert->os_cert_handle()->trust->objectSigningFlags);
313 } 329 }
314 330
315 TEST_F(CertDatabaseNSSTest, ImportCACert_ObjSignTrust) { 331 TEST_F(CertDatabaseNSSTest, ImportCACert_ObjSignTrust) {
316 CertificateList certs = CreateCertificateListFromFile( 332 CertificateList certs = CreateCertificateListFromFile(
317 GetTestCertsDirectory(), "root_ca_cert.crt", 333 GetTestCertsDirectory(), "root_ca_cert.crt",
318 X509Certificate::FORMAT_AUTO); 334 X509Certificate::FORMAT_AUTO);
319 ASSERT_EQ(1U, certs.size()); 335 ASSERT_EQ(1U, certs.size());
320 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm); 336 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
321 337
322 // Import it. 338 // Import it.
323 CertDatabase::ImportCertFailureList failed; 339 CertDatabase::ImportCertFailureList failed;
324 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_OBJ_SIGN, 340 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_OBJ_SIGN,
325 &failed)); 341 &failed));
326 342
327 EXPECT_EQ(0U, failed.size()); 343 EXPECT_EQ(0U, failed.size());
328 344
329 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 345 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
330 ASSERT_EQ(1U, cert_list.size()); 346 ASSERT_EQ(1U, cert_list.size());
331 scoped_refptr<X509Certificate> cert(cert_list[0]); 347 scoped_refptr<X509Certificate> cert(cert_list[0]);
332 EXPECT_EQ("Test CA", cert->subject().common_name); 348 EXPECT_EQ("Test CA", cert->subject().common_name);
333 349
334 EXPECT_EQ(CertDatabase::TRUSTED_OBJ_SIGN, 350 EXPECT_EQ(CertDatabase::TRUSTED_OBJ_SIGN,
335 cert_db_.GetCertTrust(cert.get(), CA_CERT)); 351 cert_db_.GetCertTrust(cert.get(), CA_CERT));
336 352
337 psm::nsNSSCertTrust trust(cert->os_cert_handle()->trust); 353 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
338 EXPECT_FALSE(trust.HasTrustedCA(PR_TRUE, PR_FALSE, PR_FALSE)); 354 cert->os_cert_handle()->trust->sslFlags);
339 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE)); 355 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
340 EXPECT_TRUE(trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE)); 356 cert->os_cert_handle()->trust->emailFlags);
341 EXPECT_TRUE(trust.HasCA(PR_TRUE, PR_TRUE, PR_TRUE)); 357 EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
358 CERTDB_TRUSTED_CLIENT_CA),
359 cert->os_cert_handle()->trust->objectSigningFlags);
342 } 360 }
343 361
344 TEST_F(CertDatabaseNSSTest, ImportCA_NotCACert) { 362 TEST_F(CertDatabaseNSSTest, ImportCA_NotCACert) {
345 CertificateList certs = CreateCertificateListFromFile( 363 CertificateList certs = CreateCertificateListFromFile(
346 GetTestCertsDirectory(), "google.single.pem", 364 GetTestCertsDirectory(), "google.single.pem",
347 X509Certificate::FORMAT_AUTO); 365 X509Certificate::FORMAT_AUTO);
348 ASSERT_EQ(1U, certs.size()); 366 ASSERT_EQ(1U, certs.size());
349 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm); 367 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
350 368
351 // Import it. 369 // Import it.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 EXPECT_EQ("DOD CA-17", cert_list[1]->subject().common_name); 443 EXPECT_EQ("DOD CA-17", cert_list[1]->subject().common_name);
426 } 444 }
427 445
428 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyUntrusted) { 446 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyUntrusted) {
429 CertificateList certs; 447 CertificateList certs;
430 ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs)); 448 ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs));
431 ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs)); 449 ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
432 450
433 // Import it. 451 // Import it.
434 CertDatabase::ImportCertFailureList failed; 452 CertDatabase::ImportCertFailureList failed;
435 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::UNTRUSTED, &failed)); 453 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUST_DEFAULT,
454 &failed));
436 455
437 ASSERT_EQ(1U, failed.size()); 456 ASSERT_EQ(1U, failed.size());
438 EXPECT_EQ("DOD CA-17", failed[0].certificate->subject().common_name); 457 EXPECT_EQ("DOD CA-17", failed[0].certificate->subject().common_name);
439 // TODO(mattm): should check for net error equivalent of 458 // TODO(mattm): should check for net error equivalent of
440 // SEC_ERROR_UNTRUSTED_ISSUER 459 // SEC_ERROR_UNTRUSTED_ISSUER
441 EXPECT_EQ(ERR_FAILED, failed[0].net_error); 460 EXPECT_EQ(ERR_FAILED, failed[0].net_error);
442 461
443 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 462 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
444 ASSERT_EQ(1U, cert_list.size()); 463 ASSERT_EQ(1U, cert_list.size());
445 EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name); 464 EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 TEST_F(CertDatabaseNSSTest, DISABLED_ImportServerCert) { 522 TEST_F(CertDatabaseNSSTest, DISABLED_ImportServerCert) {
504 // Need to import intermediate cert for the verify of google cert, otherwise 523 // Need to import intermediate cert for the verify of google cert, otherwise
505 // it will try to fetch it automatically with cert_pi_useAIACertFetch, which 524 // it will try to fetch it automatically with cert_pi_useAIACertFetch, which
506 // will cause OCSPCreateSession on the main thread, which is not allowed. 525 // will cause OCSPCreateSession on the main thread, which is not allowed.
507 CertificateList certs = CreateCertificateListFromFile( 526 CertificateList certs = CreateCertificateListFromFile(
508 GetTestCertsDirectory(), "google.chain.pem", 527 GetTestCertsDirectory(), "google.chain.pem",
509 X509Certificate::FORMAT_AUTO); 528 X509Certificate::FORMAT_AUTO);
510 ASSERT_EQ(2U, certs.size()); 529 ASSERT_EQ(2U, certs.size());
511 530
512 CertDatabase::ImportCertFailureList failed; 531 CertDatabase::ImportCertFailureList failed;
513 EXPECT_TRUE(cert_db_.ImportServerCert(certs, &failed)); 532 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUST_DEFAULT,
533 &failed));
514 534
515 EXPECT_EQ(0U, failed.size()); 535 EXPECT_EQ(0U, failed.size());
516 536
517 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 537 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
518 ASSERT_EQ(2U, cert_list.size()); 538 ASSERT_EQ(2U, cert_list.size());
519 scoped_refptr<X509Certificate> goog_cert(cert_list[0]); 539 scoped_refptr<X509Certificate> goog_cert(cert_list[0]);
520 scoped_refptr<X509Certificate> thawte_cert(cert_list[1]); 540 scoped_refptr<X509Certificate> thawte_cert(cert_list[1]);
521 EXPECT_EQ("www.google.com", goog_cert->subject().common_name); 541 EXPECT_EQ("www.google.com", goog_cert->subject().common_name);
522 EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name); 542 EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name);
523 543
524 EXPECT_EQ(CertDatabase::UNTRUSTED, 544 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
525 cert_db_.GetCertTrust(goog_cert.get(), SERVER_CERT)); 545 cert_db_.GetCertTrust(goog_cert.get(), SERVER_CERT));
526 psm::nsNSSCertTrust goog_trust(goog_cert->os_cert_handle()->trust); 546
527 EXPECT_TRUE(goog_trust.HasPeer(PR_TRUE, PR_TRUE, PR_TRUE)); 547 EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->sslFlags);
548 EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->emailFlags);
549 EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->objectSigningFlags);
528 550
529 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); 551 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
530 int flags = 0; 552 int flags = 0;
531 CertVerifyResult verify_result; 553 CertVerifyResult verify_result;
532 int error = verify_proc->Verify(goog_cert, "www.google.com", flags, 554 int error = verify_proc->Verify(goog_cert, "www.google.com", flags,
533 NULL, &verify_result); 555 NULL, &verify_result);
534 EXPECT_EQ(OK, error); 556 EXPECT_EQ(OK, error);
535 EXPECT_EQ(0U, verify_result.cert_status); 557 EXPECT_EQ(0U, verify_result.cert_status);
536 } 558 }
537 559
538 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) { 560 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) {
539 CertificateList certs; 561 CertificateList certs;
540 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs)); 562 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs));
541 563
542 CertDatabase::ImportCertFailureList failed; 564 CertDatabase::ImportCertFailureList failed;
543 EXPECT_TRUE(cert_db_.ImportServerCert(certs, &failed)); 565 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUST_DEFAULT,
566 &failed));
544 567
545 EXPECT_EQ(0U, failed.size()); 568 EXPECT_EQ(0U, failed.size());
546 569
547 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 570 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
548 ASSERT_EQ(1U, cert_list.size()); 571 ASSERT_EQ(1U, cert_list.size());
549 scoped_refptr<X509Certificate> puny_cert(cert_list[0]); 572 scoped_refptr<X509Certificate> puny_cert(cert_list[0]);
550 573
551 EXPECT_EQ(CertDatabase::UNTRUSTED, 574 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
552 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT)); 575 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT));
553 psm::nsNSSCertTrust puny_trust(puny_cert->os_cert_handle()->trust); 576 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->sslFlags);
554 EXPECT_TRUE(puny_trust.HasPeer(PR_TRUE, PR_TRUE, PR_TRUE)); 577 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->emailFlags);
578 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->objectSigningFlags);
555 579
556 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); 580 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
557 int flags = 0; 581 int flags = 0;
558 CertVerifyResult verify_result; 582 CertVerifyResult verify_result;
559 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, 583 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags,
560 NULL, &verify_result); 584 NULL, &verify_result);
561 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error); 585 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
562 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); 586 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
563 587 }
564 // TODO(mattm): this should be SERVER_CERT, not CA_CERT, but that does not 588
565 // work due to NSS bug: https://bugzilla.mozilla.org/show_bug.cgi?id=531160 589 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned_Trusted) {
566 EXPECT_TRUE(cert_db_.SetCertTrust( 590 // When using CERT_PKIXVerifyCert (which we do), server trust only works from
567 puny_cert.get(), CA_CERT, 591 // 3.13.4 onwards. See https://bugzilla.mozilla.org/show_bug.cgi?id=647364.
568 CertDatabase::TRUSTED_SSL | CertDatabase::TRUSTED_EMAIL)); 592 if (!NSS_VersionCheck("3.13.4")) {
569 593 LOG(INFO) << "test skipped on NSS < 3.13.4";
570 verify_result.Reset(); 594 return;
571 error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, 595 }
572 NULL, &verify_result); 596
573 EXPECT_EQ(OK, error); 597 CertificateList certs;
574 EXPECT_EQ(0U, verify_result.cert_status); 598 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs));
599
600 CertDatabase::ImportCertFailureList failed;
601 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUSTED_SSL,
602 &failed));
603
604 EXPECT_EQ(0U, failed.size());
605
606 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
607 ASSERT_EQ(1U, cert_list.size());
608 scoped_refptr<X509Certificate> puny_cert(cert_list[0]);
609
610 EXPECT_EQ(CertDatabase::TRUSTED_SSL,
611 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT));
612 EXPECT_EQ(unsigned(CERTDB_TRUSTED | CERTDB_TERMINAL_RECORD),
613 puny_cert->os_cert_handle()->trust->sslFlags);
614 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->emailFlags);
615 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->objectSigningFlags);
616
617 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
618 int flags = 0;
619 CertVerifyResult verify_result;
620 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags,
621 NULL, &verify_result);
622 EXPECT_EQ(OK, error);
623 EXPECT_EQ(0U, verify_result.cert_status);
624 }
625
626 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert) {
627 CertificateList ca_certs = CreateCertificateListFromFile(
628 GetTestCertsDirectory(), "root_ca_cert.crt",
629 X509Certificate::FORMAT_AUTO);
630 ASSERT_EQ(1U, ca_certs.size());
631
632 // Import CA cert and trust it.
633 CertDatabase::ImportCertFailureList failed;
634 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL,
635 &failed));
636 EXPECT_EQ(0U, failed.size());
637
638 CertificateList certs = CreateCertificateListFromFile(
639 GetTestCertsDirectory(), "ok_cert.pem",
640 X509Certificate::FORMAT_AUTO);
641 ASSERT_EQ(1U, certs.size());
642
643 // Import server cert with default trust.
644 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUST_DEFAULT,
645 &failed));
646 EXPECT_EQ(0U, failed.size());
647
648 // Server cert should verify.
649 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
650 int flags = 0;
651 CertVerifyResult verify_result;
652 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
653 NULL, &verify_result);
654 EXPECT_EQ(OK, error);
655 EXPECT_EQ(0U, verify_result.cert_status);
656 }
657
658 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert_DistrustServer) {
659 // Explicit distrust only works starting in NSS 3.13.
660 if (!NSS_VersionCheck("3.13")) {
661 LOG(INFO) << "test skipped on NSS < 3.13";
662 return;
663 }
664
665 CertificateList ca_certs = CreateCertificateListFromFile(
666 GetTestCertsDirectory(), "root_ca_cert.crt",
667 X509Certificate::FORMAT_AUTO);
668 ASSERT_EQ(1U, ca_certs.size());
669
670 // Import CA cert and trust it.
671 CertDatabase::ImportCertFailureList failed;
672 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL,
673 &failed));
674 EXPECT_EQ(0U, failed.size());
675
676 CertificateList certs = CreateCertificateListFromFile(
677 GetTestCertsDirectory(), "ok_cert.pem",
678 X509Certificate::FORMAT_AUTO);
679 ASSERT_EQ(1U, certs.size());
680
681 // Import server cert without inheriting trust from issuer (explicit
682 // distrust).
683 EXPECT_TRUE(cert_db_.ImportServerCert(
684 certs, CertDatabase::DISTRUSTED_SSL, &failed));
685 EXPECT_EQ(0U, failed.size());
686 EXPECT_EQ(CertDatabase::DISTRUSTED_SSL,
687 cert_db_.GetCertTrust(certs[0], SERVER_CERT));
688
689 EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
690 certs[0]->os_cert_handle()->trust->sslFlags);
691 EXPECT_EQ(0L, certs[0]->os_cert_handle()->trust->emailFlags);
692 EXPECT_EQ(0L, certs[0]->os_cert_handle()->trust->objectSigningFlags);
wtc 2012/05/30 00:19:24 sslFlags, emailFlags, and objectSigningFlags are o
mattm 2012/05/30 22:40:58 oops, fixed.
693
694 // Server cert should fail to verify.
695 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
696 int flags = 0;
697 CertVerifyResult verify_result;
698 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
699 NULL, &verify_result);
700 EXPECT_EQ(ERR_CERT_REVOKED, error);
701 EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
702 }
703
704 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa) {
705 CertificateList ca_certs = CreateCertificateListFromFile(
706 GetTestCertsDirectory(), "2048-rsa-root.pem",
707 X509Certificate::FORMAT_AUTO);
708 ASSERT_EQ(1U, ca_certs.size());
709
710 // Import Root CA cert and distrust it.
711 CertDatabase::ImportCertFailureList failed;
712 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::DISTRUSTED_SSL,
713 &failed));
714 EXPECT_EQ(0U, failed.size());
715
716 CertificateList intermediate_certs = CreateCertificateListFromFile(
717 GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
718 X509Certificate::FORMAT_AUTO);
719 ASSERT_EQ(1U, intermediate_certs.size());
720
721 // Import Intermediate CA cert and trust it.
722 EXPECT_TRUE(cert_db_.ImportCACerts(intermediate_certs,
723 CertDatabase::TRUSTED_SSL, &failed));
724 EXPECT_EQ(0U, failed.size());
725
726 CertificateList certs = CreateCertificateListFromFile(
727 GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
728 X509Certificate::FORMAT_AUTO);
729 ASSERT_EQ(1U, certs.size());
730
731 // Import server cert with default trust.
732 EXPECT_TRUE(cert_db_.ImportServerCert(
733 certs, CertDatabase::TRUST_DEFAULT, &failed));
734 EXPECT_EQ(0U, failed.size());
735 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
736 cert_db_.GetCertTrust(certs[0], SERVER_CERT));
737
738 // Server cert should verify.
739 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
740 int flags = 0;
741 CertVerifyResult verify_result;
742 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
743 NULL, &verify_result);
744 EXPECT_EQ(OK, error);
745 EXPECT_EQ(0U, verify_result.cert_status);
746
747 // Explicit distrust only works starting in NSS 3.13.
748 if (!NSS_VersionCheck("3.13")) {
749 LOG(INFO) << "test partially skipped on NSS < 3.13";
750 return;
751 }
752
753 // Trust the root cert and distrust the intermediate.
754 EXPECT_TRUE(cert_db_.SetCertTrust(
755 ca_certs[0], CA_CERT, CertDatabase::TRUSTED_SSL));
756 EXPECT_TRUE(cert_db_.SetCertTrust(
757 intermediate_certs[0], CA_CERT, CertDatabase::DISTRUSTED_SSL));
758 EXPECT_EQ(
759 unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA | CERTDB_TRUSTED_CLIENT_CA),
760 ca_certs[0]->os_cert_handle()->trust->sslFlags);
761 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
762 ca_certs[0]->os_cert_handle()->trust->emailFlags);
763 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
764 ca_certs[0]->os_cert_handle()->trust->objectSigningFlags);
765 EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
766 intermediate_certs[0]->os_cert_handle()->trust->sslFlags);
767 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
768 intermediate_certs[0]->os_cert_handle()->trust->emailFlags);
769 EXPECT_EQ(
770 unsigned(CERTDB_VALID_CA),
771 intermediate_certs[0]->os_cert_handle()->trust->objectSigningFlags);
772
773 // Server cert should fail to verify.
774 CertVerifyResult verify_result2;
775 error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
776 NULL, &verify_result2);
777 EXPECT_EQ(ERR_CERT_REVOKED, error);
778 EXPECT_EQ(CERT_STATUS_REVOKED, verify_result2.cert_status);
779 }
780
781 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa2) {
782 CertDatabase::ImportCertFailureList failed;
783
784 CertificateList intermediate_certs = CreateCertificateListFromFile(
785 GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
786 X509Certificate::FORMAT_AUTO);
787 ASSERT_EQ(1U, intermediate_certs.size());
788
789 // Import Intermediate CA cert and trust it.
790 EXPECT_TRUE(cert_db_.ImportCACerts(intermediate_certs,
791 CertDatabase::TRUSTED_SSL, &failed));
792 EXPECT_EQ(0U, failed.size());
793
794 CertificateList certs = CreateCertificateListFromFile(
795 GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
796 X509Certificate::FORMAT_AUTO);
797 ASSERT_EQ(1U, certs.size());
798
799 // Import server cert with default trust.
800 EXPECT_TRUE(cert_db_.ImportServerCert(
801 certs, CertDatabase::TRUST_DEFAULT, &failed));
802 EXPECT_EQ(0U, failed.size());
803 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
804 cert_db_.GetCertTrust(certs[0], SERVER_CERT));
805
806 // Server cert should verify.
807 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
808 int flags = 0;
809 CertVerifyResult verify_result;
810 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
811 NULL, &verify_result);
812 EXPECT_EQ(OK, error);
813 EXPECT_EQ(0U, verify_result.cert_status);
814
815 // Without explicit trust of the intermediate, verification should fail.
816 EXPECT_TRUE(cert_db_.SetCertTrust(
817 intermediate_certs[0], CA_CERT, CertDatabase::TRUST_DEFAULT));
818
819 // Server cert should fail to verify.
820 CertVerifyResult verify_result2;
821 error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
822 NULL, &verify_result2);
823 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
824 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result2.cert_status);
825 }
826
827 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa3) {
828 CertDatabase::ImportCertFailureList failed;
829
830 CertificateList ca_certs = CreateCertificateListFromFile(
831 GetTestCertsDirectory(), "2048-rsa-root.pem",
832 X509Certificate::FORMAT_AUTO);
833 ASSERT_EQ(1U, ca_certs.size());
834
835 // Import Root CA cert and default trust it.
836 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUST_DEFAULT,
837 &failed));
838 EXPECT_EQ(0U, failed.size());
839
840 CertificateList intermediate_certs = CreateCertificateListFromFile(
841 GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
842 X509Certificate::FORMAT_AUTO);
843 ASSERT_EQ(1U, intermediate_certs.size());
844
845 // Import Intermediate CA cert and trust it.
846 EXPECT_TRUE(cert_db_.ImportCACerts(intermediate_certs,
847 CertDatabase::TRUSTED_SSL, &failed));
848 EXPECT_EQ(0U, failed.size());
849
850 CertificateList certs = CreateCertificateListFromFile(
851 GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
852 X509Certificate::FORMAT_AUTO);
853 ASSERT_EQ(1U, certs.size());
854
855 // Import server cert with default trust.
856 EXPECT_TRUE(cert_db_.ImportServerCert(
857 certs, CertDatabase::TRUST_DEFAULT, &failed));
858 EXPECT_EQ(0U, failed.size());
859 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
860 cert_db_.GetCertTrust(certs[0], SERVER_CERT));
861
862 // Server cert should verify.
863 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
864 int flags = 0;
865 CertVerifyResult verify_result;
866 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
867 NULL, &verify_result);
868 EXPECT_EQ(OK, error);
869 EXPECT_EQ(0U, verify_result.cert_status);
870
871 // Without explicit trust of the intermediate, verification should fail.
872 EXPECT_TRUE(cert_db_.SetCertTrust(
873 intermediate_certs[0], CA_CERT, CertDatabase::TRUST_DEFAULT));
874
875 // Server cert should fail to verify.
876 CertVerifyResult verify_result2;
877 error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
878 NULL, &verify_result2);
879 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
880 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result2.cert_status);
881 }
882
883 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa4) {
884 // Explicit distrust only works starting in NSS 3.13.
885 if (!NSS_VersionCheck("3.13")) {
886 LOG(INFO) << "test skipped on NSS < 3.13";
887 return;
888 }
889
890 CertDatabase::ImportCertFailureList failed;
891
892 CertificateList ca_certs = CreateCertificateListFromFile(
893 GetTestCertsDirectory(), "2048-rsa-root.pem",
894 X509Certificate::FORMAT_AUTO);
895 ASSERT_EQ(1U, ca_certs.size());
896
897 // Import Root CA cert and trust it.
898 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL,
899 &failed));
900 EXPECT_EQ(0U, failed.size());
901
902 CertificateList intermediate_certs = CreateCertificateListFromFile(
903 GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
904 X509Certificate::FORMAT_AUTO);
905 ASSERT_EQ(1U, intermediate_certs.size());
906
907 // Import Intermediate CA cert and distrust it.
908 EXPECT_TRUE(cert_db_.ImportCACerts(intermediate_certs,
909 CertDatabase::DISTRUSTED_SSL, &failed));
910 EXPECT_EQ(0U, failed.size());
911
912 CertificateList certs = CreateCertificateListFromFile(
913 GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
914 X509Certificate::FORMAT_AUTO);
915 ASSERT_EQ(1U, certs.size());
916
917 // Import server cert with default trust.
918 EXPECT_TRUE(cert_db_.ImportServerCert(
919 certs, CertDatabase::TRUST_DEFAULT, &failed));
920 EXPECT_EQ(0U, failed.size());
921 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
922 cert_db_.GetCertTrust(certs[0], SERVER_CERT));
923
924 // Server cert should not verify.
925 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
926 int flags = 0;
927 CertVerifyResult verify_result;
928 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
929 NULL, &verify_result);
930 EXPECT_EQ(ERR_CERT_REVOKED, error);
931 EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
932
933 // Without explicit distrust of the intermediate, verification should succeed.
934 EXPECT_TRUE(cert_db_.SetCertTrust(
935 intermediate_certs[0], CA_CERT, CertDatabase::TRUST_DEFAULT));
936
937 // Server cert should verify.
938 CertVerifyResult verify_result2;
939 error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
940 NULL, &verify_result2);
wtc 2012/05/30 00:19:24 Nit: indentation of the arguments is wrong. The o
mattm 2012/05/30 22:40:58 Done.
941 EXPECT_EQ(OK, error);
942 EXPECT_EQ(0U, verify_result2.cert_status);
575 } 943 }
576 944
577 } // namespace net 945 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698