Home | History | Annotate | Download | only in cert
      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
      3 // found in the LICENSE file.
      4 
      5 #include <cert.h>
      6 #include <certdb.h>
      7 #include <pk11pub.h>
      8 
      9 #include <algorithm>
     10 
     11 #include "base/bind.h"
     12 #include "base/files/file_path.h"
     13 #include "base/files/file_util.h"
     14 #include "base/lazy_instance.h"
     15 #include "base/message_loop/message_loop.h"
     16 #include "base/message_loop/message_loop_proxy.h"
     17 #include "base/path_service.h"
     18 #include "base/run_loop.h"
     19 #include "base/strings/string16.h"
     20 #include "base/strings/string_util.h"
     21 #include "base/strings/utf_string_conversions.h"
     22 #include "crypto/scoped_nss_types.h"
     23 #include "crypto/scoped_test_nss_db.h"
     24 #include "net/base/crypto_module.h"
     25 #include "net/base/net_errors.h"
     26 #include "net/base/test_data_directory.h"
     27 #include "net/cert/cert_status_flags.h"
     28 #include "net/cert/cert_verify_proc_nss.h"
     29 #include "net/cert/cert_verify_result.h"
     30 #include "net/cert/nss_cert_database.h"
     31 #include "net/cert/x509_certificate.h"
     32 #include "net/test/cert_test_util.h"
     33 #include "net/third_party/mozilla_security_manager/nsNSSCertificateDB.h"
     34 #include "testing/gtest/include/gtest/gtest.h"
     35 
     36 // In NSS 3.13, CERTDB_VALID_PEER was renamed CERTDB_TERMINAL_RECORD. So we use
     37 // the new name of the macro.
     38 #if !defined(CERTDB_TERMINAL_RECORD)
     39 #define CERTDB_TERMINAL_RECORD CERTDB_VALID_PEER
     40 #endif
     41 
     42 using base::ASCIIToUTF16;
     43 
     44 namespace net {
     45 
     46 namespace {
     47 
     48 void SwapCertList(CertificateList* destination,
     49                   scoped_ptr<CertificateList> source) {
     50   ASSERT_TRUE(destination);
     51   destination->swap(*source);
     52 }
     53 
     54 }  // namespace
     55 
     56 class CertDatabaseNSSTest : public testing::Test {
     57  public:
     58   virtual void SetUp() {
     59     ASSERT_TRUE(test_nssdb_.is_open());
     60     cert_db_.reset(new NSSCertDatabase(
     61         crypto::ScopedPK11Slot(
     62             PK11_ReferenceSlot(test_nssdb_.slot())) /* public slot */,
     63         crypto::ScopedPK11Slot(
     64             PK11_ReferenceSlot(test_nssdb_.slot())) /* private slot */));
     65     public_module_ = cert_db_->GetPublicModule();
     66 
     67     // Test db should be empty at start of test.
     68     EXPECT_EQ(0U, ListCerts().size());
     69   }
     70 
     71   virtual void TearDown() {
     72     // Run the message loop to process any observer callbacks (e.g. for the
     73     // ClientSocketFactory singleton) so that the scoped ref ptrs created in
     74     // NSSCertDatabase::NotifyObservers* get released.
     75     base::MessageLoop::current()->RunUntilIdle();
     76   }
     77 
     78  protected:
     79   net::CryptoModule* GetPublicModule() {
     80     return public_module_.get();
     81   }
     82 
     83   static std::string ReadTestFile(const std::string& name) {
     84     std::string result;
     85     base::FilePath cert_path = GetTestCertsDirectory().AppendASCII(name);
     86     EXPECT_TRUE(base::ReadFileToString(cert_path, &result));
     87     return result;
     88   }
     89 
     90   static bool ReadCertIntoList(const std::string& name,
     91                                CertificateList* certs) {
     92     scoped_refptr<X509Certificate> cert(
     93         ImportCertFromFile(GetTestCertsDirectory(), name));
     94     if (!cert.get())
     95       return false;
     96 
     97     certs->push_back(cert);
     98     return true;
     99   }
    100 
    101   CertificateList ListCerts() {
    102     CertificateList result;
    103     CERTCertList* cert_list = PK11_ListCertsInSlot(test_nssdb_.slot());
    104     for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list);
    105          !CERT_LIST_END(node, cert_list);
    106          node = CERT_LIST_NEXT(node)) {
    107       result.push_back(X509Certificate::CreateFromHandle(
    108           node->cert, X509Certificate::OSCertHandles()));
    109     }
    110     CERT_DestroyCertList(cert_list);
    111 
    112     // Sort the result so that test comparisons can be deterministic.
    113     std::sort(result.begin(), result.end(), X509Certificate::LessThan());
    114     return result;
    115   }
    116 
    117   scoped_ptr<NSSCertDatabase> cert_db_;
    118   const CertificateList empty_cert_list_;
    119   crypto::ScopedTestNSSDB test_nssdb_;
    120   scoped_refptr<net::CryptoModule> public_module_;
    121 };
    122 
    123 TEST_F(CertDatabaseNSSTest, ListCertsSync) {
    124   // This test isn't terribly useful, though it will at least let valgrind test
    125   // for leaks.
    126   CertificateList certs;
    127   cert_db_->ListCertsSync(&certs);
    128   // The test DB is empty, but let's assume there will always be something in
    129   // the other slots.
    130   EXPECT_LT(0U, certs.size());
    131 }
    132 
    133 TEST_F(CertDatabaseNSSTest, ListCerts) {
    134   // This test isn't terribly useful, though it will at least let valgrind test
    135   // for leaks.
    136   CertificateList certs;
    137   cert_db_->SetSlowTaskRunnerForTest(base::MessageLoopProxy::current());
    138   cert_db_->ListCerts(base::Bind(&SwapCertList, base::Unretained(&certs)));
    139   EXPECT_EQ(0U, certs.size());
    140 
    141   base::RunLoop().RunUntilIdle();
    142 
    143   // The test DB is empty, but let's assume there will always be something in
    144   // the other slots.
    145   EXPECT_LT(0U, certs.size());
    146 }
    147 
    148 TEST_F(CertDatabaseNSSTest, ImportFromPKCS12WrongPassword) {
    149   std::string pkcs12_data = ReadTestFile("client.p12");
    150 
    151   EXPECT_EQ(ERR_PKCS12_IMPORT_BAD_PASSWORD,
    152             cert_db_->ImportFromPKCS12(GetPublicModule(),
    153                                        pkcs12_data,
    154                                        base::string16(),
    155                                        true,  // is_extractable
    156                                        NULL));
    157 
    158   // Test db should still be empty.
    159   EXPECT_EQ(0U, ListCerts().size());
    160 }
    161 
    162 TEST_F(CertDatabaseNSSTest, ImportFromPKCS12AsExtractableAndExportAgain) {
    163   std::string pkcs12_data = ReadTestFile("client.p12");
    164 
    165   EXPECT_EQ(OK,
    166             cert_db_->ImportFromPKCS12(GetPublicModule(),
    167                                        pkcs12_data,
    168                                        ASCIIToUTF16("12345"),
    169                                        true,  // is_extractable
    170                                        NULL));
    171 
    172   CertificateList cert_list = ListCerts();
    173   ASSERT_EQ(1U, cert_list.size());
    174   scoped_refptr<X509Certificate> cert(cert_list[0]);
    175 
    176   EXPECT_EQ("testusercert",
    177             cert->subject().common_name);
    178 
    179   // TODO(mattm): move export test to separate test case?
    180   std::string exported_data;
    181   EXPECT_EQ(1, cert_db_->ExportToPKCS12(cert_list, ASCIIToUTF16("exportpw"),
    182                                         &exported_data));
    183   ASSERT_LT(0U, exported_data.size());
    184   // TODO(mattm): further verification of exported data?
    185 }
    186 
    187 TEST_F(CertDatabaseNSSTest, ImportFromPKCS12Twice) {
    188   std::string pkcs12_data = ReadTestFile("client.p12");
    189 
    190   EXPECT_EQ(OK,
    191             cert_db_->ImportFromPKCS12(GetPublicModule(),
    192                                        pkcs12_data,
    193                                        ASCIIToUTF16("12345"),
    194                                        true,  // is_extractable
    195                                        NULL));
    196   EXPECT_EQ(1U, ListCerts().size());
    197 
    198   // NSS has a SEC_ERROR_PKCS12_DUPLICATE_DATA error, but it doesn't look like
    199   // it's ever used.  This test verifies that.
    200   EXPECT_EQ(OK,
    201             cert_db_->ImportFromPKCS12(GetPublicModule(),
    202                                        pkcs12_data,
    203                                        ASCIIToUTF16("12345"),
    204                                        true,  // is_extractable
    205                                        NULL));
    206   EXPECT_EQ(1U, ListCerts().size());
    207 }
    208 
    209 TEST_F(CertDatabaseNSSTest, ImportFromPKCS12AsUnextractableAndExportAgain) {
    210   std::string pkcs12_data = ReadTestFile("client.p12");
    211 
    212   EXPECT_EQ(OK,
    213             cert_db_->ImportFromPKCS12(GetPublicModule(),
    214                                        pkcs12_data,
    215                                        ASCIIToUTF16("12345"),
    216                                        false,  // is_extractable
    217                                        NULL));
    218 
    219   CertificateList cert_list = ListCerts();
    220   ASSERT_EQ(1U, cert_list.size());
    221   scoped_refptr<X509Certificate> cert(cert_list[0]);
    222 
    223   EXPECT_EQ("testusercert",
    224             cert->subject().common_name);
    225 
    226   std::string exported_data;
    227   EXPECT_EQ(0, cert_db_->ExportToPKCS12(cert_list, ASCIIToUTF16("exportpw"),
    228                                         &exported_data));
    229 }
    230 
    231 // Importing a PKCS#12 file with a certificate but no corresponding
    232 // private key should not mark an existing private key as unextractable.
    233 TEST_F(CertDatabaseNSSTest, ImportFromPKCS12OnlyMarkIncludedKey) {
    234   std::string pkcs12_data = ReadTestFile("client.p12");
    235   EXPECT_EQ(OK,
    236             cert_db_->ImportFromPKCS12(GetPublicModule(),
    237                                        pkcs12_data,
    238                                        ASCIIToUTF16("12345"),
    239                                        true,  // is_extractable
    240                                        NULL));
    241 
    242   CertificateList cert_list = ListCerts();
    243   ASSERT_EQ(1U, cert_list.size());
    244 
    245   // Now import a PKCS#12 file with just a certificate but no private key.
    246   pkcs12_data = ReadTestFile("client-nokey.p12");
    247   EXPECT_EQ(OK,
    248             cert_db_->ImportFromPKCS12(GetPublicModule(),
    249                                        pkcs12_data,
    250                                        ASCIIToUTF16("12345"),
    251                                        false,  // is_extractable
    252                                        NULL));
    253 
    254   cert_list = ListCerts();
    255   ASSERT_EQ(1U, cert_list.size());
    256 
    257   // Make sure the imported private key is still extractable.
    258   std::string exported_data;
    259   EXPECT_EQ(1, cert_db_->ExportToPKCS12(cert_list, ASCIIToUTF16("exportpw"),
    260                                         &exported_data));
    261   ASSERT_LT(0U, exported_data.size());
    262 }
    263 
    264 TEST_F(CertDatabaseNSSTest, ImportFromPKCS12InvalidFile) {
    265   std::string pkcs12_data = "Foobarbaz";
    266 
    267   EXPECT_EQ(ERR_PKCS12_IMPORT_INVALID_FILE,
    268             cert_db_->ImportFromPKCS12(GetPublicModule(),
    269                                        pkcs12_data,
    270                                        base::string16(),
    271                                        true,  // is_extractable
    272                                        NULL));
    273 
    274   // Test db should still be empty.
    275   EXPECT_EQ(0U, ListCerts().size());
    276 }
    277 
    278 TEST_F(CertDatabaseNSSTest, ImportCACert_SSLTrust) {
    279   CertificateList certs = CreateCertificateListFromFile(
    280       GetTestCertsDirectory(), "root_ca_cert.pem",
    281       X509Certificate::FORMAT_AUTO);
    282   ASSERT_EQ(1U, certs.size());
    283   EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
    284 
    285   // Import it.
    286   NSSCertDatabase::ImportCertFailureList failed;
    287   EXPECT_TRUE(cert_db_->ImportCACerts(certs, NSSCertDatabase::TRUSTED_SSL,
    288                                       &failed));
    289 
    290   EXPECT_EQ(0U, failed.size());
    291 
    292   CertificateList cert_list = ListCerts();
    293   ASSERT_EQ(1U, cert_list.size());
    294   scoped_refptr<X509Certificate> cert(cert_list[0]);
    295   EXPECT_EQ("Test Root CA", cert->subject().common_name);
    296 
    297   EXPECT_EQ(NSSCertDatabase::TRUSTED_SSL,
    298             cert_db_->GetCertTrust(cert.get(), CA_CERT));
    299 
    300   EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
    301                      CERTDB_TRUSTED_CLIENT_CA),
    302             cert->os_cert_handle()->trust->sslFlags);
    303   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    304             cert->os_cert_handle()->trust->emailFlags);
    305   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    306             cert->os_cert_handle()->trust->objectSigningFlags);
    307 }
    308 
    309 TEST_F(CertDatabaseNSSTest, ImportCACert_EmailTrust) {
    310   CertificateList certs = CreateCertificateListFromFile(
    311       GetTestCertsDirectory(), "root_ca_cert.pem",
    312       X509Certificate::FORMAT_AUTO);
    313   ASSERT_EQ(1U, certs.size());
    314   EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
    315 
    316   // Import it.
    317   NSSCertDatabase::ImportCertFailureList failed;
    318   EXPECT_TRUE(cert_db_->ImportCACerts(certs, NSSCertDatabase::TRUSTED_EMAIL,
    319                                       &failed));
    320 
    321   EXPECT_EQ(0U, failed.size());
    322 
    323   CertificateList cert_list = ListCerts();
    324   ASSERT_EQ(1U, cert_list.size());
    325   scoped_refptr<X509Certificate> cert(cert_list[0]);
    326   EXPECT_EQ("Test Root CA", cert->subject().common_name);
    327 
    328   EXPECT_EQ(NSSCertDatabase::TRUSTED_EMAIL,
    329             cert_db_->GetCertTrust(cert.get(), CA_CERT));
    330 
    331   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    332             cert->os_cert_handle()->trust->sslFlags);
    333   EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
    334                      CERTDB_TRUSTED_CLIENT_CA),
    335             cert->os_cert_handle()->trust->emailFlags);
    336   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    337             cert->os_cert_handle()->trust->objectSigningFlags);
    338 }
    339 
    340 TEST_F(CertDatabaseNSSTest, ImportCACert_ObjSignTrust) {
    341   CertificateList certs = CreateCertificateListFromFile(
    342       GetTestCertsDirectory(), "root_ca_cert.pem",
    343       X509Certificate::FORMAT_AUTO);
    344   ASSERT_EQ(1U, certs.size());
    345   EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
    346 
    347   // Import it.
    348   NSSCertDatabase::ImportCertFailureList failed;
    349   EXPECT_TRUE(cert_db_->ImportCACerts(certs, NSSCertDatabase::TRUSTED_OBJ_SIGN,
    350                                       &failed));
    351 
    352   EXPECT_EQ(0U, failed.size());
    353 
    354   CertificateList cert_list = ListCerts();
    355   ASSERT_EQ(1U, cert_list.size());
    356   scoped_refptr<X509Certificate> cert(cert_list[0]);
    357   EXPECT_EQ("Test Root CA", cert->subject().common_name);
    358 
    359   EXPECT_EQ(NSSCertDatabase::TRUSTED_OBJ_SIGN,
    360             cert_db_->GetCertTrust(cert.get(), CA_CERT));
    361 
    362   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    363             cert->os_cert_handle()->trust->sslFlags);
    364   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    365             cert->os_cert_handle()->trust->emailFlags);
    366   EXPECT_EQ(unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA |
    367                      CERTDB_TRUSTED_CLIENT_CA),
    368             cert->os_cert_handle()->trust->objectSigningFlags);
    369 }
    370 
    371 TEST_F(CertDatabaseNSSTest, ImportCA_NotCACert) {
    372   CertificateList certs = CreateCertificateListFromFile(
    373       GetTestCertsDirectory(), "ok_cert.pem",
    374       X509Certificate::FORMAT_AUTO);
    375   ASSERT_EQ(1U, certs.size());
    376   EXPECT_FALSE(certs[0]->os_cert_handle()->isperm);
    377 
    378   // Import it.
    379   NSSCertDatabase::ImportCertFailureList failed;
    380   EXPECT_TRUE(cert_db_->ImportCACerts(certs, NSSCertDatabase::TRUSTED_SSL,
    381                                       &failed));
    382   ASSERT_EQ(1U, failed.size());
    383   // Note: this compares pointers directly.  It's okay in this case because
    384   // ImportCACerts returns the same pointers that were passed in.  In the
    385   // general case IsSameOSCert should be used.
    386   EXPECT_EQ(certs[0], failed[0].certificate);
    387   EXPECT_EQ(ERR_IMPORT_CA_CERT_NOT_CA, failed[0].net_error);
    388 
    389   EXPECT_EQ(0U, ListCerts().size());
    390 }
    391 
    392 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchy) {
    393   CertificateList certs;
    394   ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs));
    395   ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
    396   ASSERT_TRUE(ReadCertIntoList("www_us_army_mil_cert.der", &certs));
    397 
    398   // Import it.
    399   NSSCertDatabase::ImportCertFailureList failed;
    400   // Have to specify email trust for the cert verification of the child cert to
    401   // work (see
    402   // http://mxr.mozilla.org/mozilla/source/security/nss/lib/certhigh/certvfy.c#752
    403   // "XXX This choice of trustType seems arbitrary.")
    404   EXPECT_TRUE(cert_db_->ImportCACerts(
    405       certs, NSSCertDatabase::TRUSTED_SSL | NSSCertDatabase::TRUSTED_EMAIL,
    406       &failed));
    407 
    408   ASSERT_EQ(2U, failed.size());
    409   EXPECT_EQ("DOD CA-17", failed[0].certificate->subject().common_name);
    410   EXPECT_EQ(ERR_FAILED, failed[0].net_error);  // The certificate expired.
    411   EXPECT_EQ("www.us.army.mil", failed[1].certificate->subject().common_name);
    412   EXPECT_EQ(ERR_IMPORT_CA_CERT_NOT_CA, failed[1].net_error);
    413 
    414   CertificateList cert_list = ListCerts();
    415   ASSERT_EQ(1U, cert_list.size());
    416   EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name);
    417 }
    418 
    419 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyDupeRoot) {
    420   CertificateList certs;
    421   ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs));
    422 
    423   // First import just the root.
    424   NSSCertDatabase::ImportCertFailureList failed;
    425   EXPECT_TRUE(cert_db_->ImportCACerts(
    426       certs, NSSCertDatabase::TRUSTED_SSL | NSSCertDatabase::TRUSTED_EMAIL,
    427       &failed));
    428 
    429   EXPECT_EQ(0U, failed.size());
    430   CertificateList cert_list = ListCerts();
    431   ASSERT_EQ(1U, cert_list.size());
    432   EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name);
    433 
    434   ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
    435   ASSERT_TRUE(ReadCertIntoList("www_us_army_mil_cert.der", &certs));
    436 
    437   // Now import with the other certs in the list too.  Even though the root is
    438   // already present, we should still import the rest.
    439   failed.clear();
    440   EXPECT_TRUE(cert_db_->ImportCACerts(
    441       certs, NSSCertDatabase::TRUSTED_SSL | NSSCertDatabase::TRUSTED_EMAIL,
    442       &failed));
    443 
    444   ASSERT_EQ(3U, failed.size());
    445   EXPECT_EQ("DoD Root CA 2", failed[0].certificate->subject().common_name);
    446   EXPECT_EQ(ERR_IMPORT_CERT_ALREADY_EXISTS, failed[0].net_error);
    447   EXPECT_EQ("DOD CA-17", failed[1].certificate->subject().common_name);
    448   EXPECT_EQ(ERR_FAILED, failed[1].net_error);  // The certificate expired.
    449   EXPECT_EQ("www.us.army.mil", failed[2].certificate->subject().common_name);
    450   EXPECT_EQ(ERR_IMPORT_CA_CERT_NOT_CA, failed[2].net_error);
    451 
    452   cert_list = ListCerts();
    453   ASSERT_EQ(1U, cert_list.size());
    454   EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name);
    455 }
    456 
    457 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyUntrusted) {
    458   CertificateList certs;
    459   ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs));
    460   ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
    461 
    462   // Import it.
    463   NSSCertDatabase::ImportCertFailureList failed;
    464   EXPECT_TRUE(cert_db_->ImportCACerts(certs, NSSCertDatabase::TRUST_DEFAULT,
    465                                       &failed));
    466 
    467   ASSERT_EQ(1U, failed.size());
    468   EXPECT_EQ("DOD CA-17", failed[0].certificate->subject().common_name);
    469   // TODO(mattm): should check for net error equivalent of
    470   // SEC_ERROR_UNTRUSTED_ISSUER
    471   EXPECT_EQ(ERR_FAILED, failed[0].net_error);
    472 
    473   CertificateList cert_list = ListCerts();
    474   ASSERT_EQ(1U, cert_list.size());
    475   EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name);
    476 }
    477 
    478 TEST_F(CertDatabaseNSSTest, ImportCACertHierarchyTree) {
    479   CertificateList certs;
    480   ASSERT_TRUE(ReadCertIntoList("dod_root_ca_2_cert.der", &certs));
    481   ASSERT_TRUE(ReadCertIntoList("dod_ca_13_cert.der", &certs));
    482   ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
    483 
    484   // Import it.
    485   NSSCertDatabase::ImportCertFailureList failed;
    486   EXPECT_TRUE(cert_db_->ImportCACerts(
    487       certs, NSSCertDatabase::TRUSTED_SSL | NSSCertDatabase::TRUSTED_EMAIL,
    488       &failed));
    489 
    490   EXPECT_EQ(2U, failed.size());
    491   EXPECT_EQ("DOD CA-13", failed[0].certificate->subject().common_name);
    492   EXPECT_EQ(ERR_FAILED, failed[0].net_error);  // The certificate expired.
    493   EXPECT_EQ("DOD CA-17", failed[1].certificate->subject().common_name);
    494   EXPECT_EQ(ERR_FAILED, failed[1].net_error);  // The certificate expired.
    495 
    496   CertificateList cert_list = ListCerts();
    497   ASSERT_EQ(1U, cert_list.size());
    498   EXPECT_EQ("DoD Root CA 2", cert_list[0]->subject().common_name);
    499 }
    500 
    501 TEST_F(CertDatabaseNSSTest, ImportCACertNotHierarchy) {
    502   CertificateList certs = CreateCertificateListFromFile(
    503       GetTestCertsDirectory(), "root_ca_cert.pem",
    504       X509Certificate::FORMAT_AUTO);
    505   ASSERT_EQ(1U, certs.size());
    506   ASSERT_TRUE(ReadCertIntoList("dod_ca_13_cert.der", &certs));
    507   ASSERT_TRUE(ReadCertIntoList("dod_ca_17_cert.der", &certs));
    508 
    509   // Import it.
    510   NSSCertDatabase::ImportCertFailureList failed;
    511   EXPECT_TRUE(cert_db_->ImportCACerts(
    512       certs, NSSCertDatabase::TRUSTED_SSL | NSSCertDatabase::TRUSTED_EMAIL |
    513       NSSCertDatabase::TRUSTED_OBJ_SIGN, &failed));
    514 
    515   ASSERT_EQ(2U, failed.size());
    516   // TODO(mattm): should check for net error equivalent of
    517   // SEC_ERROR_UNKNOWN_ISSUER
    518   EXPECT_EQ("DOD CA-13", failed[0].certificate->subject().common_name);
    519   EXPECT_EQ(ERR_FAILED, failed[0].net_error);
    520   EXPECT_EQ("DOD CA-17", failed[1].certificate->subject().common_name);
    521   EXPECT_EQ(ERR_FAILED, failed[1].net_error);
    522 
    523   CertificateList cert_list = ListCerts();
    524   ASSERT_EQ(1U, cert_list.size());
    525   EXPECT_EQ("Test Root CA", cert_list[0]->subject().common_name);
    526 }
    527 
    528 // http://crbug.com/108009 - Disabled, as google.chain.pem is an expired
    529 // certificate.
    530 TEST_F(CertDatabaseNSSTest, DISABLED_ImportServerCert) {
    531   // Need to import intermediate cert for the verify of google cert, otherwise
    532   // it will try to fetch it automatically with cert_pi_useAIACertFetch, which
    533   // will cause OCSPCreateSession on the main thread, which is not allowed.
    534   CertificateList certs = CreateCertificateListFromFile(
    535       GetTestCertsDirectory(), "google.chain.pem",
    536       X509Certificate::FORMAT_AUTO);
    537   ASSERT_EQ(2U, certs.size());
    538 
    539   NSSCertDatabase::ImportCertFailureList failed;
    540   EXPECT_TRUE(cert_db_->ImportServerCert(certs, NSSCertDatabase::TRUST_DEFAULT,
    541                                          &failed));
    542 
    543   EXPECT_EQ(0U, failed.size());
    544 
    545   CertificateList cert_list = ListCerts();
    546   ASSERT_EQ(2U, cert_list.size());
    547   scoped_refptr<X509Certificate> goog_cert(cert_list[0]);
    548   scoped_refptr<X509Certificate> thawte_cert(cert_list[1]);
    549   EXPECT_EQ("www.google.com", goog_cert->subject().common_name);
    550   EXPECT_EQ("Thawte SGC CA", thawte_cert->subject().common_name);
    551 
    552   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
    553             cert_db_->GetCertTrust(goog_cert.get(), SERVER_CERT));
    554 
    555   EXPECT_EQ(0U, goog_cert->os_cert_handle()->trust->sslFlags);
    556 
    557   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    558   int flags = 0;
    559   CertVerifyResult verify_result;
    560   int error = verify_proc->Verify(goog_cert.get(),
    561                                   "www.google.com",
    562                                   flags,
    563                                   NULL,
    564                                   empty_cert_list_,
    565                                   &verify_result);
    566   EXPECT_EQ(OK, error);
    567   EXPECT_EQ(0U, verify_result.cert_status);
    568 }
    569 
    570 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned) {
    571   CertificateList certs;
    572   ASSERT_TRUE(ReadCertIntoList("punycodetest.pem", &certs));
    573 
    574   NSSCertDatabase::ImportCertFailureList failed;
    575   EXPECT_TRUE(cert_db_->ImportServerCert(certs, NSSCertDatabase::TRUST_DEFAULT,
    576                                          &failed));
    577 
    578   EXPECT_EQ(0U, failed.size());
    579 
    580   CertificateList cert_list = ListCerts();
    581   ASSERT_EQ(1U, cert_list.size());
    582   scoped_refptr<X509Certificate> puny_cert(cert_list[0]);
    583 
    584   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
    585             cert_db_->GetCertTrust(puny_cert.get(), SERVER_CERT));
    586   EXPECT_EQ(0U, puny_cert->os_cert_handle()->trust->sslFlags);
    587 
    588   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    589   int flags = 0;
    590   CertVerifyResult verify_result;
    591   int error = verify_proc->Verify(puny_cert.get(),
    592                                   "xn--wgv71a119e.com",
    593                                   flags,
    594                                   NULL,
    595                                   empty_cert_list_,
    596                                   &verify_result);
    597   EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
    598   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
    599 }
    600 
    601 TEST_F(CertDatabaseNSSTest, ImportServerCert_SelfSigned_Trusted) {
    602   CertificateList certs;
    603   ASSERT_TRUE(ReadCertIntoList("punycodetest.pem", &certs));
    604 
    605   NSSCertDatabase::ImportCertFailureList failed;
    606   EXPECT_TRUE(cert_db_->ImportServerCert(certs, NSSCertDatabase::TRUSTED_SSL,
    607                                          &failed));
    608 
    609   EXPECT_EQ(0U, failed.size());
    610 
    611   CertificateList cert_list = ListCerts();
    612   ASSERT_EQ(1U, cert_list.size());
    613   scoped_refptr<X509Certificate> puny_cert(cert_list[0]);
    614 
    615   EXPECT_EQ(NSSCertDatabase::TRUSTED_SSL,
    616             cert_db_->GetCertTrust(puny_cert.get(), SERVER_CERT));
    617   EXPECT_EQ(unsigned(CERTDB_TRUSTED | CERTDB_TERMINAL_RECORD),
    618             puny_cert->os_cert_handle()->trust->sslFlags);
    619 
    620   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    621   int flags = 0;
    622   CertVerifyResult verify_result;
    623   int error = verify_proc->Verify(puny_cert.get(),
    624                                   "xn--wgv71a119e.com",
    625                                   flags,
    626                                   NULL,
    627                                   empty_cert_list_,
    628                                   &verify_result);
    629   EXPECT_EQ(OK, error);
    630   EXPECT_EQ(0U, verify_result.cert_status);
    631 }
    632 
    633 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert) {
    634   CertificateList ca_certs = CreateCertificateListFromFile(
    635       GetTestCertsDirectory(), "root_ca_cert.pem",
    636       X509Certificate::FORMAT_AUTO);
    637   ASSERT_EQ(1U, ca_certs.size());
    638 
    639   // Import CA cert and trust it.
    640   NSSCertDatabase::ImportCertFailureList failed;
    641   EXPECT_TRUE(cert_db_->ImportCACerts(ca_certs, NSSCertDatabase::TRUSTED_SSL,
    642                                       &failed));
    643   EXPECT_EQ(0U, failed.size());
    644 
    645   CertificateList certs = CreateCertificateListFromFile(
    646       GetTestCertsDirectory(), "ok_cert.pem",
    647       X509Certificate::FORMAT_AUTO);
    648   ASSERT_EQ(1U, certs.size());
    649 
    650   // Import server cert with default trust.
    651   EXPECT_TRUE(cert_db_->ImportServerCert(certs, NSSCertDatabase::TRUST_DEFAULT,
    652                                          &failed));
    653   EXPECT_EQ(0U, failed.size());
    654 
    655   // Server cert should verify.
    656   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    657   int flags = 0;
    658   CertVerifyResult verify_result;
    659   int error = verify_proc->Verify(certs[0].get(),
    660                                   "127.0.0.1",
    661                                   flags,
    662                                   NULL,
    663                                   empty_cert_list_,
    664                                   &verify_result);
    665   EXPECT_EQ(OK, error);
    666   EXPECT_EQ(0U, verify_result.cert_status);
    667 }
    668 
    669 TEST_F(CertDatabaseNSSTest, ImportCaAndServerCert_DistrustServer) {
    670   CertificateList ca_certs = CreateCertificateListFromFile(
    671       GetTestCertsDirectory(), "root_ca_cert.pem",
    672       X509Certificate::FORMAT_AUTO);
    673   ASSERT_EQ(1U, ca_certs.size());
    674 
    675   // Import CA cert and trust it.
    676   NSSCertDatabase::ImportCertFailureList failed;
    677   EXPECT_TRUE(cert_db_->ImportCACerts(ca_certs, NSSCertDatabase::TRUSTED_SSL,
    678                                       &failed));
    679   EXPECT_EQ(0U, failed.size());
    680 
    681   CertificateList certs = CreateCertificateListFromFile(
    682       GetTestCertsDirectory(), "ok_cert.pem",
    683       X509Certificate::FORMAT_AUTO);
    684   ASSERT_EQ(1U, certs.size());
    685 
    686   // Import server cert without inheriting trust from issuer (explicit
    687   // distrust).
    688   EXPECT_TRUE(cert_db_->ImportServerCert(
    689       certs, NSSCertDatabase::DISTRUSTED_SSL, &failed));
    690   EXPECT_EQ(0U, failed.size());
    691   EXPECT_EQ(NSSCertDatabase::DISTRUSTED_SSL,
    692             cert_db_->GetCertTrust(certs[0].get(), SERVER_CERT));
    693 
    694   EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
    695             certs[0]->os_cert_handle()->trust->sslFlags);
    696 
    697   // Server cert should fail to verify.
    698   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    699   int flags = 0;
    700   CertVerifyResult verify_result;
    701   int error = verify_proc->Verify(certs[0].get(),
    702                                   "127.0.0.1",
    703                                   flags,
    704                                   NULL,
    705                                   empty_cert_list_,
    706                                   &verify_result);
    707   EXPECT_EQ(ERR_CERT_REVOKED, error);
    708   EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
    709 }
    710 
    711 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa) {
    712   CertificateList ca_certs = CreateCertificateListFromFile(
    713       GetTestCertsDirectory(), "2048-rsa-root.pem",
    714       X509Certificate::FORMAT_AUTO);
    715   ASSERT_EQ(1U, ca_certs.size());
    716 
    717   // Import Root CA cert and distrust it.
    718   NSSCertDatabase::ImportCertFailureList failed;
    719   EXPECT_TRUE(cert_db_->ImportCACerts(ca_certs, NSSCertDatabase::DISTRUSTED_SSL,
    720                                       &failed));
    721   EXPECT_EQ(0U, failed.size());
    722 
    723   CertificateList intermediate_certs = CreateCertificateListFromFile(
    724       GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
    725       X509Certificate::FORMAT_AUTO);
    726   ASSERT_EQ(1U, intermediate_certs.size());
    727 
    728   // Import Intermediate CA cert and trust it.
    729   EXPECT_TRUE(cert_db_->ImportCACerts(intermediate_certs,
    730                                       NSSCertDatabase::TRUSTED_SSL, &failed));
    731   EXPECT_EQ(0U, failed.size());
    732 
    733   CertificateList certs = CreateCertificateListFromFile(
    734       GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
    735       X509Certificate::FORMAT_AUTO);
    736   ASSERT_EQ(1U, certs.size());
    737 
    738   // Import server cert with default trust.
    739   EXPECT_TRUE(cert_db_->ImportServerCert(
    740       certs, NSSCertDatabase::TRUST_DEFAULT, &failed));
    741   EXPECT_EQ(0U, failed.size());
    742   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
    743             cert_db_->GetCertTrust(certs[0].get(), SERVER_CERT));
    744 
    745   // Server cert should verify.
    746   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    747   int flags = 0;
    748   CertVerifyResult verify_result;
    749   int error = verify_proc->Verify(certs[0].get(),
    750                                   "127.0.0.1",
    751                                   flags,
    752                                   NULL,
    753                                   empty_cert_list_,
    754                                   &verify_result);
    755   EXPECT_EQ(OK, error);
    756   EXPECT_EQ(0U, verify_result.cert_status);
    757 
    758   // Trust the root cert and distrust the intermediate.
    759   EXPECT_TRUE(cert_db_->SetCertTrust(
    760       ca_certs[0].get(), CA_CERT, NSSCertDatabase::TRUSTED_SSL));
    761   EXPECT_TRUE(cert_db_->SetCertTrust(
    762       intermediate_certs[0].get(), CA_CERT, NSSCertDatabase::DISTRUSTED_SSL));
    763   EXPECT_EQ(
    764       unsigned(CERTDB_VALID_CA | CERTDB_TRUSTED_CA | CERTDB_TRUSTED_CLIENT_CA),
    765       ca_certs[0]->os_cert_handle()->trust->sslFlags);
    766   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    767             ca_certs[0]->os_cert_handle()->trust->emailFlags);
    768   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    769             ca_certs[0]->os_cert_handle()->trust->objectSigningFlags);
    770   EXPECT_EQ(unsigned(CERTDB_TERMINAL_RECORD),
    771             intermediate_certs[0]->os_cert_handle()->trust->sslFlags);
    772   EXPECT_EQ(unsigned(CERTDB_VALID_CA),
    773             intermediate_certs[0]->os_cert_handle()->trust->emailFlags);
    774   EXPECT_EQ(
    775       unsigned(CERTDB_VALID_CA),
    776       intermediate_certs[0]->os_cert_handle()->trust->objectSigningFlags);
    777 
    778   // Server cert should fail to verify.
    779   CertVerifyResult verify_result2;
    780   error = verify_proc->Verify(certs[0].get(),
    781                               "127.0.0.1",
    782                               flags,
    783                               NULL,
    784                               empty_cert_list_,
    785                               &verify_result2);
    786   EXPECT_EQ(ERR_CERT_REVOKED, error);
    787   EXPECT_EQ(CERT_STATUS_REVOKED, verify_result2.cert_status);
    788 }
    789 
    790 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa2) {
    791   if (NSS_VersionCheck("3.14.2") && !NSS_VersionCheck("3.15")) {
    792     // See http://bugzil.la/863947 for details.
    793     LOG(INFO) << "Skipping test for NSS 3.14.2 - NSS 3.15";
    794     return;
    795   }
    796 
    797   NSSCertDatabase::ImportCertFailureList failed;
    798 
    799   CertificateList intermediate_certs = CreateCertificateListFromFile(
    800       GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
    801       X509Certificate::FORMAT_AUTO);
    802   ASSERT_EQ(1U, intermediate_certs.size());
    803 
    804   // Import Intermediate CA cert and trust it.
    805   EXPECT_TRUE(cert_db_->ImportCACerts(intermediate_certs,
    806                                       NSSCertDatabase::TRUSTED_SSL, &failed));
    807   EXPECT_EQ(0U, failed.size());
    808 
    809   CertificateList certs = CreateCertificateListFromFile(
    810       GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
    811       X509Certificate::FORMAT_AUTO);
    812   ASSERT_EQ(1U, certs.size());
    813 
    814   // Import server cert with default trust.
    815   EXPECT_TRUE(cert_db_->ImportServerCert(
    816       certs, NSSCertDatabase::TRUST_DEFAULT, &failed));
    817   EXPECT_EQ(0U, failed.size());
    818   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
    819             cert_db_->GetCertTrust(certs[0].get(), SERVER_CERT));
    820 
    821   // Server cert should verify.
    822   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    823   int flags = 0;
    824   CertVerifyResult verify_result;
    825   int error = verify_proc->Verify(certs[0].get(),
    826                                   "127.0.0.1",
    827                                   flags,
    828                                   NULL,
    829                                   empty_cert_list_,
    830                                   &verify_result);
    831   EXPECT_EQ(OK, error);
    832   EXPECT_EQ(0U, verify_result.cert_status);
    833 
    834   // Without explicit trust of the intermediate, verification should fail.
    835   EXPECT_TRUE(cert_db_->SetCertTrust(
    836       intermediate_certs[0].get(), CA_CERT, NSSCertDatabase::TRUST_DEFAULT));
    837 
    838   // Server cert should fail to verify.
    839   CertVerifyResult verify_result2;
    840   error = verify_proc->Verify(certs[0].get(),
    841                               "127.0.0.1",
    842                               flags,
    843                               NULL,
    844                               empty_cert_list_,
    845                               &verify_result2);
    846   EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
    847   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result2.cert_status);
    848 }
    849 
    850 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa3) {
    851   if (NSS_VersionCheck("3.14.2") && !NSS_VersionCheck("3.15")) {
    852     // See http://bugzil.la/863947 for details.
    853     LOG(INFO) << "Skipping test for NSS 3.14.2 - NSS 3.15";
    854     return;
    855   }
    856 
    857   NSSCertDatabase::ImportCertFailureList failed;
    858 
    859   CertificateList ca_certs = CreateCertificateListFromFile(
    860       GetTestCertsDirectory(), "2048-rsa-root.pem",
    861       X509Certificate::FORMAT_AUTO);
    862   ASSERT_EQ(1U, ca_certs.size());
    863 
    864   // Import Root CA cert and default trust it.
    865   EXPECT_TRUE(cert_db_->ImportCACerts(ca_certs, NSSCertDatabase::TRUST_DEFAULT,
    866                                       &failed));
    867   EXPECT_EQ(0U, failed.size());
    868 
    869   CertificateList intermediate_certs = CreateCertificateListFromFile(
    870       GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
    871       X509Certificate::FORMAT_AUTO);
    872   ASSERT_EQ(1U, intermediate_certs.size());
    873 
    874   // Import Intermediate CA cert and trust it.
    875   EXPECT_TRUE(cert_db_->ImportCACerts(intermediate_certs,
    876                                       NSSCertDatabase::TRUSTED_SSL, &failed));
    877   EXPECT_EQ(0U, failed.size());
    878 
    879   CertificateList certs = CreateCertificateListFromFile(
    880       GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
    881       X509Certificate::FORMAT_AUTO);
    882   ASSERT_EQ(1U, certs.size());
    883 
    884   // Import server cert with default trust.
    885   EXPECT_TRUE(cert_db_->ImportServerCert(
    886       certs, NSSCertDatabase::TRUST_DEFAULT, &failed));
    887   EXPECT_EQ(0U, failed.size());
    888   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
    889             cert_db_->GetCertTrust(certs[0].get(), SERVER_CERT));
    890 
    891   // Server cert should verify.
    892   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    893   int flags = 0;
    894   CertVerifyResult verify_result;
    895   int error = verify_proc->Verify(certs[0].get(),
    896                                   "127.0.0.1",
    897                                   flags,
    898                                   NULL,
    899                                   empty_cert_list_,
    900                                   &verify_result);
    901   EXPECT_EQ(OK, error);
    902   EXPECT_EQ(0U, verify_result.cert_status);
    903 
    904   // Without explicit trust of the intermediate, verification should fail.
    905   EXPECT_TRUE(cert_db_->SetCertTrust(
    906       intermediate_certs[0].get(), CA_CERT, NSSCertDatabase::TRUST_DEFAULT));
    907 
    908   // Server cert should fail to verify.
    909   CertVerifyResult verify_result2;
    910   error = verify_proc->Verify(certs[0].get(),
    911                               "127.0.0.1",
    912                               flags,
    913                               NULL,
    914                               empty_cert_list_,
    915                               &verify_result2);
    916   EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
    917   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result2.cert_status);
    918 }
    919 
    920 TEST_F(CertDatabaseNSSTest, TrustIntermediateCa4) {
    921   NSSCertDatabase::ImportCertFailureList failed;
    922 
    923   CertificateList ca_certs = CreateCertificateListFromFile(
    924       GetTestCertsDirectory(), "2048-rsa-root.pem",
    925       X509Certificate::FORMAT_AUTO);
    926   ASSERT_EQ(1U, ca_certs.size());
    927 
    928   // Import Root CA cert and trust it.
    929   EXPECT_TRUE(cert_db_->ImportCACerts(ca_certs, NSSCertDatabase::TRUSTED_SSL,
    930                                       &failed));
    931   EXPECT_EQ(0U, failed.size());
    932 
    933   CertificateList intermediate_certs = CreateCertificateListFromFile(
    934       GetTestCertsDirectory(), "2048-rsa-intermediate.pem",
    935       X509Certificate::FORMAT_AUTO);
    936   ASSERT_EQ(1U, intermediate_certs.size());
    937 
    938   // Import Intermediate CA cert and distrust it.
    939   EXPECT_TRUE(cert_db_->ImportCACerts(
    940         intermediate_certs, NSSCertDatabase::DISTRUSTED_SSL, &failed));
    941   EXPECT_EQ(0U, failed.size());
    942 
    943   CertificateList certs = CreateCertificateListFromFile(
    944       GetTestCertsDirectory(), "2048-rsa-ee-by-2048-rsa-intermediate.pem",
    945       X509Certificate::FORMAT_AUTO);
    946   ASSERT_EQ(1U, certs.size());
    947 
    948   // Import server cert with default trust.
    949   EXPECT_TRUE(cert_db_->ImportServerCert(
    950       certs, NSSCertDatabase::TRUST_DEFAULT, &failed));
    951   EXPECT_EQ(0U, failed.size());
    952   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
    953             cert_db_->GetCertTrust(certs[0].get(), SERVER_CERT));
    954 
    955   // Server cert should not verify.
    956   scoped_refptr<CertVerifyProc> verify_proc(new CertVerifyProcNSS());
    957   int flags = 0;
    958   CertVerifyResult verify_result;
    959   int error = verify_proc->Verify(certs[0].get(),
    960                                   "127.0.0.1",
    961                                   flags,
    962                                   NULL,
    963                                   empty_cert_list_,
    964                                   &verify_result);
    965   EXPECT_EQ(ERR_CERT_REVOKED, error);
    966   EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
    967 
    968   // Without explicit distrust of the intermediate, verification should succeed.
    969   EXPECT_TRUE(cert_db_->SetCertTrust(
    970       intermediate_certs[0].get(), CA_CERT, NSSCertDatabase::TRUST_DEFAULT));
    971 
    972   // Server cert should verify.
    973   CertVerifyResult verify_result2;
    974   error = verify_proc->Verify(certs[0].get(),
    975                               "127.0.0.1",
    976                               flags,
    977                               NULL,
    978                               empty_cert_list_,
    979                               &verify_result2);
    980   EXPECT_EQ(OK, error);
    981   EXPECT_EQ(0U, verify_result2.cert_status);
    982 }
    983 
    984 // Importing two certificates with the same issuer and subject common name,
    985 // but overall distinct subject names, should succeed and generate a unique
    986 // nickname for the second certificate.
    987 TEST_F(CertDatabaseNSSTest, ImportDuplicateCommonName) {
    988   CertificateList certs =
    989       CreateCertificateListFromFile(GetTestCertsDirectory(),
    990                                     "duplicate_cn_1.pem",
    991                                     X509Certificate::FORMAT_AUTO);
    992   ASSERT_EQ(1U, certs.size());
    993 
    994   EXPECT_EQ(0U, ListCerts().size());
    995 
    996   // Import server cert with default trust.
    997   NSSCertDatabase::ImportCertFailureList failed;
    998   EXPECT_TRUE(cert_db_->ImportServerCert(
    999       certs, NSSCertDatabase::TRUST_DEFAULT, &failed));
   1000   EXPECT_EQ(0U, failed.size());
   1001   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
   1002             cert_db_->GetCertTrust(certs[0].get(), SERVER_CERT));
   1003 
   1004   CertificateList new_certs = ListCerts();
   1005   ASSERT_EQ(1U, new_certs.size());
   1006 
   1007   // Now attempt to import a different certificate with the same common name.
   1008   CertificateList certs2 =
   1009       CreateCertificateListFromFile(GetTestCertsDirectory(),
   1010                                     "duplicate_cn_2.pem",
   1011                                     X509Certificate::FORMAT_AUTO);
   1012   ASSERT_EQ(1U, certs2.size());
   1013 
   1014   // Import server cert with default trust.
   1015   EXPECT_TRUE(cert_db_->ImportServerCert(
   1016       certs2, NSSCertDatabase::TRUST_DEFAULT, &failed));
   1017   EXPECT_EQ(0U, failed.size());
   1018   EXPECT_EQ(NSSCertDatabase::TRUST_DEFAULT,
   1019             cert_db_->GetCertTrust(certs2[0].get(), SERVER_CERT));
   1020 
   1021   new_certs = ListCerts();
   1022   ASSERT_EQ(2U, new_certs.size());
   1023   EXPECT_STRNE(new_certs[0]->os_cert_handle()->nickname,
   1024                new_certs[1]->os_cert_handle()->nickname);
   1025 }
   1026 
   1027 }  // namespace net
   1028