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