summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-13 02:53:22 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-13 02:53:22 +0000
commit35f05d23297b66e2098ae05f7f27d4832562bc48 (patch)
tree853ac3c035717356684c69fe268c41967ee0a0c9 /net
parent50264918ffe6571a692525f06d976d6005e6dd78 (diff)
downloadchromium_src-35f05d23297b66e2098ae05f7f27d4832562bc48.zip
chromium_src-35f05d23297b66e2098ae05f7f27d4832562bc48.tar.gz
chromium_src-35f05d23297b66e2098ae05f7f27d4832562bc48.tar.bz2
Linux Cert manager: improve PKCS #12 import error messages.
BUG=76275 TEST=try to import a corrupt or unsupported PKCS #12 file. Review URL: http://codereview.chromium.org/7338011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92306 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r--net/base/cert_database_nss_unittest.cc31
-rw-r--r--net/base/net_error_list.h9
-rw-r--r--net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp31
3 files changed, 64 insertions, 7 deletions
diff --git a/net/base/cert_database_nss_unittest.cc b/net/base/cert_database_nss_unittest.cc
index 70d4224..e6cf147 100644
--- a/net/base/cert_database_nss_unittest.cc
+++ b/net/base/cert_database_nss_unittest.cc
@@ -185,6 +185,24 @@ TEST_F(CertDatabaseNSSTest, ImportFromPKCS12AsExtractableAndExportAgain) {
// TODO(mattm): further verification of exported data?
}
+TEST_F(CertDatabaseNSSTest, ImportFromPKCS12Twice) {
+ std::string pkcs12_data = ReadTestFile("client.p12");
+
+ EXPECT_EQ(OK, cert_db_.ImportFromPKCS12(slot_,
+ pkcs12_data,
+ ASCIIToUTF16("12345"),
+ true)); // is_extractable
+ EXPECT_EQ(1U, ListCertsInSlot(slot_->os_module_handle()).size());
+
+ // NSS has a SEC_ERROR_PKCS12_DUPLICATE_DATA error, but it doesn't look like
+ // it's ever used. This test verifies that.
+ EXPECT_EQ(OK, cert_db_.ImportFromPKCS12(slot_,
+ pkcs12_data,
+ ASCIIToUTF16("12345"),
+ true)); // is_extractable
+ EXPECT_EQ(1U, ListCertsInSlot(slot_->os_module_handle()).size());
+}
+
TEST_F(CertDatabaseNSSTest, ImportFromPKCS12AsUnextractableAndExportAgain) {
std::string pkcs12_data = ReadTestFile("client.p12");
@@ -205,6 +223,19 @@ TEST_F(CertDatabaseNSSTest, ImportFromPKCS12AsUnextractableAndExportAgain) {
&exported_data));
}
+TEST_F(CertDatabaseNSSTest, ImportFromPKCS12InvalidFile) {
+ std::string pkcs12_data = "Foobarbaz";
+
+ EXPECT_EQ(ERR_PKCS12_IMPORT_INVALID_FILE,
+ cert_db_.ImportFromPKCS12(slot_,
+ pkcs12_data,
+ ASCIIToUTF16(""),
+ true)); // is_extractable
+
+ // Test db should still be empty.
+ EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size());
+}
+
TEST_F(CertDatabaseNSSTest, ImportCACert_SSLTrust) {
std::string cert_data = ReadTestFile("root_ca_cert.crt");
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h
index cfde9d8..80d770f 100644
--- a/net/base/net_error_list.h
+++ b/net/base/net_error_list.h
@@ -555,6 +555,15 @@ NET_ERROR(IMPORT_CA_CERT_FAILED, -705)
// Server certificate import failed due to some internal error.
NET_ERROR(IMPORT_SERVER_CERT_FAILED, -706)
+// PKCS #12 import failed due to invalid MAC.
+NET_ERROR(PKCS12_IMPORT_INVALID_MAC, -707)
+
+// PKCS #12 import failed due to invalid/corrupt file.
+NET_ERROR(PKCS12_IMPORT_INVALID_FILE, -708)
+
+// PKCS #12 import failed due to unsupported features.
+NET_ERROR(PKCS12_IMPORT_UNSUPPORTED, -709)
+
// DNS error codes.
// DNS resolver received a malformed response.
diff --git a/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp b/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
index e314660..d659900 100644
--- a/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
+++ b/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
@@ -228,13 +228,30 @@ finish:
// We should use that error code instead of inventing a new one
// for every error possible.
if (srv != SECSuccess) {
- if (SEC_ERROR_BAD_PASSWORD == PORT_GetError()) {
- import_result = net::ERR_PKCS12_IMPORT_BAD_PASSWORD;
- }
- else
- {
- LOG(ERROR) << "PKCS#12 import failed with error " << PORT_GetError();
- import_result = net::ERR_PKCS12_IMPORT_FAILED;
+ int error = PORT_GetError();
+ LOG(ERROR) << "PKCS#12 import failed with error " << error;
+ switch (error) {
+ case SEC_ERROR_BAD_PASSWORD:
+ case SEC_ERROR_PKCS12_PRIVACY_PASSWORD_INCORRECT:
+ import_result = net::ERR_PKCS12_IMPORT_BAD_PASSWORD;
+ break;
+ case SEC_ERROR_PKCS12_INVALID_MAC:
+ import_result = net::ERR_PKCS12_IMPORT_INVALID_MAC;
+ break;
+ case SEC_ERROR_BAD_DER:
+ case SEC_ERROR_PKCS12_DECODING_PFX:
+ case SEC_ERROR_PKCS12_CORRUPT_PFX_STRUCTURE:
+ import_result = net::ERR_PKCS12_IMPORT_INVALID_FILE;
+ break;
+ case SEC_ERROR_PKCS12_UNSUPPORTED_MAC_ALGORITHM:
+ case SEC_ERROR_PKCS12_UNSUPPORTED_TRANSPORT_MODE:
+ case SEC_ERROR_PKCS12_UNSUPPORTED_PBE_ALGORITHM:
+ case SEC_ERROR_PKCS12_UNSUPPORTED_VERSION:
+ import_result = net::ERR_PKCS12_IMPORT_UNSUPPORTED;
+ break;
+ default:
+ import_result = net::ERR_PKCS12_IMPORT_FAILED;
+ break;
}
}
// Finish the decoder