diff options
Diffstat (limited to 'net/third_party/mozilla_security_manager/nsNSSCertificateDB.cpp')
-rw-r--r-- | net/third_party/mozilla_security_manager/nsNSSCertificateDB.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/net/third_party/mozilla_security_manager/nsNSSCertificateDB.cpp b/net/third_party/mozilla_security_manager/nsNSSCertificateDB.cpp index b32458d..e0876f77 100644 --- a/net/third_party/mozilla_security_manager/nsNSSCertificateDB.cpp +++ b/net/third_party/mozilla_security_manager/nsNSSCertificateDB.cpp @@ -160,6 +160,42 @@ bool ImportCACerts(const net::CertificateList& certificates, return true; } +// Based on nsNSSCertificateDB::ImportServerCertificate. +bool ImportServerCert(const net::CertificateList& certificates, + net::CertDatabase::ImportCertFailureList* not_imported) { + base::ScopedPK11Slot slot(base::GetDefaultNSSKeySlot()); + if (!slot.get()) { + LOG(ERROR) << "Couldn't get internal key slot!"; + return false; + } + + for (size_t i = 0; i < certificates.size(); ++i) { + const scoped_refptr<net::X509Certificate>& cert = certificates[i]; + + // Mozilla uses CERT_ImportCerts, which doesn't take a slot arg. We use + // PK11_ImportCert instead. + SECStatus srv = PK11_ImportCert(slot.get(), cert->os_cert_handle(), + CK_INVALID_HANDLE, + cert->subject().GetDisplayName().c_str(), + PR_FALSE /* includeTrust (unused) */); + if (srv != SECSuccess) { + LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); + not_imported->push_back(net::CertDatabase::ImportCertFailure( + cert, net::ERR_IMPORT_SERVER_CERT_FAILED)); + continue; + } + } + + // Set as valid peer, but without any extra trust. + SetCertTrust(certificates[0].get(), net::SERVER_CERT, + net::CertDatabase::UNTRUSTED); + // TODO(mattm): Report SetCertTrust result? Putting in not_imported + // wouldn't quite match up since it was imported... + + // Any errors importing individual certs will be in listed in |not_imported|. + return true; +} + // Based on nsNSSCertificateDB::SetCertTrust. bool SetCertTrust(const net::X509Certificate* cert, |