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 <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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |