blob: 502eed07d50192923c2dc010d2651e7689c8ec95 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/enterprise/client_certificates/cert_utils.h"
#include <utility>
#include "chrome/browser/enterprise/client_certificates/browser_context_delegate.h"
#include "chrome/browser/enterprise/client_certificates/cert_utils.h"
#include "chrome/common/chrome_version.h"
#include "components/enterprise/client_certificates/core/browser_cloud_management_delegate.h"
#include "components/enterprise/client_certificates/core/certificate_provisioning_service.h"
#include "components/enterprise/client_certificates/core/dm_server_client.h"
#include "components/enterprise/client_certificates/core/ec_private_key_factory.h"
#include "components/enterprise/client_certificates/core/key_upload_client.h"
#include "components/enterprise/client_certificates/core/private_key_factory.h"
#include "components/enterprise/client_certificates/core/private_key_types.h"
#include "components/enterprise/client_certificates/core/unexportable_private_key_factory.h"
#include "components/policy/core/common/cloud/device_management_service.h"
#include "components/prefs/pref_service.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#if BUILDFLAG(IS_WIN)
#include "components/enterprise/client_certificates/core/features.h"
#include "components/enterprise/client_certificates/core/win/windows_software_private_key_factory.h"
#endif // BUILDFLAG(IS_WIN)
#if BUILDFLAG(IS_ANDROID)
#include "components/enterprise/client_certificates/core/android_private_key_factory.h"
#include "components/enterprise/client_certificates/core/features.h"
#endif // BUILDFLAG(IS_ANDROID)
namespace client_certificates {
namespace {
#if BUILDFLAG(IS_MAC)
constexpr char kUnexportableKeyKeychainAccessGroup[] =
MAC_TEAM_IDENTIFIER_STRING "." MAC_BUNDLE_IDENTIFIER_STRING ".devicetrust";
#endif // BUILDFLAG(IS_MAC)
} // namespace
std::unique_ptr<PrivateKeyFactory> CreatePrivateKeyFactory() {
PrivateKeyFactory::PrivateKeyFactoriesMap sub_factories;
crypto::UnexportableKeyProvider::Config config;
#if BUILDFLAG(IS_MAC)
config.keychain_access_group = kUnexportableKeyKeychainAccessGroup;
#endif // BUILDFLAG(IS_MAC)
auto unexportable_key_factory =
UnexportablePrivateKeyFactory::TryCreate(std::move(config));
if (unexportable_key_factory) {
sub_factories.insert_or_assign(PrivateKeySource::kUnexportableKey,
std::move(unexportable_key_factory));
}
#if BUILDFLAG(IS_WIN)
if (features::AreWindowsSoftwareKeysEnabled()) {
auto windows_software_key_factory =
WindowsSoftwarePrivateKeyFactory::TryCreate();
if (windows_software_key_factory) {
sub_factories.insert_or_assign(PrivateKeySource::kOsSoftwareKey,
std::move(windows_software_key_factory));
}
}
#endif // BUILDFLAG(IS_WIN)
#if BUILDFLAG(IS_ANDROID)
if (features::IsClientCertificateProvisioningOnAndroidEnabled()) {
auto android_key_factory = AndroidPrivateKeyFactory::TryCreate();
if (android_key_factory) {
sub_factories.insert_or_assign(PrivateKeySource::kAndroidKey,
std::move(android_key_factory));
}
}
#endif // BUILDFLAG(IS_ANDROID)
sub_factories.insert_or_assign(PrivateKeySource::kSoftwareKey,
std::make_unique<ECPrivateKeyFactory>());
return PrivateKeyFactory::Create(std::move(sub_factories));
}
std::unique_ptr<client_certificates::CertificateProvisioningService>
CreateBrowserCertificateProvisioningService(
PrefService* local_state,
client_certificates::CertificateStore* certificate_store,
policy::DeviceManagementService* device_management_service,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
if (!url_loader_factory || !device_management_service || !certificate_store) {
return nullptr;
}
return client_certificates::CertificateProvisioningService::Create(
local_state, certificate_store,
std::make_unique<client_certificates::BrowserContextDelegate>(),
client_certificates::KeyUploadClient::Create(
std::make_unique<
enterprise_attestation::BrowserCloudManagementDelegate>(
enterprise_attestation::DMServerClient::Create(
device_management_service, std::move(url_loader_factory)))));
}
} // namespace client_certificates