#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "chrome/browser/ash/ownership/owner_key_loader.h"
#include <memory>
#include <vector>
#include "ash/constants/ash_features.h"
#include "base/memory/raw_ptr.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_future.h"
#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/browser/ash/ownership/ownership_histograms.h"
#include "chrome/browser/ash/settings/device_settings_service.h"
#include "chrome/browser/net/fake_nss_service.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/ash/components/policy/device_policy/device_policy_builder.h"
#include "components/ownership/mock_owner_key_util.h"
#include "components/ownership/owner_key_util_impl.h"
#include "components/prefs/testing_pref_service.h"
#include "components/user_manager/scoped_user_manager.h"
#include "content/public/test/browser_task_environment.h"
#include "crypto/keypair.h"
#include "testing/gtest/include/gtest/gtest.h"
using PublicKeyRefPtr = scoped_refptr<ownership::PublicKey>;
using PrivateKeyRefPtr = scoped_refptr<ownership::PrivateKey>;
using base::Bucket;
namespace ash {
constexpr char kUserEmail[] = "user@example.com";
std::vector<uint8_t> ExtractSpkiDer(crypto::keypair::PrivateKey key) {
return key.ToSubjectPublicKeyInfo();
}
std::vector<uint8_t> ExtractSpkiDer(const crypto::ScopedSECKEYPrivateKey& key) {
crypto::ScopedSECKEYPublicKey public_key(
SECKEY_ConvertToPublicKey(key.get()));
SECItem* public_key_bytes = PK11_DEREncodePublicKey(public_key.get());
std::vector<uint8_t> bytes(public_key_bytes->data,
public_key_bytes->data + public_key_bytes->len);
SECITEM_FreeItem(public_key_bytes, PR_TRUE);
return bytes;
}
class OwnerKeyLoaderTestBase : public testing::Test {
public:
explicit OwnerKeyLoaderTestBase(user_manager::UserType user_type)
: user_type_(user_type) {}
void SetUp() override {
auto fake_user_manager = std::make_unique<ash::FakeChromeUserManager>();
user_manager_ = fake_user_manager.get();
scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
std::move(fake_user_manager));
owner_key_util_ = base::MakeRefCounted<ownership::MockOwnerKeyUtil>();
device_settings_service_.StartProcessing(
TestingBrowserProcess::GetGlobal()->local_state(),
&session_manager_client_, owner_key_util_);
profile_ = TestingProfile::Builder().SetProfileName(kUserEmail).Build();
user_manager_->AddUserWithAffiliationAndTypeAndProfile(
AccountId::FromUserEmail(kUserEmail), false,
user_type_, profile_.get());
nss_service_ = FakeNssService::InitializeForBrowserContext(
profile_.get(),
false);
key_loader_ = std::make_unique<OwnerKeyLoader>(
profile_.get(), &device_settings_service_, owner_key_util_,
false, result_observer_.GetCallback());
}
protected:
crypto::keypair::PrivateKey ConfigureExistingPolicies(
const std::string& owner_username) {
policy::DevicePolicyBuilder policy_builder;
policy_builder.policy_data().set_username(owner_username);
policy_builder.Build();
session_manager_client_.set_device_policy(policy_builder.GetBlob());
return *policy_builder.GetSigningKey();
}
bool IsKeyInSlot(const std::vector<uint8_t> public_key_spki,
PK11SlotInfo* slot) {
scoped_refptr<ownership::OwnerKeyUtil> key_util =
base::MakeRefCounted<ownership::OwnerKeyUtilImpl>(
base::FilePath());
return bool(key_util->FindPrivateKeyInSlot(public_key_spki, slot));
}
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
raw_ptr<ash::FakeChromeUserManager> user_manager_ = nullptr;
const user_manager::UserType user_type_;
scoped_refptr<ownership::MockOwnerKeyUtil> owner_key_util_;
FakeSessionManagerClient session_manager_client_;
std::unique_ptr<TestingProfile> profile_;
raw_ptr<FakeNssService> nss_service_ = nullptr;
ash::DeviceSettingsService device_settings_service_;
std::unique_ptr<OwnerKeyLoader> key_loader_;
base::test::TestFuture<PublicKeyRefPtr, PrivateKeyRefPtr> result_observer_;
base::HistogramTester histogram_tester_;
};
class RegularOwnerKeyLoaderTest : public OwnerKeyLoaderTestBase {
public:
RegularOwnerKeyLoaderTest()
: OwnerKeyLoaderTestBase(user_manager::UserType::kRegular) {}
};
TEST_F(RegularOwnerKeyLoaderTest, FirstUserGeneratesOwnerKeyInPublicSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{},
{kStoreOwnerKeyInPrivateSlot,
kMigrateOwnerKeyToPrivateSlot});
device_settings_service_.MarkWillEstablishConsumerOwnership();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
EXPECT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_TRUE(IsKeyInSlot(result_observer_.Get<PublicKeyRefPtr>()->data(),
nss_service_->GetPublicSlot()));
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kEstablishingConsumerOwnershipSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1),
Bucket(OwnerKeyUmaEvent::kPublicSlotKeyGenerationSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, FirstUserGeneratesOwnerKeyInPrivateSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot},
{kMigrateOwnerKeyToPrivateSlot});
device_settings_service_.MarkWillEstablishConsumerOwnership();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
EXPECT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_TRUE(IsKeyInSlot(result_observer_.Get<PublicKeyRefPtr>()->data(),
nss_service_->GetPrivateSlot()));
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kEstablishingConsumerOwnershipSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1),
Bucket(OwnerKeyUmaEvent::kPrivateSlotKeyGenerationSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, FirstUserGeneratesOwnerKeyAfterCrash) {
user_manager_->RecordOwner(
AccountId::FromUserEmail(profile_->GetProfileUserName()));
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
EXPECT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(
OwnerKeyUmaEvent::kRegeneratingOwnerKeyBasedOnLocalStateSuccess,
1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, SecondUserDoesNotTakeOwnership) {
auto signing_key = ConfigureExistingPolicies("owner@example.com");
owner_key_util_->SetPublicKeyFromPrivateKey(signing_key);
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
EXPECT_FALSE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_THAT(histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(Bucket(
OwnerKeyUmaEvent::kUserNotAnOwnerBasedOnPolicySuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, OwnerUserLoadsExistingKeyFromPublicSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot},
{kMigrateOwnerKeyToPrivateSlot});
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPublicSlot());
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyInPublicSlotTrue, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, OwnerUserLoadsExistingKeyFromPrivateSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot},
{kMigrateOwnerKeyToPrivateSlot});
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPrivateSlot());
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyInPublicSlotFalse, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest,
OwnerUserLoadsExistingKeyFromPublicSlotWithoutPolicies) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot},
{kMigrateOwnerKeyToPrivateSlot});
policy::DevicePolicyBuilder policy_builder;
auto signing_key = *policy_builder.GetSigningKey();
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPublicSlot());
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest,
OwnerUserLoadsExistingKeyFromPrivateSlotWithoutPolicies) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot},
{kMigrateOwnerKeyToPrivateSlot});
policy::DevicePolicyBuilder policy_builder;
auto signing_key = *policy_builder.GetSigningKey();
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPrivateSlot());
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, SecondaryUserWithoutPolicies) {
policy::DevicePolicyBuilder policy_builder;
auto signing_key = *policy_builder.GetSigningKey();
owner_key_util_->SetPublicKeyFromPrivateKey(signing_key);
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
EXPECT_FALSE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_THAT(histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kUnsureUserNotAnOwnerSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest,
OwnerUserRegeneratesMissingKeyBasedOnPolicies) {
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->SetPublicKeyFromPrivateKey(signing_key);
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_NE(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kRegeneratingOwnerKeyBasedOnPolicySuccess,
1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest,
OwnerUserRegeneratesMissingKeyBasedOnLocalState) {
user_manager_->RecordOwner(
AccountId::FromUserEmail(profile_->GetProfileUserName()));
policy::DevicePolicyBuilder policy_builder;
auto signing_key = *policy_builder.GetSigningKey();
owner_key_util_->SetPublicKeyFromPrivateKey(signing_key);
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_NE(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kRegeneratingOwnerKeyBasedOnLocalStateFail,
1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, KeyGenerationRetriedSuccessfully) {
device_settings_service_.MarkWillEstablishConsumerOwnership();
owner_key_util_->SimulateGenerateKeyFailure(5);
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kEstablishingConsumerOwnershipSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedFail, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, KeyGenerationRetriedUnsuccessfully) {
device_settings_service_.MarkWillEstablishConsumerOwnership();
owner_key_util_->SimulateGenerateKeyFailure(10);
key_loader_->Run();
EXPECT_FALSE(result_observer_.Get<PublicKeyRefPtr>());
EXPECT_FALSE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kEstablishingConsumerOwnershipSuccess, 1),
Bucket(OwnerKeyUmaEvent::kFailedToGenerateOwnerKeyFail, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, EnterpriseDevicesDontNeedPrivateKey) {
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyAndSetPublicKey(signing_key);
key_loader_ = std::make_unique<OwnerKeyLoader>(
profile_.get(), &device_settings_service_, owner_key_util_,
true, result_observer_.GetCallback());
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_FALSE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(Bucket(OwnerKeyUmaEvent::kManagedDeviceSuccess, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, MigrateFromPublicToPrivateSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot,
kMigrateOwnerKeyToPrivateSlot},
{});
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPublicSlot());
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_NE(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
EXPECT_EQ(ExtractSpkiDer(key_loader_->ExtractOldOwnerKey()),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_TRUE(IsKeyInSlot(result_observer_.Get<PublicKeyRefPtr>()->data(),
nss_service_->GetPrivateSlot()));
EXPECT_THAT(histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyInPublicSlotTrue, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1),
Bucket(OwnerKeyUmaEvent::kPrivateSlotKeyGenerationSuccess, 1),
Bucket(OwnerKeyUmaEvent::kMigrationToPrivateSlotStarted, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, NotMigratedFromPublicToPrivateSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot},
{kMigrateOwnerKeyToPrivateSlot});
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPublicSlot());
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
EXPECT_EQ(key_loader_->ExtractOldOwnerKey(), nullptr);
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_FALSE(IsKeyInSlot(result_observer_.Get<PublicKeyRefPtr>()->data(),
nss_service_->GetPrivateSlot()));
EXPECT_THAT(histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyInPublicSlotTrue, 1),
Bucket(OwnerKeyUmaEvent::kMigrationToPrivateSlotStarted, 0)));
}
TEST_F(RegularOwnerKeyLoaderTest, NotMigratedFromPrivateToPublicSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{kStoreOwnerKeyInPrivateSlot,
kMigrateOwnerKeyToPrivateSlot},
{});
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPrivateSlot());
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_EQ(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
EXPECT_EQ(key_loader_->ExtractOldOwnerKey(), nullptr);
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_FALSE(IsKeyInSlot(result_observer_.Get<PublicKeyRefPtr>()->data(),
nss_service_->GetPublicSlot()));
EXPECT_THAT(histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyInPublicSlotFalse, 1),
Bucket(OwnerKeyUmaEvent::kMigrationToPrivateSlotStarted, 0)));
}
TEST_F(RegularOwnerKeyLoaderTest, MigrateFromPrivateToPublicSlot) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{},
{kStoreOwnerKeyInPrivateSlot,
kMigrateOwnerKeyToPrivateSlot});
auto signing_key = ConfigureExistingPolicies(profile_->GetProfileUserName());
owner_key_util_->ImportPrivateKeyInSlotAndSetPublicKey(
signing_key, nss_service_->GetPrivateSlot());
device_settings_service_.LoadImmediately();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
ASSERT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
EXPECT_NE(result_observer_.Get<PublicKeyRefPtr>()->data(),
ExtractSpkiDer(signing_key));
EXPECT_EQ(ExtractSpkiDer(key_loader_->ExtractOldOwnerKey()),
ExtractSpkiDer(signing_key));
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kOwnerHasKeysSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyInPublicSlotFalse, 1),
Bucket(OwnerKeyUmaEvent::kMigrationToPublicSlotStarted, 1)));
}
TEST_F(RegularOwnerKeyLoaderTest, ExitOnShutdown) {
device_settings_service_.MarkWillEstablishConsumerOwnership();
TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
key_loader_->Run();
EXPECT_FALSE(result_observer_.Get<PublicKeyRefPtr>());
EXPECT_FALSE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_EQ(histogram_tester_.GetTotalSum(kOwnerKeyHistogramName), 0);
}
class ChildOwnerKeyLoaderTest : public OwnerKeyLoaderTestBase {
public:
ChildOwnerKeyLoaderTest()
: OwnerKeyLoaderTestBase(user_manager::UserType::kChild) {}
};
TEST_F(ChildOwnerKeyLoaderTest, FirstUserGeneratesOwnerKey) {
device_settings_service_.MarkWillEstablishConsumerOwnership();
key_loader_->Run();
ASSERT_TRUE(result_observer_.Get<PublicKeyRefPtr>());
EXPECT_TRUE(!result_observer_.Get<PublicKeyRefPtr>()->is_empty());
ASSERT_TRUE(result_observer_.Get<PrivateKeyRefPtr>());
EXPECT_TRUE(result_observer_.Get<PrivateKeyRefPtr>()->key());
EXPECT_THAT(
histogram_tester_.GetAllSamples(kOwnerKeyHistogramName),
BucketsInclude(
Bucket(OwnerKeyUmaEvent::kEstablishingConsumerOwnershipSuccess, 1),
Bucket(OwnerKeyUmaEvent::kOwnerKeyGeneratedSuccess, 1)));
}
}