Index: net/ssl/client_cert_store_nss_unittest.cc |
diff --git a/net/ssl/client_cert_store_nss_unittest.cc b/net/ssl/client_cert_store_nss_unittest.cc |
index 8bfae5313f81bdb3d5e3b47baf89a6224f73d49b..bc4588d6e5234cf327d4ecb3e9d2b2b7d888d880 100644 |
--- a/net/ssl/client_cert_store_nss_unittest.cc |
+++ b/net/ssl/client_cert_store_nss_unittest.cc |
@@ -12,12 +12,17 @@ |
#include <string> |
#include "base/bind.h" |
+#include "base/files/file_util.h" |
+#include "base/memory/ptr_util.h" |
#include "base/memory/ref_counted.h" |
#include "base/run_loop.h" |
#include "crypto/scoped_test_nss_db.h" |
#include "net/cert/x509_certificate.h" |
+#include "net/ssl/client_cert_identity_test_util.h" |
#include "net/ssl/client_cert_store_unittest-inl.h" |
#include "net/ssl/ssl_cert_request_info.h" |
+#include "net/ssl/ssl_private_key.h" |
+#include "net/ssl/ssl_private_key_test_util.h" |
#include "net/test/cert_test_util.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -25,10 +30,17 @@ namespace net { |
namespace { |
-void SaveCertsAndQuitCallback(CertificateList* out_certs, |
- base::Closure quit_closure, |
- CertificateList in_certs) { |
- *out_certs = std::move(in_certs); |
+void SaveIdentitiesAndQuitCallback(ClientCertIdentityList* out_identities, |
+ base::Closure quit_closure, |
+ ClientCertIdentityList in_identities) { |
+ *out_identities = std::move(in_identities); |
+ quit_closure.Run(); |
+} |
+ |
+void SavePrivateKeyAndQuitCallback(scoped_refptr<net::SSLPrivateKey>* out_key, |
+ base::Closure quit_closure, |
+ scoped_refptr<net::SSLPrivateKey> in_key) { |
+ *out_key = std::move(in_key); |
quit_closure.Run(); |
} |
@@ -40,11 +52,14 @@ class ClientCertStoreNSSTestDelegate { |
bool SelectClientCerts(const CertificateList& input_certs, |
const SSLCertRequestInfo& cert_request_info, |
- CertificateList* selected_certs) { |
- // Filters |input_certs| using the logic being used to filter the system |
- // store when GetClientCerts() is called. |
- ClientCertStoreNSS::FilterCertsOnWorkerThread( |
- input_certs, cert_request_info, selected_certs); |
+ ClientCertIdentityList* selected_identities) { |
+ *selected_identities = |
+ FakeClientCertIdentityListFromCertificateList(input_certs); |
+ |
+ // Filters |selected_identities| using the logic being used to filter the |
+ // system store when GetClientCerts() is called. |
+ ClientCertStoreNSS::FilterCertsOnWorkerThread(selected_identities, |
+ cert_request_info); |
return true; |
} |
}; |
@@ -68,29 +83,50 @@ TEST(ClientCertStoreNSSTest, BuildsCertificateChain) { |
PK11_ImportCert(test_db.slot(), client_1_ca->os_cert_handle(), |
CK_INVALID_HANDLE, "client_1_ca", |
PR_FALSE /* includeTrust (unused) */)); |
+ std::string pkcs8_key; |
+ ASSERT_TRUE(base::ReadFileToString( |
+ GetTestCertsDirectory().AppendASCII("client_1.pk8"), &pkcs8_key)); |
std::unique_ptr<ClientCertStoreNSS> store( |
new ClientCertStoreNSS(ClientCertStoreNSS::PasswordDelegateFactory())); |
+ // All NSS keys are expected to have the same hash preferences. |
+ const std::vector<SSLPrivateKey::Hash> expected_hashes = { |
+ SSLPrivateKey::Hash::SHA512, SSLPrivateKey::Hash::SHA384, |
+ SSLPrivateKey::Hash::SHA256, SSLPrivateKey::Hash::SHA1, |
+ }; |
+ |
{ |
// Request certificates matching B CA, |client_1|'s issuer. |
scoped_refptr<SSLCertRequestInfo> request(new SSLCertRequestInfo); |
request->cert_authorities.push_back(std::string( |
reinterpret_cast<const char*>(kAuthority1DN), sizeof(kAuthority1DN))); |
- CertificateList selected_certs; |
+ ClientCertIdentityList selected_identities; |
base::RunLoop loop; |
store->GetClientCerts(*request.get(), |
- base::Bind(SaveCertsAndQuitCallback, &selected_certs, |
- loop.QuitClosure())); |
+ base::Bind(SaveIdentitiesAndQuitCallback, |
+ &selected_identities, loop.QuitClosure())); |
loop.Run(); |
// The result be |client_1| with no intermediates. |
- ASSERT_EQ(1u, selected_certs.size()); |
- scoped_refptr<X509Certificate> selected_cert = selected_certs[0]; |
+ ASSERT_EQ(1u, selected_identities.size()); |
+ scoped_refptr<X509Certificate> selected_cert = |
+ selected_identities[0]->certificate(); |
EXPECT_TRUE(X509Certificate::IsSameOSCert(client_1->os_cert_handle(), |
selected_cert->os_cert_handle())); |
ASSERT_EQ(0u, selected_cert->GetIntermediateCertificates().size()); |
+ |
+ scoped_refptr<SSLPrivateKey> ssl_private_key; |
+ base::RunLoop key_loop; |
+ selected_identities[0]->AcquirePrivateKey( |
+ base::Bind(SavePrivateKeyAndQuitCallback, &ssl_private_key, |
+ key_loop.QuitClosure())); |
+ key_loop.Run(); |
+ |
+ ASSERT_TRUE(ssl_private_key); |
+ EXPECT_EQ(expected_hashes, ssl_private_key->GetDigestPreferences()); |
+ TestSSLPrivateKeyMatches(ssl_private_key.get(), pkcs8_key); |
} |
{ |
@@ -100,23 +136,36 @@ TEST(ClientCertStoreNSSTest, BuildsCertificateChain) { |
std::string(reinterpret_cast<const char*>(kAuthorityRootDN), |
sizeof(kAuthorityRootDN))); |
- CertificateList selected_certs; |
+ ClientCertIdentityList selected_identities; |
base::RunLoop loop; |
store->GetClientCerts(*request.get(), |
- base::Bind(SaveCertsAndQuitCallback, &selected_certs, |
- loop.QuitClosure())); |
+ base::Bind(SaveIdentitiesAndQuitCallback, |
+ &selected_identities, loop.QuitClosure())); |
loop.Run(); |
// The result be |client_1| with |client_1_ca| as an intermediate. |
- ASSERT_EQ(1u, selected_certs.size()); |
- scoped_refptr<X509Certificate> selected_cert = selected_certs[0]; |
+ ASSERT_EQ(1u, selected_identities.size()); |
+ scoped_refptr<X509Certificate> selected_cert = |
+ selected_identities[0]->certificate(); |
EXPECT_TRUE(X509Certificate::IsSameOSCert(client_1->os_cert_handle(), |
selected_cert->os_cert_handle())); |
ASSERT_EQ(1u, selected_cert->GetIntermediateCertificates().size()); |
EXPECT_TRUE(X509Certificate::IsSameOSCert( |
client_1_ca->os_cert_handle(), |
selected_cert->GetIntermediateCertificates()[0])); |
+ |
+ scoped_refptr<SSLPrivateKey> ssl_private_key; |
+ base::RunLoop key_loop; |
+ selected_identities[0]->AcquirePrivateKey( |
+ base::Bind(SavePrivateKeyAndQuitCallback, &ssl_private_key, |
+ key_loop.QuitClosure())); |
+ key_loop.Run(); |
+ ASSERT_TRUE(ssl_private_key); |
+ EXPECT_EQ(expected_hashes, ssl_private_key->GetDigestPreferences()); |
+ TestSSLPrivateKeyMatches(ssl_private_key.get(), pkcs8_key); |
} |
} |
+// TODO(mattm): is it possible to unittest slot unlocking? |
+ |
} // namespace net |