| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chromeos/network/network_cert_migrator.h" | 5 #include "chromeos/network/network_cert_migrator.h" |
| 6 | 6 |
| 7 #include <cert.h> | 7 #include <cert.h> |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "chromeos/cert_loader.h" | 12 #include "chromeos/cert_loader.h" |
| 13 #include "chromeos/dbus/dbus_thread_manager.h" | 13 #include "chromeos/dbus/dbus_thread_manager.h" |
| 14 #include "chromeos/dbus/shill_service_client.h" | 14 #include "chromeos/dbus/shill_service_client.h" |
| 15 #include "chromeos/login/login_state.h" | 15 #include "chromeos/login/login_state.h" |
| 16 #include "chromeos/network/network_state_handler.h" | 16 #include "chromeos/network/network_state_handler.h" |
| 17 #include "chromeos/tpm_token_loader.h" | 17 #include "chromeos/tpm_token_loader.h" |
| 18 #include "crypto/nss_util.h" | 18 #include "crypto/nss_util.h" |
| 19 #include "crypto/nss_util_internal.h" |
| 19 #include "net/base/crypto_module.h" | 20 #include "net/base/crypto_module.h" |
| 20 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
| 21 #include "net/base/test_data_directory.h" | 22 #include "net/base/test_data_directory.h" |
| 22 #include "net/cert/nss_cert_database.h" | 23 #include "net/cert/nss_cert_database_chromeos.h" |
| 23 #include "net/cert/x509_certificate.h" | 24 #include "net/cert/x509_certificate.h" |
| 24 #include "net/test/cert_test_util.h" | 25 #include "net/test/cert_test_util.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "third_party/cros_system_api/dbus/service_constants.h" | 27 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 27 | 28 |
| 28 namespace chromeos { | 29 namespace chromeos { |
| 29 | 30 |
| 30 namespace { | 31 namespace { |
| 31 | 32 |
| 32 const char* kWifiStub = "wifi_stub"; | 33 const char* kWifiStub = "wifi_stub"; |
| 33 const char* kVPNStub = "vpn_stub"; | 34 const char* kVPNStub = "vpn_stub"; |
| 34 const char* kNSSNickname = "nss_nickname"; | 35 const char* kNSSNickname = "nss_nickname"; |
| 35 const char* kFakePEM = "pem"; | 36 const char* kFakePEM = "pem"; |
| 36 | 37 |
| 37 } // namespace | 38 } // namespace |
| 38 | 39 |
| 39 class NetworkCertMigratorTest : public testing::Test { | 40 class NetworkCertMigratorTest : public testing::Test { |
| 40 public: | 41 public: |
| 41 NetworkCertMigratorTest() {} | 42 NetworkCertMigratorTest() : service_test_(NULL), |
| 43 user_("user_hash") { |
| 44 } |
| 42 virtual ~NetworkCertMigratorTest() {} | 45 virtual ~NetworkCertMigratorTest() {} |
| 43 | 46 |
| 44 virtual void SetUp() OVERRIDE { | 47 virtual void SetUp() OVERRIDE { |
| 45 ASSERT_TRUE(test_nssdb_.is_open()); | 48 // Initialize NSS db for the user. |
| 46 slot_ = net::NSSCertDatabase::GetInstance()->GetPublicModule(); | 49 ASSERT_TRUE(user_.constructed_successfully()); |
| 47 ASSERT_TRUE(slot_->os_module_handle()); | 50 user_.FinishInit(); |
| 48 | 51 test_nssdb_.reset(new net::NSSCertDatabaseChromeOS( |
| 49 LoginState::Initialize(); | 52 crypto::GetPublicSlotForChromeOSUser(user_.username_hash()), |
| 53 crypto::GetPrivateSlotForChromeOSUser( |
| 54 user_.username_hash(), |
| 55 base::Callback<void(crypto::ScopedPK11Slot)>()))); |
| 50 | 56 |
| 51 DBusThreadManager::InitializeWithStub(); | 57 DBusThreadManager::InitializeWithStub(); |
| 52 service_test_ = | 58 service_test_ = |
| 53 DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); | 59 DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); |
| 54 message_loop_.RunUntilIdle(); | 60 base::RunLoop().RunUntilIdle(); |
| 55 service_test_->ClearServices(); | 61 service_test_->ClearServices(); |
| 56 message_loop_.RunUntilIdle(); | 62 base::RunLoop().RunUntilIdle(); |
| 57 | |
| 58 TPMTokenLoader::Initialize(); | |
| 59 TPMTokenLoader* tpm_token_loader = TPMTokenLoader::Get(); | |
| 60 tpm_token_loader->InitializeTPMForTest(); | |
| 61 tpm_token_loader->SetCryptoTaskRunner(message_loop_.message_loop_proxy()); | |
| 62 | 63 |
| 63 CertLoader::Initialize(); | 64 CertLoader::Initialize(); |
| 64 CertLoader::Get()->SetSlowTaskRunnerForTest( | 65 CertLoader* cert_loader_ = CertLoader::Get(); |
| 65 message_loop_.message_loop_proxy()); | 66 cert_loader_->SetSlowTaskRunnerForTest(message_loop_.message_loop_proxy()); |
| 67 cert_loader_->SetCryptoTaskRunner(message_loop_.message_loop_proxy()); |
| 68 cert_loader_->set_hardware_backed_for_test(); |
| 69 cert_loader_->StartWithUser(user_.username_hash()); |
| 66 } | 70 } |
| 67 | 71 |
| 68 virtual void TearDown() OVERRIDE { | 72 virtual void TearDown() OVERRIDE { |
| 69 network_cert_migrator_.reset(); | 73 network_cert_migrator_.reset(); |
| 70 network_state_handler_.reset(); | 74 network_state_handler_.reset(); |
| 71 CertLoader::Shutdown(); | 75 CertLoader::Shutdown(); |
| 72 TPMTokenLoader::Shutdown(); | |
| 73 DBusThreadManager::Shutdown(); | 76 DBusThreadManager::Shutdown(); |
| 74 LoginState::Shutdown(); | |
| 75 CleanupTestCert(); | 77 CleanupTestCert(); |
| 76 } | 78 } |
| 77 | 79 |
| 78 protected: | 80 protected: |
| 79 void SetupTestCACert() { | 81 void SetupTestCACert() { |
| 80 scoped_refptr<net::X509Certificate> cert_wo_nickname = | 82 scoped_refptr<net::X509Certificate> cert_wo_nickname = |
| 81 net::CreateCertificateListFromFile(net::GetTestCertsDirectory(), | 83 net::CreateCertificateListFromFile(net::GetTestCertsDirectory(), |
| 82 "eku-test-root.pem", | 84 "eku-test-root.pem", |
| 83 net::X509Certificate::FORMAT_AUTO) | 85 net::X509Certificate::FORMAT_AUTO) |
| 84 .back(); | 86 .back(); |
| 85 net::X509Certificate::GetPEMEncoded(cert_wo_nickname->os_cert_handle(), | 87 net::X509Certificate::GetPEMEncoded(cert_wo_nickname->os_cert_handle(), |
| 86 &test_ca_cert_pem_); | 88 &test_ca_cert_pem_); |
| 87 std::string der_encoded; | 89 std::string der_encoded; |
| 88 net::X509Certificate::GetDEREncoded(cert_wo_nickname->os_cert_handle(), | 90 net::X509Certificate::GetDEREncoded(cert_wo_nickname->os_cert_handle(), |
| 89 &der_encoded); | 91 &der_encoded); |
| 90 cert_wo_nickname = NULL; | 92 cert_wo_nickname = NULL; |
| 91 | 93 |
| 92 test_ca_cert_ = net::X509Certificate::CreateFromBytesWithNickname( | 94 test_ca_cert_ = net::X509Certificate::CreateFromBytesWithNickname( |
| 93 der_encoded.data(), der_encoded.size(), kNSSNickname); | 95 der_encoded.data(), der_encoded.size(), kNSSNickname); |
| 94 net::NSSCertDatabase* cert_database = net::NSSCertDatabase::GetInstance(); | |
| 95 net::CertificateList cert_list; | 96 net::CertificateList cert_list; |
| 96 cert_list.push_back(test_ca_cert_); | 97 cert_list.push_back(test_ca_cert_); |
| 97 net::NSSCertDatabase::ImportCertFailureList failures; | 98 net::NSSCertDatabase::ImportCertFailureList failures; |
| 98 EXPECT_TRUE(cert_database->ImportCACerts( | 99 EXPECT_TRUE(test_nssdb_->ImportCACerts( |
| 99 cert_list, net::NSSCertDatabase::TRUST_DEFAULT, &failures)); | 100 cert_list, net::NSSCertDatabase::TRUST_DEFAULT, &failures)); |
| 100 ASSERT_TRUE(failures.empty()) << net::ErrorToString(failures[0].net_error); | 101 ASSERT_TRUE(failures.empty()) << net::ErrorToString(failures[0].net_error); |
| 101 } | 102 } |
| 102 | 103 |
| 103 void SetupNetworkHandlers() { | 104 void SetupNetworkHandlers() { |
| 104 network_state_handler_.reset(NetworkStateHandler::InitializeForTest()); | 105 network_state_handler_.reset(NetworkStateHandler::InitializeForTest()); |
| 105 network_cert_migrator_.reset(new NetworkCertMigrator); | 106 network_cert_migrator_.reset(new NetworkCertMigrator); |
| 106 network_cert_migrator_->Init(network_state_handler_.get()); | 107 network_cert_migrator_->Init(network_state_handler_.get()); |
| 107 } | 108 } |
| 108 | 109 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 ca_pems->GetString(0, ca_pem); | 175 ca_pems->GetString(0, ca_pem); |
| 175 } | 176 } |
| 176 | 177 |
| 177 ShillServiceClient::TestInterface* service_test_; | 178 ShillServiceClient::TestInterface* service_test_; |
| 178 scoped_refptr<net::X509Certificate> test_ca_cert_; | 179 scoped_refptr<net::X509Certificate> test_ca_cert_; |
| 179 std::string test_ca_cert_pem_; | 180 std::string test_ca_cert_pem_; |
| 180 base::MessageLoop message_loop_; | 181 base::MessageLoop message_loop_; |
| 181 | 182 |
| 182 private: | 183 private: |
| 183 void CleanupTestCert() { | 184 void CleanupTestCert() { |
| 184 ASSERT_TRUE(net::NSSCertDatabase::GetInstance()->DeleteCertAndKey( | 185 ASSERT_TRUE(test_nssdb_->DeleteCertAndKey(test_ca_cert_.get())); |
| 185 test_ca_cert_.get())); | |
| 186 } | 186 } |
| 187 | 187 |
| 188 scoped_ptr<NetworkStateHandler> network_state_handler_; | 188 scoped_ptr<NetworkStateHandler> network_state_handler_; |
| 189 scoped_ptr<NetworkCertMigrator> network_cert_migrator_; | 189 scoped_ptr<NetworkCertMigrator> network_cert_migrator_; |
| 190 scoped_refptr<net::CryptoModule> slot_; | 190 crypto::ScopedTestNSSChromeOSUser user_; |
| 191 crypto::ScopedTestNSSDB test_nssdb_; | 191 scoped_ptr<net::NSSCertDatabaseChromeOS> test_nssdb_; |
| 192 | 192 |
| 193 DISALLOW_COPY_AND_ASSIGN(NetworkCertMigratorTest); | 193 DISALLOW_COPY_AND_ASSIGN(NetworkCertMigratorTest); |
| 194 }; | 194 }; |
| 195 | 195 |
| 196 TEST_F(NetworkCertMigratorTest, MigrateNssOnInitialization) { | 196 TEST_F(NetworkCertMigratorTest, MigrateNssOnInitialization) { |
| 197 // Add a new network for migration before the handlers are initialized. | 197 // Add a new network for migration before the handlers are initialized. |
| 198 SetupWifiWithNss(); | 198 SetupWifiWithNss(); |
| 199 SetupTestCACert(); | 199 SetupTestCACert(); |
| 200 SetupNetworkHandlers(); | 200 SetupNetworkHandlers(); |
| 201 | 201 |
| 202 message_loop_.RunUntilIdle(); | 202 base::RunLoop().RunUntilIdle(); |
| 203 std::string nss_nickname, ca_pem; | 203 std::string nss_nickname, ca_pem; |
| 204 GetEapCACertProperties(&nss_nickname, &ca_pem); | 204 GetEapCACertProperties(&nss_nickname, &ca_pem); |
| 205 EXPECT_TRUE(nss_nickname.empty()); | 205 EXPECT_TRUE(nss_nickname.empty()); |
| 206 EXPECT_EQ(test_ca_cert_pem_, ca_pem); | 206 EXPECT_EQ(test_ca_cert_pem_, ca_pem); |
| 207 } | 207 } |
| 208 | 208 |
| 209 TEST_F(NetworkCertMigratorTest, MigrateNssOnNetworkAppearance) { | 209 TEST_F(NetworkCertMigratorTest, MigrateNssOnNetworkAppearance) { |
| 210 SetupTestCACert(); | 210 SetupTestCACert(); |
| 211 SetupNetworkHandlers(); | 211 SetupNetworkHandlers(); |
| 212 message_loop_.RunUntilIdle(); | 212 base::RunLoop().RunUntilIdle(); |
| 213 | 213 |
| 214 // Add a new network for migration after the handlers are initialized. | 214 // Add a new network for migration after the handlers are initialized. |
| 215 SetupWifiWithNss(); | 215 SetupWifiWithNss(); |
| 216 | 216 |
| 217 message_loop_.RunUntilIdle(); | 217 base::RunLoop().RunUntilIdle(); |
| 218 std::string nss_nickname, ca_pem; | 218 std::string nss_nickname, ca_pem; |
| 219 GetEapCACertProperties(&nss_nickname, &ca_pem); | 219 GetEapCACertProperties(&nss_nickname, &ca_pem); |
| 220 EXPECT_TRUE(nss_nickname.empty()); | 220 EXPECT_TRUE(nss_nickname.empty()); |
| 221 EXPECT_EQ(test_ca_cert_pem_, ca_pem); | 221 EXPECT_EQ(test_ca_cert_pem_, ca_pem); |
| 222 } | 222 } |
| 223 | 223 |
| 224 TEST_F(NetworkCertMigratorTest, DoNotMigrateNssIfPemSet) { | 224 TEST_F(NetworkCertMigratorTest, DoNotMigrateNssIfPemSet) { |
| 225 // Add a new network with an already set PEM property. | 225 // Add a new network with an already set PEM property. |
| 226 SetupWifiWithNss(); | 226 SetupWifiWithNss(); |
| 227 base::ListValue ca_pems; | 227 base::ListValue ca_pems; |
| 228 ca_pems.AppendString(kFakePEM); | 228 ca_pems.AppendString(kFakePEM); |
| 229 service_test_->SetServiceProperty( | 229 service_test_->SetServiceProperty( |
| 230 kWifiStub, shill::kEapCaCertPemProperty, ca_pems); | 230 kWifiStub, shill::kEapCaCertPemProperty, ca_pems); |
| 231 | 231 |
| 232 SetupTestCACert(); | 232 SetupTestCACert(); |
| 233 SetupNetworkHandlers(); | 233 SetupNetworkHandlers(); |
| 234 message_loop_.RunUntilIdle(); | 234 base::RunLoop().RunUntilIdle(); |
| 235 | 235 |
| 236 std::string nss_nickname, ca_pem; | 236 std::string nss_nickname, ca_pem; |
| 237 GetEapCACertProperties(&nss_nickname, &ca_pem); | 237 GetEapCACertProperties(&nss_nickname, &ca_pem); |
| 238 EXPECT_TRUE(nss_nickname.empty()); | 238 EXPECT_TRUE(nss_nickname.empty()); |
| 239 EXPECT_EQ(kFakePEM, ca_pem); | 239 EXPECT_EQ(kFakePEM, ca_pem); |
| 240 } | 240 } |
| 241 | 241 |
| 242 TEST_F(NetworkCertMigratorTest, MigrateOpenVpn) { | 242 TEST_F(NetworkCertMigratorTest, MigrateOpenVpn) { |
| 243 // Add a new network for migration before the handlers are initialized. | 243 // Add a new network for migration before the handlers are initialized. |
| 244 SetupVpnWithNss(true /* OpenVPN */); | 244 SetupVpnWithNss(true /* OpenVPN */); |
| 245 | 245 |
| 246 SetupTestCACert(); | 246 SetupTestCACert(); |
| 247 SetupNetworkHandlers(); | 247 SetupNetworkHandlers(); |
| 248 | 248 |
| 249 message_loop_.RunUntilIdle(); | 249 base::RunLoop().RunUntilIdle(); |
| 250 std::string nss_nickname, ca_pem; | 250 std::string nss_nickname, ca_pem; |
| 251 GetVpnCACertProperties(true /* OpenVPN */, &nss_nickname, &ca_pem); | 251 GetVpnCACertProperties(true /* OpenVPN */, &nss_nickname, &ca_pem); |
| 252 EXPECT_TRUE(nss_nickname.empty()); | 252 EXPECT_TRUE(nss_nickname.empty()); |
| 253 EXPECT_EQ(test_ca_cert_pem_, ca_pem); | 253 EXPECT_EQ(test_ca_cert_pem_, ca_pem); |
| 254 } | 254 } |
| 255 | 255 |
| 256 TEST_F(NetworkCertMigratorTest, MigrateIpsecVpn) { | 256 TEST_F(NetworkCertMigratorTest, MigrateIpsecVpn) { |
| 257 // Add a new network for migration before the handlers are initialized. | 257 // Add a new network for migration before the handlers are initialized. |
| 258 SetupVpnWithNss(false /* not OpenVPN */); | 258 SetupVpnWithNss(false /* not OpenVPN */); |
| 259 | 259 |
| 260 SetupTestCACert(); | 260 SetupTestCACert(); |
| 261 SetupNetworkHandlers(); | 261 SetupNetworkHandlers(); |
| 262 | 262 |
| 263 message_loop_.RunUntilIdle(); | 263 base::RunLoop().RunUntilIdle(); |
| 264 std::string nss_nickname, ca_pem; | 264 std::string nss_nickname, ca_pem; |
| 265 GetVpnCACertProperties(false /* not OpenVPN */, &nss_nickname, &ca_pem); | 265 GetVpnCACertProperties(false /* not OpenVPN */, &nss_nickname, &ca_pem); |
| 266 EXPECT_TRUE(nss_nickname.empty()); | 266 EXPECT_TRUE(nss_nickname.empty()); |
| 267 EXPECT_EQ(test_ca_cert_pem_, ca_pem); | 267 EXPECT_EQ(test_ca_cert_pem_, ca_pem); |
| 268 } | 268 } |
| 269 | 269 |
| 270 | |
| 271 } // namespace chromeos | 270 } // namespace chromeos |
| OLD | NEW |