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

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: review changes Created 8 years, 7 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 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 EXPECT_EQ(0U, failed.size()); 272 EXPECT_EQ(0U, failed.size());
269 273
270 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 274 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
271 ASSERT_EQ(1U, cert_list.size()); 275 ASSERT_EQ(1U, cert_list.size());
272 scoped_refptr<X509Certificate> cert(cert_list[0]); 276 scoped_refptr<X509Certificate> cert(cert_list[0]);
273 EXPECT_EQ("Test CA", cert->subject().common_name); 277 EXPECT_EQ("Test CA", cert->subject().common_name);
274 278
275 EXPECT_EQ(CertDatabase::TRUSTED_SSL, 279 EXPECT_EQ(CertDatabase::TRUSTED_SSL,
276 cert_db_.GetCertTrust(cert.get(), CA_CERT)); 280 cert_db_.GetCertTrust(cert.get(), CA_CERT));
277 281
278 psm::nsNSSCertTrust trust(cert->os_cert_handle()->trust); 282 EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
279 EXPECT_TRUE(trust.HasTrustedCA(PR_TRUE, PR_FALSE, PR_FALSE)); 283 CERTDB_TRUSTED_CLIENT_CA),
280 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE)); 284 cert->os_cert_handle()->trust->sslFlags);
281 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE)); 285 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
282 EXPECT_FALSE(trust.HasTrustedCA(PR_TRUE, PR_TRUE, PR_TRUE)); 286 cert->os_cert_handle()->trust->emailFlags);
283 EXPECT_TRUE(trust.HasCA(PR_TRUE, PR_TRUE, PR_TRUE)); 287 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
288 cert->os_cert_handle()->trust->objectSigningFlags);
284 } 289 }
285 290
286 TEST_F(CertDatabaseNSSTest, ImportCACert_EmailTrust) { 291 TEST_F(CertDatabaseNSSTest, ImportCACert_EmailTrust) {
287 CertificateList certs = CreateCertificateListFromFile( 292 CertificateList certs = CreateCertificateListFromFile(
288 GetTestCertsDirectory(), "root_ca_cert.crt", 293 GetTestCertsDirectory(), "root_ca_cert.crt",
289 X509Certificate::FORMAT_AUTO); 294 X509Certificate::FORMAT_AUTO);
290 ASSERT_EQ(1U, certs.size()); 295 ASSERT_EQ(1U, certs.size());
291 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm); 296 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
292 297
293 // Import it. 298 // Import it.
294 CertDatabase::ImportCertFailureList failed; 299 CertDatabase::ImportCertFailureList failed;
295 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_EMAIL, 300 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_EMAIL,
296 &failed)); 301 &failed));
297 302
298 EXPECT_EQ(0U, failed.size()); 303 EXPECT_EQ(0U, failed.size());
299 304
300 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 305 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
301 ASSERT_EQ(1U, cert_list.size()); 306 ASSERT_EQ(1U, cert_list.size());
302 scoped_refptr<X509Certificate> cert(cert_list[0]); 307 scoped_refptr<X509Certificate> cert(cert_list[0]);
303 EXPECT_EQ("Test CA", cert->subject().common_name); 308 EXPECT_EQ("Test CA", cert->subject().common_name);
304 309
305 EXPECT_EQ(CertDatabase::TRUSTED_EMAIL, 310 EXPECT_EQ(CertDatabase::TRUSTED_EMAIL,
306 cert_db_.GetCertTrust(cert.get(), CA_CERT)); 311 cert_db_.GetCertTrust(cert.get(), CA_CERT));
307 312
308 psm::nsNSSCertTrust trust(cert->os_cert_handle()->trust); 313 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
309 EXPECT_FALSE(trust.HasTrustedCA(PR_TRUE, PR_FALSE, PR_FALSE)); 314 cert->os_cert_handle()->trust->sslFlags);
310 EXPECT_TRUE(trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE)); 315 EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
311 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE)); 316 CERTDB_TRUSTED_CLIENT_CA),
312 EXPECT_TRUE(trust.HasCA(PR_TRUE, PR_TRUE, PR_TRUE)); 317 cert->os_cert_handle()->trust->emailFlags);
318 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
319 cert->os_cert_handle()->trust->objectSigningFlags);
313 } 320 }
314 321
315 TEST_F(CertDatabaseNSSTest, ImportCACert_ObjSignTrust) { 322 TEST_F(CertDatabaseNSSTest, ImportCACert_ObjSignTrust) {
316 CertificateList certs = CreateCertificateListFromFile( 323 CertificateList certs = CreateCertificateListFromFile(
317 GetTestCertsDirectory(), "root_ca_cert.crt", 324 GetTestCertsDirectory(), "root_ca_cert.crt",
318 X509Certificate::FORMAT_AUTO); 325 X509Certificate::FORMAT_AUTO);
319 ASSERT_EQ(1U, certs.size()); 326 ASSERT_EQ(1U, certs.size());
320 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm); 327 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
321 328
322 // Import it. 329 // Import it.
323 CertDatabase::ImportCertFailureList failed; 330 CertDatabase::ImportCertFailureList failed;
324 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_OBJ_SIGN, 331 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUSTED_OBJ_SIGN,
325 &failed)); 332 &failed));
326 333
327 EXPECT_EQ(0U, failed.size()); 334 EXPECT_EQ(0U, failed.size());
328 335
329 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 336 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
330 ASSERT_EQ(1U, cert_list.size()); 337 ASSERT_EQ(1U, cert_list.size());
331 scoped_refptr<X509Certificate> cert(cert_list[0]); 338 scoped_refptr<X509Certificate> cert(cert_list[0]);
332 EXPECT_EQ("Test CA", cert->subject().common_name); 339 EXPECT_EQ("Test CA", cert->subject().common_name);
333 340
334 EXPECT_EQ(CertDatabase::TRUSTED_OBJ_SIGN, 341 EXPECT_EQ(CertDatabase::TRUSTED_OBJ_SIGN,
335 cert_db_.GetCertTrust(cert.get(), CA_CERT)); 342 cert_db_.GetCertTrust(cert.get(), CA_CERT));
336 343
337 psm::nsNSSCertTrust trust(cert->os_cert_handle()->trust); 344 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
338 EXPECT_FALSE(trust.HasTrustedCA(PR_TRUE, PR_FALSE, PR_FALSE)); 345 cert->os_cert_handle()->trust->sslFlags);
339 EXPECT_FALSE(trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE)); 346 EXPECT_EQ(unsigned(CERTDB_VALID_CA),
340 EXPECT_TRUE(trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE)); 347 cert->os_cert_handle()->trust->emailFlags);
341 EXPECT_TRUE(trust.HasCA(PR_TRUE, PR_TRUE, PR_TRUE)); 348 EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
349 CERTDB_TRUSTED_CLIENT_CA),
350 cert->os_cert_handle()->trust->objectSigningFlags);
342 } 351 }
343 352
344 TEST_F(CertDatabaseNSSTest, ImportCA_NotCACert) { 353 TEST_F(CertDatabaseNSSTest, ImportCA_NotCACert) {
345 CertificateList certs = CreateCertificateListFromFile( 354 CertificateList certs = CreateCertificateListFromFile(
346 GetTestCertsDirectory(), "google.single.pem", 355 GetTestCertsDirectory(), "google.single.pem",
347 X509Certificate::FORMAT_AUTO); 356 X509Certificate::FORMAT_AUTO);
348 ASSERT_EQ(1U, certs.size()); 357 ASSERT_EQ(1U, certs.size());
349 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm); 358 EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
350 359
351 // Import it. 360 // 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); 434 EXPECT_EQ("DOD CA-17", cert_list[1]->subject().common_name);
426 } 435 }
427 436
428 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyUntrusted) { 437 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyUntrusted) {
429 CertificateList certs; 438 CertificateList certs;
430 ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs)); 439 ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs));
431 ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs)); 440 ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
432 441
433 // Import it. 442 // Import it.
434 CertDatabase::ImportCertFailureList failed; 443 CertDatabase::ImportCertFailureList failed;
435 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::UNTRUSTED, &failed)); 444 EXPECT_TRUE(cert_db_.ImportCACerts(certs, CertDatabase::TRUST_DEFAULT,
445 &failed));
436 446
437 ASSERT_EQ(1U, failed.size()); 447 ASSERT_EQ(1U, failed.size());
438 EXPECT_EQ("DOD CA-17", failed[0].certificate->subject().common_name); 448 EXPECT_EQ("DOD CA-17", failed[0].certificate->subject().common_name);
439 // TODO(mattm): should check for net error equivalent of 449 // TODO(mattm): should check for net error equivalent of
440 // SEC_ERROR_UNTRUSTED_ISSUER 450 // SEC_ERROR_UNTRUSTED_ISSUER
441 EXPECT_EQ(ERR_FAILED, failed[0].net_error); 451 EXPECT_EQ(ERR_FAILED, failed[0].net_error);
442 452
443 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 453 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
444 ASSERT_EQ(1U, cert_list.size()); 454 ASSERT_EQ(1U, cert_list.size());
445 EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name); 455 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) { 513 TEST_F(CertDatabaseNSSTest, DISABLED_ImportServerCert) {
504 // Need to import intermediate cert for the verify of google cert, otherwise 514 // 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 515 // it will try to fetch it automatically with cert_pi_useAIACertFetch, which
506 // will cause OCSPCreateSession on the main thread, which is not allowed. 516 // will cause OCSPCreateSession on the main thread, which is not allowed.
507 CertificateList certs = CreateCertificateListFromFile( 517 CertificateList certs = CreateCertificateListFromFile(
508 GetTestCertsDirectory(), "google.chain.pem", 518 GetTestCertsDirectory(), "google.chain.pem",
509 X509Certificate::FORMAT_AUTO); 519 X509Certificate::FORMAT_AUTO);
510 ASSERT_EQ(2U, certs.size()); 520 ASSERT_EQ(2U, certs.size());
511 521
512 CertDatabase::ImportCertFailureList failed; 522 CertDatabase::ImportCertFailureList failed;
513 EXPECT_TRUE(cert_db_.ImportServerCert(certs, &failed)); 523 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUST_DEFAULT,
524 &failed));
514 525
515 EXPECT_EQ(0U, failed.size()); 526 EXPECT_EQ(0U, failed.size());
516 527
517 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 528 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
518 ASSERT_EQ(2U, cert_list.size()); 529 ASSERT_EQ(2U, cert_list.size());
519 scoped_refptr<X509Certificate> goog_cert(cert_list[0]); 530 scoped_refptr<X509Certificate> goog_cert(cert_list[0]);
520 scoped_refptr<X509Certificate> thawte_cert(cert_list[1]); 531 scoped_refptr<X509Certificate> thawte_cert(cert_list[1]);
521 EXPECT_EQ("www.google.com", goog_cert->subject().common_name); 532 EXPECT_EQ("www.google.com", goog_cert->subject().common_name);
522 EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name); 533 EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name);
523 534
524 EXPECT_EQ(CertDatabase::UNTRUSTED, 535 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
525 cert_db_.GetCertTrust(goog_cert.get(), SERVER_CERT)); 536 cert_db_.GetCertTrust(goog_cert.get(), SERVER_CERT));
526 psm::nsNSSCertTrust goog_trust(goog_cert->os_cert_handle()->trust); 537
527 EXPECT_TRUE(goog_trust.HasPeer(PR_TRUE, PR_TRUE, PR_TRUE)); 538 EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->sslFlags);
539 EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->emailFlags);
540 EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->objectSigningFlags);
528 541
529 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); 542 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
530 int flags = 0; 543 int flags = 0;
531 CertVerifyResult verify_result; 544 CertVerifyResult verify_result;
532 int error = verify_proc->Verify(goog_cert, "www.google.com", flags, 545 int error = verify_proc->Verify(goog_cert, "www.google.com", flags,
533 NULL, &verify_result); 546 NULL, &verify_result);
534 EXPECT_EQ(OK, error); 547 EXPECT_EQ(OK, error);
535 EXPECT_EQ(0U, verify_result.cert_status); 548 EXPECT_EQ(0U, verify_result.cert_status);
536 } 549 }
537 550
538 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) { 551 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) {
539 CertificateList certs; 552 CertificateList certs;
540 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs)); 553 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs));
541 554
542 CertDatabase::ImportCertFailureList failed; 555 CertDatabase::ImportCertFailureList failed;
543 EXPECT_TRUE(cert_db_.ImportServerCert(certs, &failed)); 556 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUST_DEFAULT,
557 &failed));
544 558
545 EXPECT_EQ(0U, failed.size()); 559 EXPECT_EQ(0U, failed.size());
546 560
547 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle()); 561 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
548 ASSERT_EQ(1U, cert_list.size()); 562 ASSERT_EQ(1U, cert_list.size());
549 scoped_refptr<X509Certificate> puny_cert(cert_list[0]); 563 scoped_refptr<X509Certificate> puny_cert(cert_list[0]);
550 564
551 EXPECT_EQ(CertDatabase::UNTRUSTED, 565 EXPECT_EQ(CertDatabase::TRUST_DEFAULT,
552 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT)); 566 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT));
553 psm::nsNSSCertTrust puny_trust(puny_cert->os_cert_handle()->trust); 567 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->sslFlags);
554 EXPECT_TRUE(puny_trust.HasPeer(PR_TRUE, PR_TRUE, PR_TRUE)); 568 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->emailFlags);
569 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->objectSigningFlags);
555 570
556 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault()); 571 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
557 int flags = 0; 572 int flags = 0;
558 CertVerifyResult verify_result; 573 CertVerifyResult verify_result;
559 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, 574 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags,
560 NULL, &verify_result); 575 NULL, &verify_result);
561 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error); 576 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
562 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); 577 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
563 578
564 // TODO(mattm): this should be SERVER_CERT, not CA_CERT, but that does not 579 // TODO(mattm): this should be SERVER_CERT, not CA_CERT, but that does not
565 // work due to NSS bug: https://bugzilla.mozilla.org/show_bug.cgi?id=531160 580 // work due to NSS bug: https://bugzilla.mozilla.org/show_bug.cgi?id=531160
566 EXPECT_TRUE(cert_db_.SetCertTrust( 581 EXPECT_TRUE(cert_db_.SetCertTrust(
567 puny_cert.get(), CA_CERT, 582 puny_cert.get(), CA_CERT,
568 CertDatabase::TRUSTED_SSL | CertDatabase::TRUSTED_EMAIL)); 583 CertDatabase::TRUSTED_SSL | CertDatabase::TRUSTED_EMAIL));
569 584
570 verify_result.Reset(); 585 verify_result.Reset();
571 error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags, 586 error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags,
572 NULL, &verify_result); 587 NULL, &verify_result);
573 EXPECT_EQ(OK, error); 588 EXPECT_EQ(OK, error);
574 EXPECT_EQ(0U, verify_result.cert_status); 589 EXPECT_EQ(0U, verify_result.cert_status);
575 } 590 }
576 591
592 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned_Trusted) {
593 // When using CERT_PKIXVerifyCert (which we do), server trust only works from
594 // 3.13.4 onwards. See https://bugzilla.mozilla.org/show_bug.cgi?id=647364.
595 if (!NSS_VersionCheck("3.13.4")) {
596 LOG(INFO) << "test skipped on NSS < 3.13.4";
597 return;
598 }
599
600 CertificateList certs;
601 ASSERT_TRUE(ReadCertIntoList("punycodetest.der", &certs));
602
603 CertDatabase::ImportCertFailureList failed;
604 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUSTED_SSL,
605 &failed));
606
607 EXPECT_EQ(0U, failed.size());
608
609 CertificateList cert_list = ListCertsInSlot(slot_->os_module_handle());
610 ASSERT_EQ(1U, cert_list.size());
611 scoped_refptr<X509Certificate> puny_cert(cert_list[0]);
612
613 EXPECT_EQ(CertDatabase::TRUSTED_SSL,
614 cert_db_.GetCertTrust(puny_cert.get(), SERVER_CERT));
615 EXPECT_EQ(unsigned(CERTDB_TRUSTED | CERTDB_TERMINAL_RECORD),
616 puny_cert->os_cert_handle()->trust->sslFlags);
617 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->emailFlags);
618 EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->objectSigningFlags);
619
620 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
621 int flags = 0;
622 CertVerifyResult verify_result;
623 int error = verify_proc->Verify(puny_cert, "xn--wgv71a119e.com", flags,
624 NULL, &verify_result);
625 EXPECT_EQ(OK, error);
626 EXPECT_EQ(0U, verify_result.cert_status);
627 }
628
629 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert) {
630 CertificateList ca_certs = CreateCertificateListFromFile(
631 GetTestCertsDirectory(), "root_ca_cert.crt",
632 X509Certificate::FORMAT_AUTO);
633 ASSERT_EQ(1U, ca_certs.size());
634
635 // Import CA cert and trust it.
636 CertDatabase::ImportCertFailureList failed;
637 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL,
638 &failed));
639 EXPECT_EQ(0U, failed.size());
640
641 CertificateList certs = CreateCertificateListFromFile(
642 GetTestCertsDirectory(), "ok_cert.pem",
643 X509Certificate::FORMAT_AUTO);
644 ASSERT_EQ(1U, certs.size());
645
646 // Import server cert with default trust.
647 EXPECT_TRUE(cert_db_.ImportServerCert(certs, CertDatabase::TRUST_DEFAULT,
648 &failed));
649 EXPECT_EQ(0U, failed.size());
650
651 // Server cert should verify.
652 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
653 int flags = 0;
654 CertVerifyResult verify_result;
655 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
656 NULL, &verify_result);
657 EXPECT_EQ(OK, error);
658 EXPECT_EQ(0U, verify_result.cert_status);
659 }
660
661 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert_DistrustServer) {
662 // Explicit distrust only works starting in NSS 3.13.
663 if (!NSS_VersionCheck("3.13")) {
664 LOG(INFO) << "test skipped on NSS < 3.13";
665 return;
666 }
667
668 CertificateList ca_certs = CreateCertificateListFromFile(
669 GetTestCertsDirectory(), "root_ca_cert.crt",
670 X509Certificate::FORMAT_AUTO);
671 ASSERT_EQ(1U, ca_certs.size());
672
673 // Import CA cert and trust it.
674 CertDatabase::ImportCertFailureList failed;
675 EXPECT_TRUE(cert_db_.ImportCACerts(ca_certs, CertDatabase::TRUSTED_SSL,
676 &failed));
677 EXPECT_EQ(0U, failed.size());
678
679 CertificateList certs = CreateCertificateListFromFile(
680 GetTestCertsDirectory(), "ok_cert.pem",
681 X509Certificate::FORMAT_AUTO);
682 ASSERT_EQ(1U, certs.size());
683
684 // Import server cert without inheriting trust from issuer (explicit
685 // distrust).
686 EXPECT_TRUE(cert_db_.ImportServerCert(
687 certs, CertDatabase::DISTRUSTED_SSL, &failed));
688 EXPECT_EQ(0U, failed.size());
689 EXPECT_EQ(CertDatabase::DISTRUSTED_SSL,
690 cert_db_.GetCertTrust(certs[0], SERVER_CERT));
691
692 EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
693 certs[0]->os_cert_handle()->trust->sslFlags);
694 EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
695 certs[0]->os_cert_handle()->trust->emailFlags);
696 EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
697 certs[0]->os_cert_handle()->trust->objectSigningFlags);
698
699 // Server cert should fail to verify.
700 scoped_refptr<CertVerifyProc> verify_proc(CertVerifyProc::CreateDefault());
701 int flags = 0;
702 CertVerifyResult verify_result;
703 int error = verify_proc->Verify(certs[0], "127.0.0.1", flags,
704 NULL, &verify_result);
705 EXPECT_EQ(ERR_CERT_REVOKED, error);
706 EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
707 }
708
577 } // namespace net 709 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698