1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "crypto/user_verifying_key.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker namespace crypto { 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker namespace { 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UserVerifyingKeyProvider> (*g_mock_provider)() = nullptr; 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker } // namespace 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::Config::Config() = default; 18*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::Config::Config(Config&& config) = default; 19*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::Config& UserVerifyingKeyProvider::Config::operator=( 20*6777b538SAndroid Build Coastguard Worker Config&& config) = default; 21*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::Config::~Config() = default; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker UserVerifyingSigningKey::~UserVerifyingSigningKey() = default; 24*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::~UserVerifyingKeyProvider() = default; 25*6777b538SAndroid Build Coastguard Worker RefCountedUserVerifyingSigningKey(std::unique_ptr<crypto::UserVerifyingSigningKey> key)26*6777b538SAndroid Build Coastguard WorkerRefCountedUserVerifyingSigningKey::RefCountedUserVerifyingSigningKey( 27*6777b538SAndroid Build Coastguard Worker std::unique_ptr<crypto::UserVerifyingSigningKey> key) 28*6777b538SAndroid Build Coastguard Worker : key_(std::move(key)) { 29*6777b538SAndroid Build Coastguard Worker CHECK(key_); 30*6777b538SAndroid Build Coastguard Worker } 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker RefCountedUserVerifyingSigningKey::~RefCountedUserVerifyingSigningKey() = 33*6777b538SAndroid Build Coastguard Worker default; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 36*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProviderWin(); 37*6777b538SAndroid Build Coastguard Worker void IsKeyCredentialManagerAvailable(base::OnceCallback<void(bool)> callback); 38*6777b538SAndroid Build Coastguard Worker #endif 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC) 41*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProviderMac( 42*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::Config config); 43*6777b538SAndroid Build Coastguard Worker void AreMacUnexportableKeysAvailable(UserVerifyingKeyProvider::Config config, 44*6777b538SAndroid Build Coastguard Worker base::OnceCallback<void(bool)> callback); 45*6777b538SAndroid Build Coastguard Worker #endif 46*6777b538SAndroid Build Coastguard Worker GetUserVerifyingKeyProvider(UserVerifyingKeyProvider::Config config)47*6777b538SAndroid Build Coastguard Workerstd::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProvider( 48*6777b538SAndroid Build Coastguard Worker UserVerifyingKeyProvider::Config config) { 49*6777b538SAndroid Build Coastguard Worker if (g_mock_provider) { 50*6777b538SAndroid Build Coastguard Worker return g_mock_provider(); 51*6777b538SAndroid Build Coastguard Worker } 52*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 53*6777b538SAndroid Build Coastguard Worker return GetUserVerifyingKeyProviderWin(); 54*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_MAC) 55*6777b538SAndroid Build Coastguard Worker return GetUserVerifyingKeyProviderMac(std::move(config)); 56*6777b538SAndroid Build Coastguard Worker #else 57*6777b538SAndroid Build Coastguard Worker return nullptr; 58*6777b538SAndroid Build Coastguard Worker #endif 59*6777b538SAndroid Build Coastguard Worker } 60*6777b538SAndroid Build Coastguard Worker AreUserVerifyingKeysSupported(UserVerifyingKeyProvider::Config config,base::OnceCallback<void (bool)> callback)61*6777b538SAndroid Build Coastguard Workervoid AreUserVerifyingKeysSupported(UserVerifyingKeyProvider::Config config, 62*6777b538SAndroid Build Coastguard Worker base::OnceCallback<void(bool)> callback) { 63*6777b538SAndroid Build Coastguard Worker if (g_mock_provider) { 64*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(g_mock_provider() != nullptr); 65*6777b538SAndroid Build Coastguard Worker return; 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 68*6777b538SAndroid Build Coastguard Worker IsKeyCredentialManagerAvailable(std::move(callback)); 69*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_MAC) 70*6777b538SAndroid Build Coastguard Worker AreMacUnexportableKeysAvailable(std::move(config), std::move(callback)); 71*6777b538SAndroid Build Coastguard Worker #else 72*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(false); 73*6777b538SAndroid Build Coastguard Worker #endif 74*6777b538SAndroid Build Coastguard Worker } 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker namespace internal { 77*6777b538SAndroid Build Coastguard Worker SetUserVerifyingKeyProviderForTesting(std::unique_ptr<UserVerifyingKeyProvider> (* func)())78*6777b538SAndroid Build Coastguard Workervoid SetUserVerifyingKeyProviderForTesting( 79*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UserVerifyingKeyProvider> (*func)()) { 80*6777b538SAndroid Build Coastguard Worker if (g_mock_provider) { 81*6777b538SAndroid Build Coastguard Worker // Prevent nesting of scoped providers. 82*6777b538SAndroid Build Coastguard Worker CHECK(!func); 83*6777b538SAndroid Build Coastguard Worker g_mock_provider = nullptr; 84*6777b538SAndroid Build Coastguard Worker } else { 85*6777b538SAndroid Build Coastguard Worker g_mock_provider = func; 86*6777b538SAndroid Build Coastguard Worker } 87*6777b538SAndroid Build Coastguard Worker } 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker } // namespace internal 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker } // namespace crypto 92