| Index: chromeos/network/network_cert_migrator_unittest.cc
|
| diff --git a/chromeos/network/network_cert_migrator_unittest.cc b/chromeos/network/network_cert_migrator_unittest.cc
|
| index 2f72cfdfd800df089d7c64aaca89b3e92de91cb3..32798c88f7d5cda0b8fc239a40abfcc9c30fffab 100644
|
| --- a/chromeos/network/network_cert_migrator_unittest.cc
|
| +++ b/chromeos/network/network_cert_migrator_unittest.cc
|
| @@ -9,8 +9,10 @@
|
| #include "base/file_util.h"
|
| #include "base/files/file_path.h"
|
| #include "base/run_loop.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| #include "chromeos/cert_loader.h"
|
| #include "chromeos/dbus/dbus_thread_manager.h"
|
| +#include "chromeos/dbus/shill_profile_client.h"
|
| #include "chromeos/dbus/shill_service_client.h"
|
| #include "chromeos/network/network_state_handler.h"
|
| #include "chromeos/tpm_token_loader.h"
|
| @@ -30,9 +32,11 @@ namespace chromeos {
|
| namespace {
|
|
|
| const char* kWifiStub = "wifi_stub";
|
| +const char* kEthernetEapStub = "ethernet_eap_stub";
|
| const char* kVPNStub = "vpn_stub";
|
| const char* kNSSNickname = "nss_nickname";
|
| const char* kFakePEM = "pem";
|
| +const char* kProfile = "/profile/profile1";
|
|
|
| } // namespace
|
|
|
| @@ -57,6 +61,10 @@ class NetworkCertMigratorTest : public testing::Test {
|
| DBusThreadManager::InitializeWithStub();
|
| service_test_ =
|
| DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
|
| + DBusThreadManager::Get()
|
| + ->GetShillProfileClient()
|
| + ->GetTestInterface()
|
| + ->AddProfile(kProfile, "" /* userhash */);
|
| base::RunLoop().RunUntilIdle();
|
| service_test_->ClearServices();
|
| base::RunLoop().RunUntilIdle();
|
| @@ -98,6 +106,30 @@ class NetworkCertMigratorTest : public testing::Test {
|
| ASSERT_TRUE(failures.empty()) << net::ErrorToString(failures[0].net_error);
|
| }
|
|
|
| + void SetupTestClientCert() {
|
| + std::string pkcs12_data;
|
| + ASSERT_TRUE(base::ReadFileToString(
|
| + net::GetTestCertsDirectory().Append("websocket_client_cert.p12"),
|
| + &pkcs12_data));
|
| +
|
| + net::CertificateList client_cert_list;
|
| + scoped_refptr<net::CryptoModule> module(net::CryptoModule::CreateFromHandle(
|
| + test_nssdb_->GetPrivateSlot().get()));
|
| + ASSERT_EQ(
|
| + net::OK,
|
| + test_nssdb_->ImportFromPKCS12(
|
| + module, pkcs12_data, base::string16(), false, &client_cert_list));
|
| + ASSERT_TRUE(!client_cert_list.empty());
|
| + test_client_cert_ = client_cert_list[0];
|
| +
|
| + int slot_id = -1;
|
| + test_client_cert_pkcs11_id_ = CertLoader::GetPkcs11IdAndSlotForCert(
|
| + *test_client_cert_, &slot_id);
|
| + ASSERT_FALSE(test_client_cert_pkcs11_id_.empty());
|
| + ASSERT_NE(-1, slot_id);
|
| + test_client_cert_slot_id_ = base::IntToString(slot_id);
|
| + }
|
| +
|
| void SetupNetworkHandlers() {
|
| network_state_handler_.reset(NetworkStateHandler::InitializeForTest());
|
| network_cert_migrator_.reset(new NetworkCertMigrator);
|
| @@ -113,6 +145,11 @@ class NetworkCertMigratorTest : public testing::Test {
|
| type,
|
| state,
|
| true /* add_to_visible */);
|
| +
|
| + // Ensure that the service appears as 'configured', i.e. is associated to a
|
| + // Shill profile.
|
| + service_test_->SetServiceProperty(
|
| + network_id, shill::kProfileProperty, base::StringValue(kProfile));
|
| }
|
|
|
| void SetupWifiWithNss() {
|
| @@ -122,6 +159,80 @@ class NetworkCertMigratorTest : public testing::Test {
|
| base::StringValue(kNSSNickname));
|
| }
|
|
|
| + void SetupNetworkWithEapCertId(bool wifi, const std::string& cert_id) {
|
| + std::string type = wifi ? shill::kTypeWifi: shill::kTypeEthernetEap;
|
| + std::string name = wifi ? kWifiStub : kEthernetEapStub;
|
| + AddService(name, type, shill::kStateOnline);
|
| + service_test_->SetServiceProperty(
|
| + name, shill::kEapCertIdProperty, base::StringValue(cert_id));
|
| + service_test_->SetServiceProperty(
|
| + name, shill::kEapKeyIdProperty, base::StringValue(cert_id));
|
| +
|
| + if (wifi) {
|
| + service_test_->SetServiceProperty(
|
| + name,
|
| + shill::kSecurityProperty,
|
| + base::StringValue(shill::kSecurity8021x));
|
| + }
|
| + }
|
| +
|
| + void GetEapCertId(bool wifi, std::string* cert_id) {
|
| + cert_id->clear();
|
| +
|
| + std::string name = wifi ? kWifiStub : kEthernetEapStub;
|
| + const base::DictionaryValue* properties =
|
| + service_test_->GetServiceProperties(name);
|
| + properties->GetStringWithoutPathExpansion(shill::kEapCertIdProperty,
|
| + cert_id);
|
| + }
|
| +
|
| + void SetupVpnWithCertId(bool open_vpn,
|
| + const std::string& slot_id,
|
| + const std::string& pkcs11_id) {
|
| + AddService(kVPNStub, shill::kTypeVPN, shill::kStateIdle);
|
| + base::DictionaryValue provider;
|
| + if (open_vpn) {
|
| + provider.SetStringWithoutPathExpansion(shill::kTypeProperty,
|
| + shill::kProviderOpenVpn);
|
| + provider.SetStringWithoutPathExpansion(
|
| + shill::kOpenVPNClientCertIdProperty, pkcs11_id);
|
| + } else {
|
| + provider.SetStringWithoutPathExpansion(shill::kTypeProperty,
|
| + shill::kProviderL2tpIpsec);
|
| + provider.SetStringWithoutPathExpansion(
|
| + shill::kL2tpIpsecClientCertSlotProperty, slot_id);
|
| + provider.SetStringWithoutPathExpansion(
|
| + shill::kL2tpIpsecClientCertIdProperty, pkcs11_id);
|
| + }
|
| + service_test_->SetServiceProperty(
|
| + kVPNStub, shill::kProviderProperty, provider);
|
| + }
|
| +
|
| + void GetVpnCertId(bool open_vpn,
|
| + std::string* slot_id,
|
| + std::string* pkcs11_id) {
|
| + slot_id->clear();
|
| + pkcs11_id->clear();
|
| +
|
| + const base::DictionaryValue* properties =
|
| + service_test_->GetServiceProperties(kVPNStub);
|
| + ASSERT_TRUE(properties);
|
| + const base::DictionaryValue* provider = NULL;
|
| + properties->GetDictionaryWithoutPathExpansion(shill::kProviderProperty,
|
| + &provider);
|
| + if (!provider)
|
| + return;
|
| + if (open_vpn) {
|
| + provider->GetStringWithoutPathExpansion(
|
| + shill::kOpenVPNClientCertIdProperty, pkcs11_id);
|
| + } else {
|
| + provider->GetStringWithoutPathExpansion(
|
| + shill::kL2tpIpsecClientCertSlotProperty, slot_id);
|
| + provider->GetStringWithoutPathExpansion(
|
| + shill::kL2tpIpsecClientCertIdProperty, pkcs11_id);
|
| + }
|
| + }
|
| +
|
| void GetEapCACertProperties(std::string* nss_nickname, std::string* ca_pem) {
|
| nss_nickname->clear();
|
| ca_pem->clear();
|
| @@ -171,12 +282,19 @@ class NetworkCertMigratorTest : public testing::Test {
|
|
|
| ShillServiceClient::TestInterface* service_test_;
|
| scoped_refptr<net::X509Certificate> test_ca_cert_;
|
| + scoped_refptr<net::X509Certificate> test_client_cert_;
|
| + std::string test_client_cert_pkcs11_id_;
|
| + std::string test_client_cert_slot_id_;
|
| std::string test_ca_cert_pem_;
|
| base::MessageLoop message_loop_;
|
|
|
| private:
|
| void CleanupTestCert() {
|
| - ASSERT_TRUE(test_nssdb_->DeleteCertAndKey(test_ca_cert_.get()));
|
| + if (test_ca_cert_)
|
| + ASSERT_TRUE(test_nssdb_->DeleteCertAndKey(test_ca_cert_.get()));
|
| +
|
| + if (test_client_cert_)
|
| + ASSERT_TRUE(test_nssdb_->DeleteCertAndKey(test_client_cert_.get()));
|
| }
|
|
|
| scoped_ptr<NetworkStateHandler> network_state_handler_;
|
| @@ -233,7 +351,7 @@ TEST_F(NetworkCertMigratorTest, DoNotMigrateNssIfPemSet) {
|
| EXPECT_EQ(kFakePEM, ca_pem);
|
| }
|
|
|
| -TEST_F(NetworkCertMigratorTest, MigrateOpenVpn) {
|
| +TEST_F(NetworkCertMigratorTest, MigrateNssOpenVpn) {
|
| // Add a new network for migration before the handlers are initialized.
|
| SetupVpnWithNss(true /* OpenVPN */);
|
|
|
| @@ -247,7 +365,7 @@ TEST_F(NetworkCertMigratorTest, MigrateOpenVpn) {
|
| EXPECT_EQ(test_ca_cert_pem_, ca_pem);
|
| }
|
|
|
| -TEST_F(NetworkCertMigratorTest, MigrateIpsecVpn) {
|
| +TEST_F(NetworkCertMigratorTest, MigrateNssIpsecVpn) {
|
| // Add a new network for migration before the handlers are initialized.
|
| SetupVpnWithNss(false /* not OpenVPN */);
|
|
|
| @@ -261,4 +379,127 @@ TEST_F(NetworkCertMigratorTest, MigrateIpsecVpn) {
|
| EXPECT_EQ(test_ca_cert_pem_, ca_pem);
|
| }
|
|
|
| +TEST_F(NetworkCertMigratorTest, MigrateEapCertIdNoMatchingCert) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupNetworkWithEapCertId(true /* wifi */, "unknown pkcs11 id");
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + // Since the PKCS11 ID is unknown, the certificate configuration will be
|
| + // cleared.
|
| + std::string cert_id;
|
| + GetEapCertId(true /* wifi */, &cert_id);
|
| + EXPECT_EQ(std::string(), cert_id);
|
| +}
|
| +
|
| +TEST_F(NetworkCertMigratorTest, MigrateEapCertIdNoSlotId) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupNetworkWithEapCertId(true /* wifi */, test_client_cert_pkcs11_id_);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string cert_id;
|
| + GetEapCertId(true /* wifi */, &cert_id);
|
| + std::string expected_cert_id =
|
| + test_client_cert_slot_id_ + ":" + test_client_cert_pkcs11_id_;
|
| + EXPECT_EQ(expected_cert_id, cert_id);
|
| +}
|
| +
|
| +TEST_F(NetworkCertMigratorTest, MigrateWifiEapCertIdWrongSlotId) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupNetworkWithEapCertId(true /* wifi */,
|
| + "123:" + test_client_cert_pkcs11_id_);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string cert_id;
|
| + GetEapCertId(true /* wifi */, &cert_id);
|
| + std::string expected_cert_id =
|
| + test_client_cert_slot_id_ + ":" + test_client_cert_pkcs11_id_;
|
| + EXPECT_EQ(expected_cert_id, cert_id);
|
| +}
|
| +
|
| +TEST_F(NetworkCertMigratorTest, DoNotChangeEapCertIdWithCorrectSlotId) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string expected_cert_id =
|
| + test_client_cert_slot_id_ + ":" + test_client_cert_pkcs11_id_;
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupNetworkWithEapCertId(true /* wifi */, expected_cert_id);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string cert_id;
|
| + GetEapCertId(true /* wifi */, &cert_id);
|
| + EXPECT_EQ(expected_cert_id, cert_id);
|
| +}
|
| +
|
| +TEST_F(NetworkCertMigratorTest, IgnoreOpenVPNCertId) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + const char kPkcs11Id[] = "any slot id";
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupVpnWithCertId(
|
| + true /* OpenVPN */, std::string() /* no slot id */, kPkcs11Id);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string pkcs11_id;
|
| + std::string unused_slot_id;
|
| + GetVpnCertId(true /* OpenVPN */, &unused_slot_id, &pkcs11_id);
|
| + EXPECT_EQ(kPkcs11Id, pkcs11_id);
|
| +}
|
| +
|
| +TEST_F(NetworkCertMigratorTest, MigrateEthernetEapCertIdWrongSlotId) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupNetworkWithEapCertId(
|
| + false /* ethernet */, "123:" + test_client_cert_pkcs11_id_);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string cert_id;
|
| + GetEapCertId(false /* ethernet */, &cert_id);
|
| + std::string expected_cert_id =
|
| + test_client_cert_slot_id_ + ":" + test_client_cert_pkcs11_id_;
|
| + EXPECT_EQ(expected_cert_id, cert_id);
|
| +}
|
| +
|
| +TEST_F(NetworkCertMigratorTest, MigrateIpsecCertIdWrongSlotId) {
|
| + SetupTestClientCert();
|
| + SetupNetworkHandlers();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Add a new network for migration after the handlers are initialized.
|
| + SetupVpnWithCertId(false /* IPsec */, "123", test_client_cert_pkcs11_id_);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::string pkcs11_id;
|
| + std::string slot_id;
|
| + GetVpnCertId(false /* IPsec */, &slot_id, &pkcs11_id);
|
| + EXPECT_EQ(test_client_cert_pkcs11_id_, pkcs11_id);
|
| + EXPECT_EQ(test_client_cert_slot_id_, slot_id);
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|