| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/chromeos/certificate_provider/certificate_provider_serv
ice.h" | 5 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv
ice.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 14 #include "base/test/test_mock_time_task_runner.h" | 14 #include "base/test/test_mock_time_task_runner.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" | 16 #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" |
| 17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 18 #include "net/ssl/client_key_store.h" | |
| 19 #include "net/test/cert_test_util.h" | 18 #include "net/test/cert_test_util.h" |
| 20 #include "net/test/test_data_directory.h" | 19 #include "net/test/test_data_directory.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 21 |
| 23 namespace chromeos { | 22 namespace chromeos { |
| 24 | 23 |
| 25 namespace { | 24 namespace { |
| 26 | 25 |
| 27 const char kExtension1[] = "extension1"; | 26 const char kExtension1[] = "extension1"; |
| 28 const char kExtension2[] = "extension2"; | 27 const char kExtension2[] = "extension2"; |
| 29 | 28 |
| 30 void ExpectEmptySignatureAndStoreError(net::Error* out_error, | 29 void ExpectEmptySignatureAndStoreError(net::Error* out_error, |
| 31 net::Error error, | 30 net::Error error, |
| 32 const std::vector<uint8_t>& signature) { | 31 const std::vector<uint8_t>& signature) { |
| 33 EXPECT_TRUE(signature.empty()); | 32 EXPECT_TRUE(signature.empty()); |
| 34 *out_error = error; | 33 *out_error = error; |
| 35 } | 34 } |
| 36 | 35 |
| 37 void ExpectOKAndStoreSignature(std::vector<uint8_t>* out_signature, | 36 void ExpectOKAndStoreSignature(std::vector<uint8_t>* out_signature, |
| 38 net::Error error, | 37 net::Error error, |
| 39 const std::vector<uint8_t>& signature) { | 38 const std::vector<uint8_t>& signature) { |
| 40 EXPECT_EQ(net::OK, error); | 39 EXPECT_EQ(net::OK, error); |
| 41 *out_signature = signature; | 40 *out_signature = signature; |
| 42 } | 41 } |
| 43 | 42 |
| 44 void StoreCertificates(net::CertificateList* out_certs, | 43 void StoreCertificates(net::ClientCertIdentityList* out_certs, |
| 45 const net::CertificateList& certs) { | 44 net::ClientCertIdentityList certs) { |
| 46 if (out_certs) | 45 if (out_certs) |
| 47 *out_certs = certs; | 46 *out_certs = std::move(certs); |
| 47 } |
| 48 |
| 49 void StorePrivateKey(scoped_refptr<net::SSLPrivateKey>* out_key, |
| 50 scoped_refptr<net::SSLPrivateKey> in_key) { |
| 51 *out_key = std::move(in_key); |
| 48 } | 52 } |
| 49 | 53 |
| 50 certificate_provider::CertificateInfo CreateCertInfo( | 54 certificate_provider::CertificateInfo CreateCertInfo( |
| 51 const std::string& cert_filename) { | 55 const std::string& cert_filename) { |
| 52 certificate_provider::CertificateInfo cert_info; | 56 certificate_provider::CertificateInfo cert_info; |
| 53 cert_info.certificate = | 57 cert_info.certificate = |
| 54 net::ImportCertFromFile(net::GetTestCertsDirectory(), cert_filename); | 58 net::ImportCertFromFile(net::GetTestCertsDirectory(), cert_filename); |
| 55 EXPECT_TRUE(cert_info.certificate) << "Could not load " << cert_filename; | 59 EXPECT_TRUE(cert_info.certificate) << "Could not load " << cert_filename; |
| 56 cert_info.supported_hashes.push_back(net::SSLPrivateKey::Hash::SHA256); | 60 cert_info.supported_hashes.push_back(net::SSLPrivateKey::Hash::SHA256); |
| 57 | 61 |
| 58 return cert_info; | 62 return cert_info; |
| 59 } | 63 } |
| 60 | 64 |
| 61 bool IsKeyEqualToCertInfo(const certificate_provider::CertificateInfo& info, | 65 bool IsKeyEqualToCertInfo(const certificate_provider::CertificateInfo& info, |
| 62 net::SSLPrivateKey* key) { | 66 net::SSLPrivateKey* key) { |
| 63 return info.supported_hashes == key->GetDigestPreferences(); | 67 return info.supported_hashes == key->GetDigestPreferences(); |
| 64 } | 68 } |
| 65 | 69 |
| 70 bool ClientCertIdentityAlphabeticSorter( |
| 71 const std::unique_ptr<net::ClientCertIdentity>& a_identity, |
| 72 const std::unique_ptr<net::ClientCertIdentity>& b_identity) { |
| 73 return a_identity->certificate()->subject().GetDisplayName() < |
| 74 b_identity->certificate()->subject().GetDisplayName(); |
| 75 } |
| 76 |
| 66 class TestDelegate : public CertificateProviderService::Delegate { | 77 class TestDelegate : public CertificateProviderService::Delegate { |
| 67 public: | 78 public: |
| 68 enum class RequestType { NONE, SIGN, GET_CERTIFICATES }; | 79 enum class RequestType { NONE, SIGN, GET_CERTIFICATES }; |
| 69 | 80 |
| 70 TestDelegate() {} | 81 TestDelegate() {} |
| 71 | 82 |
| 72 std::vector<std::string> CertificateProviderExtensions() override { | 83 std::vector<std::string> CertificateProviderExtensions() override { |
| 73 return std::vector<std::string>(provider_extensions_.begin(), | 84 return std::vector<std::string>(provider_extensions_.begin(), |
| 74 provider_extensions_.end()); | 85 provider_extensions_.end()); |
| 75 } | 86 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 DISALLOW_COPY_AND_ASSIGN(TestDelegate); | 129 DISALLOW_COPY_AND_ASSIGN(TestDelegate); |
| 119 }; | 130 }; |
| 120 | 131 |
| 121 } // namespace | 132 } // namespace |
| 122 | 133 |
| 123 class CertificateProviderServiceTest : public testing::Test { | 134 class CertificateProviderServiceTest : public testing::Test { |
| 124 public: | 135 public: |
| 125 CertificateProviderServiceTest() | 136 CertificateProviderServiceTest() |
| 126 : task_runner_(new base::TestMockTimeTaskRunner()), | 137 : task_runner_(new base::TestMockTimeTaskRunner()), |
| 127 task_runner_handle_(task_runner_), | 138 task_runner_handle_(task_runner_), |
| 128 client_key_store_(net::ClientKeyStore::GetInstance()), | |
| 129 service_(new CertificateProviderService()), | 139 service_(new CertificateProviderService()), |
| 130 cert_info1_(CreateCertInfo("client_1.pem")), | 140 cert_info1_(CreateCertInfo("client_1.pem")), |
| 131 cert_info2_(CreateCertInfo("client_2.pem")) { | 141 cert_info2_(CreateCertInfo("client_2.pem")) { |
| 132 std::unique_ptr<TestDelegate> test_delegate(new TestDelegate); | 142 std::unique_ptr<TestDelegate> test_delegate(new TestDelegate); |
| 133 test_delegate_ = test_delegate.get(); | 143 test_delegate_ = test_delegate.get(); |
| 134 service_->SetDelegate(std::move(test_delegate)); | 144 service_->SetDelegate(std::move(test_delegate)); |
| 135 | 145 |
| 136 certificate_provider_ = service_->CreateCertificateProvider(); | 146 certificate_provider_ = service_->CreateCertificateProvider(); |
| 137 EXPECT_TRUE(certificate_provider_); | 147 EXPECT_TRUE(certificate_provider_); |
| 138 | 148 |
| 139 test_delegate_->provider_extensions_.insert(kExtension1); | 149 test_delegate_->provider_extensions_.insert(kExtension1); |
| 140 } | 150 } |
| 141 | 151 |
| 142 // Triggers a GetCertificates request and returns the request id. Assumes that | 152 // Triggers a GetCertificates request and returns the request id. Assumes that |
| 143 // at least one extension is registered as a certificate provider. | 153 // at least one extension is registered as a certificate provider. |
| 144 int RequestCertificatesFromExtensions(net::CertificateList* certs) { | 154 int RequestCertificatesFromExtensions(net::ClientCertIdentityList* certs) { |
| 145 test_delegate_->ClearAndExpectRequest( | 155 test_delegate_->ClearAndExpectRequest( |
| 146 TestDelegate::RequestType::GET_CERTIFICATES); | 156 TestDelegate::RequestType::GET_CERTIFICATES); |
| 147 | 157 |
| 148 certificate_provider_->GetCertificates( | 158 certificate_provider_->GetCertificates( |
| 149 base::Bind(&StoreCertificates, certs)); | 159 base::Bind(&StoreCertificates, certs)); |
| 150 | 160 |
| 151 task_runner_->RunUntilIdle(); | 161 task_runner_->RunUntilIdle(); |
| 152 EXPECT_EQ(TestDelegate::RequestType::NONE, | 162 EXPECT_EQ(TestDelegate::RequestType::NONE, |
| 153 test_delegate_->expected_request_type_); | 163 test_delegate_->expected_request_type_); |
| 154 return test_delegate_->last_cert_request_id_; | 164 return test_delegate_->last_cert_request_id_; |
| 155 } | 165 } |
| 156 | 166 |
| 167 scoped_refptr<net::SSLPrivateKey> FetchIdentityPrivateKey( |
| 168 net::ClientCertIdentity* identity) { |
| 169 scoped_refptr<net::SSLPrivateKey> ssl_private_key; |
| 170 identity->AcquirePrivateKey(base::Bind(StorePrivateKey, &ssl_private_key)); |
| 171 task_runner_->RunUntilIdle(); |
| 172 return ssl_private_key; |
| 173 } |
| 174 |
| 157 // Provides |cert_info1_| through kExtension1. | 175 // Provides |cert_info1_| through kExtension1. |
| 158 void ProvideDefaultCert() { | 176 std::unique_ptr<net::ClientCertIdentity> ProvideDefaultCert() { |
| 159 const int cert_request_id = RequestCertificatesFromExtensions(nullptr); | 177 net::ClientCertIdentityList certs; |
| 178 const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
| 160 SetCertificateProvidedByExtension(kExtension1, cert_request_id, | 179 SetCertificateProvidedByExtension(kExtension1, cert_request_id, |
| 161 cert_info1_); | 180 cert_info1_); |
| 162 task_runner_->RunUntilIdle(); | 181 task_runner_->RunUntilIdle(); |
| 182 if (certs.empty()) |
| 183 return nullptr; |
| 184 return std::move(certs[0]); |
| 163 } | 185 } |
| 164 | 186 |
| 165 // Like service_->SetCertificatesProvidedByExtension but taking a single | 187 // Like service_->SetCertificatesProvidedByExtension but taking a single |
| 166 // CertificateInfo instead of a list. | 188 // CertificateInfo instead of a list. |
| 167 void SetCertificateProvidedByExtension( | 189 void SetCertificateProvidedByExtension( |
| 168 const std::string& extension_id, | 190 const std::string& extension_id, |
| 169 int cert_request_id, | 191 int cert_request_id, |
| 170 const certificate_provider::CertificateInfo& cert_info) { | 192 const certificate_provider::CertificateInfo& cert_info) { |
| 171 certificate_provider::CertificateInfoList infos; | 193 certificate_provider::CertificateInfoList infos; |
| 172 infos.push_back(cert_info); | 194 infos.push_back(cert_info); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 194 if (expected_extension_id != extension_id) { | 216 if (expected_extension_id != extension_id) { |
| 195 LOG(ERROR) << "Wrong extension id. Got " << extension_id; | 217 LOG(ERROR) << "Wrong extension id. Got " << extension_id; |
| 196 return false; | 218 return false; |
| 197 } | 219 } |
| 198 return true; | 220 return true; |
| 199 } | 221 } |
| 200 | 222 |
| 201 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; | 223 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
| 202 base::ThreadTaskRunnerHandle task_runner_handle_; | 224 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 203 TestDelegate* test_delegate_ = nullptr; | 225 TestDelegate* test_delegate_ = nullptr; |
| 204 net::ClientKeyStore* const client_key_store_; | |
| 205 std::unique_ptr<CertificateProvider> certificate_provider_; | 226 std::unique_ptr<CertificateProvider> certificate_provider_; |
| 206 std::unique_ptr<CertificateProviderService> service_; | 227 std::unique_ptr<CertificateProviderService> service_; |
| 207 const certificate_provider::CertificateInfo cert_info1_; | 228 const certificate_provider::CertificateInfo cert_info1_; |
| 208 const certificate_provider::CertificateInfo cert_info2_; | 229 const certificate_provider::CertificateInfo cert_info2_; |
| 209 | 230 |
| 210 private: | 231 private: |
| 211 DISALLOW_COPY_AND_ASSIGN(CertificateProviderServiceTest); | 232 DISALLOW_COPY_AND_ASSIGN(CertificateProviderServiceTest); |
| 212 }; | 233 }; |
| 213 | 234 |
| 214 TEST_F(CertificateProviderServiceTest, GetCertificates) { | 235 TEST_F(CertificateProviderServiceTest, GetCertificates) { |
| 215 test_delegate_->provider_extensions_.insert(kExtension2); | 236 test_delegate_->provider_extensions_.insert(kExtension2); |
| 216 | 237 |
| 217 net::CertificateList certs; | 238 net::ClientCertIdentityList certs; |
| 218 const int cert_request_id = RequestCertificatesFromExtensions(&certs); | 239 const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
| 219 | 240 |
| 220 task_runner_->RunUntilIdle(); | 241 task_runner_->RunUntilIdle(); |
| 221 // No certificates set until all registered extensions replied. | 242 // No certificates set until all registered extensions replied. |
| 222 EXPECT_TRUE(certs.empty()); | 243 EXPECT_TRUE(certs.empty()); |
| 223 | 244 |
| 224 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); | 245 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
| 225 | 246 |
| 226 task_runner_->RunUntilIdle(); | 247 task_runner_->RunUntilIdle(); |
| 227 // No certificates set until all registered extensions replied. | 248 // No certificates set until all registered extensions replied. |
| 228 EXPECT_TRUE(certs.empty()); | 249 EXPECT_TRUE(certs.empty()); |
| 229 | 250 |
| 230 SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); | 251 SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); |
| 231 | 252 |
| 232 task_runner_->RunUntilIdle(); | 253 task_runner_->RunUntilIdle(); |
| 233 EXPECT_EQ(2u, certs.size()); | 254 ASSERT_EQ(2u, certs.size()); |
| 234 | 255 |
| 235 // Verify that the ClientKeyStore returns key handles for the provide certs. | 256 // Verify that the ClientCertIdentity returns key handles for the provided |
| 236 EXPECT_TRUE( | 257 // certs. |
| 237 client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); | 258 EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
| 238 EXPECT_TRUE( | 259 EXPECT_TRUE(FetchIdentityPrivateKey(certs[1].get())); |
| 239 client_key_store_->FetchClientCertPrivateKey(*cert_info2_.certificate)); | |
| 240 | 260 |
| 241 // Deregister the extensions as certificate providers. The next | 261 // Deregister the extensions as certificate providers. The next |
| 242 // GetCertificates call must report an empty list of certs. | 262 // GetCertificates call must report an empty list of certs. |
| 243 test_delegate_->provider_extensions_.clear(); | 263 test_delegate_->provider_extensions_.clear(); |
| 244 | 264 |
| 245 // No request expected. | 265 // No request expected. |
| 246 test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::NONE); | 266 test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::NONE); |
| 247 | 267 |
| 248 certificate_provider_->GetCertificates( | 268 certificate_provider_->GetCertificates( |
| 249 base::Bind(&StoreCertificates, &certs)); | 269 base::Bind(&StoreCertificates, &certs)); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 std::string())); | 362 std::string())); |
| 343 | 363 |
| 344 EXPECT_TRUE(CheckLookUpCertificate(cert_info2_, true /* is known */, | 364 EXPECT_TRUE(CheckLookUpCertificate(cert_info2_, true /* is known */, |
| 345 true /* is currently provided */, | 365 true /* is currently provided */, |
| 346 kExtension1)); | 366 kExtension1)); |
| 347 } | 367 } |
| 348 | 368 |
| 349 TEST_F(CertificateProviderServiceTest, GetCertificatesTimeout) { | 369 TEST_F(CertificateProviderServiceTest, GetCertificatesTimeout) { |
| 350 test_delegate_->provider_extensions_.insert(kExtension2); | 370 test_delegate_->provider_extensions_.insert(kExtension2); |
| 351 | 371 |
| 352 net::CertificateList certs; | 372 net::ClientCertIdentityList certs; |
| 353 const int cert_request_id = RequestCertificatesFromExtensions(&certs); | 373 const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
| 354 | 374 |
| 355 certificate_provider::CertificateInfoList infos; | 375 certificate_provider::CertificateInfoList infos; |
| 356 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); | 376 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
| 357 | 377 |
| 358 task_runner_->RunUntilIdle(); | 378 task_runner_->RunUntilIdle(); |
| 359 // No certificates set until all registered extensions replied or a timeout | 379 // No certificates set until all registered extensions replied or a timeout |
| 360 // occurred. | 380 // occurred. |
| 361 EXPECT_TRUE(certs.empty()); | 381 EXPECT_TRUE(certs.empty()); |
| 362 | 382 |
| 363 task_runner_->FastForwardUntilNoTasksRemain(); | 383 task_runner_->FastForwardUntilNoTasksRemain(); |
| 364 // After the timeout, only extension1_'s certificates are returned. | 384 // After the timeout, only extension1_'s certificates are returned. |
| 365 // This verifies that the timeout delay is > 0 but not how long the delay is. | 385 // This verifies that the timeout delay is > 0 but not how long the delay is. |
| 366 EXPECT_EQ(1u, certs.size()); | 386 ASSERT_EQ(1u, certs.size()); |
| 367 | 387 |
| 368 EXPECT_TRUE( | 388 EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
| 369 client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); | |
| 370 } | 389 } |
| 371 | 390 |
| 372 TEST_F(CertificateProviderServiceTest, UnloadExtensionAfterGetCertificates) { | 391 TEST_F(CertificateProviderServiceTest, UnloadExtensionAfterGetCertificates) { |
| 373 test_delegate_->provider_extensions_.insert(kExtension2); | 392 test_delegate_->provider_extensions_.insert(kExtension2); |
| 374 | 393 |
| 375 const int cert_request_id = RequestCertificatesFromExtensions(nullptr); | 394 net::ClientCertIdentityList certs; |
| 395 const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
| 376 | 396 |
| 377 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); | 397 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
| 378 SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); | 398 SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); |
| 379 task_runner_->RunUntilIdle(); | 399 task_runner_->RunUntilIdle(); |
| 380 | 400 |
| 401 ASSERT_EQ(2u, certs.size()); |
| 402 |
| 403 // Sort the returned certs to ensure that the test results are stable. |
| 404 std::sort(certs.begin(), certs.end(), ClientCertIdentityAlphabeticSorter); |
| 405 |
| 381 // Private key handles for both certificates must be available now. | 406 // Private key handles for both certificates must be available now. |
| 382 EXPECT_TRUE( | 407 EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
| 383 client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); | 408 EXPECT_TRUE(FetchIdentityPrivateKey(certs[1].get())); |
| 384 EXPECT_TRUE( | |
| 385 client_key_store_->FetchClientCertPrivateKey(*cert_info2_.certificate)); | |
| 386 | 409 |
| 387 // Unload one of the extensions. | 410 // Unload one of the extensions. |
| 388 service_->OnExtensionUnloaded(kExtension2); | 411 service_->OnExtensionUnloaded(kExtension2); |
| 389 | 412 |
| 390 // extension1 isn't affected by the uninstall. | 413 // extension1 isn't affected by the uninstall. |
| 391 EXPECT_TRUE( | 414 EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
| 392 client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); | |
| 393 // No key handles that were backed by the uninstalled extension must be | 415 // No key handles that were backed by the uninstalled extension must be |
| 394 // returned. | 416 // returned. |
| 395 EXPECT_FALSE( | 417 EXPECT_FALSE(FetchIdentityPrivateKey(certs[1].get())); |
| 396 client_key_store_->FetchClientCertPrivateKey(*cert_info2_.certificate)); | 418 } |
| 419 |
| 420 TEST_F(CertificateProviderServiceTest, DestroyServiceAfterGetCertificates) { |
| 421 test_delegate_->provider_extensions_.insert(kExtension2); |
| 422 |
| 423 net::ClientCertIdentityList certs; |
| 424 const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
| 425 |
| 426 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
| 427 SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); |
| 428 task_runner_->RunUntilIdle(); |
| 429 |
| 430 ASSERT_EQ(2u, certs.size()); |
| 431 |
| 432 // Destroy the service. |
| 433 service_.reset(); |
| 434 |
| 435 // Private key handles for both certificates should return nullptr now. |
| 436 EXPECT_FALSE(FetchIdentityPrivateKey(certs[0].get())); |
| 437 EXPECT_FALSE(FetchIdentityPrivateKey(certs[1].get())); |
| 397 } | 438 } |
| 398 | 439 |
| 399 TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringGetCertificates) { | 440 TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringGetCertificates) { |
| 400 test_delegate_->provider_extensions_.insert(kExtension2); | 441 test_delegate_->provider_extensions_.insert(kExtension2); |
| 401 | 442 |
| 402 net::CertificateList certs; | 443 net::ClientCertIdentityList certs; |
| 403 const int cert_request_id = RequestCertificatesFromExtensions(&certs); | 444 const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
| 404 | 445 |
| 405 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); | 446 SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
| 406 | 447 |
| 407 // The pending certificate request is only waiting for kExtension2. Unloading | 448 // The pending certificate request is only waiting for kExtension2. Unloading |
| 408 // that extension must cause the request to be finished. | 449 // that extension must cause the request to be finished. |
| 409 service_->OnExtensionUnloaded(kExtension2); | 450 service_->OnExtensionUnloaded(kExtension2); |
| 410 | 451 |
| 411 task_runner_->RunUntilIdle(); | 452 task_runner_->RunUntilIdle(); |
| 412 EXPECT_EQ(1u, certs.size()); | 453 EXPECT_EQ(1u, certs.size()); |
| 413 } | 454 } |
| 414 | 455 |
| 415 // Trying to sign data using the exposed SSLPrivateKey must cause a sign | 456 // Trying to sign data using the exposed SSLPrivateKey must cause a sign |
| 416 // request. The reply must be correctly routed back to the private key. | 457 // request. The reply must be correctly routed back to the private key. |
| 417 TEST_F(CertificateProviderServiceTest, SignRequest) { | 458 TEST_F(CertificateProviderServiceTest, SignRequest) { |
| 418 ProvideDefaultCert(); | 459 std::unique_ptr<net::ClientCertIdentity> cert(ProvideDefaultCert()); |
| 460 ASSERT_TRUE(cert); |
| 419 | 461 |
| 420 scoped_refptr<net::SSLPrivateKey> private_key( | 462 scoped_refptr<net::SSLPrivateKey> private_key( |
| 421 client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); | 463 FetchIdentityPrivateKey(cert.get())); |
| 422 | 464 |
| 423 ASSERT_TRUE(private_key); | 465 ASSERT_TRUE(private_key); |
| 424 EXPECT_TRUE(IsKeyEqualToCertInfo(cert_info1_, private_key.get())); | 466 EXPECT_TRUE(IsKeyEqualToCertInfo(cert_info1_, private_key.get())); |
| 425 | 467 |
| 426 test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::SIGN); | 468 test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::SIGN); |
| 427 | 469 |
| 428 std::vector<uint8_t> received_signature; | 470 std::vector<uint8_t> received_signature; |
| 429 private_key->SignDigest( | 471 private_key->SignDigest( |
| 430 net::SSLPrivateKey::Hash::SHA256, std::string("any input data"), | 472 net::SSLPrivateKey::Hash::SHA256, std::string("any input data"), |
| 431 base::Bind(&ExpectOKAndStoreSignature, &received_signature)); | 473 base::Bind(&ExpectOKAndStoreSignature, &received_signature)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 445 signature_reply.push_back(5); | 487 signature_reply.push_back(5); |
| 446 signature_reply.push_back(7); | 488 signature_reply.push_back(7); |
| 447 signature_reply.push_back(8); | 489 signature_reply.push_back(8); |
| 448 service_->ReplyToSignRequest(kExtension1, sign_request_id, signature_reply); | 490 service_->ReplyToSignRequest(kExtension1, sign_request_id, signature_reply); |
| 449 | 491 |
| 450 task_runner_->RunUntilIdle(); | 492 task_runner_->RunUntilIdle(); |
| 451 EXPECT_EQ(signature_reply, received_signature); | 493 EXPECT_EQ(signature_reply, received_signature); |
| 452 } | 494 } |
| 453 | 495 |
| 454 TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringSign) { | 496 TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringSign) { |
| 455 ProvideDefaultCert(); | 497 std::unique_ptr<net::ClientCertIdentity> cert(ProvideDefaultCert()); |
| 498 ASSERT_TRUE(cert); |
| 456 | 499 |
| 457 scoped_refptr<net::SSLPrivateKey> private_key( | 500 scoped_refptr<net::SSLPrivateKey> private_key( |
| 458 client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); | 501 FetchIdentityPrivateKey(cert.get())); |
| 459 ASSERT_TRUE(private_key); | 502 ASSERT_TRUE(private_key); |
| 460 | 503 |
| 461 test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::SIGN); | 504 test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::SIGN); |
| 462 | 505 |
| 463 net::Error error = net::OK; | 506 net::Error error = net::OK; |
| 464 private_key->SignDigest( | 507 private_key->SignDigest( |
| 465 net::SSLPrivateKey::Hash::SHA256, std::string("any input data"), | 508 net::SSLPrivateKey::Hash::SHA256, std::string("any input data"), |
| 466 base::Bind(&ExpectEmptySignatureAndStoreError, &error)); | 509 base::Bind(&ExpectEmptySignatureAndStoreError, &error)); |
| 467 | 510 |
| 468 task_runner_->RunUntilIdle(); | 511 task_runner_->RunUntilIdle(); |
| 469 | 512 |
| 470 // No signature received until the extension replied to the service or is | 513 // No signature received until the extension replied to the service or is |
| 471 // unloaded. | 514 // unloaded. |
| 472 EXPECT_EQ(net::OK, error); | 515 EXPECT_EQ(net::OK, error); |
| 473 | 516 |
| 474 // Unload the extension. | 517 // Unload the extension. |
| 475 service_->OnExtensionUnloaded(kExtension1); | 518 service_->OnExtensionUnloaded(kExtension1); |
| 476 | 519 |
| 477 task_runner_->RunUntilIdle(); | 520 task_runner_->RunUntilIdle(); |
| 478 EXPECT_EQ(net::ERR_FAILED, error); | 521 EXPECT_EQ(net::ERR_FAILED, error); |
| 479 } | 522 } |
| 480 | 523 |
| 481 } // namespace chromeos | 524 } // namespace chromeos |
| OLD | NEW |