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 IsHardwareBacked() const25bool UserVerifyingSigningKey::IsHardwareBacked() const { 26 return false; 27 } 28 29 UserVerifyingKeyProvider::~UserVerifyingKeyProvider() = default; 30 RefCountedUserVerifyingSigningKey(std::unique_ptr<crypto::UserVerifyingSigningKey> key)31RefCountedUserVerifyingSigningKey::RefCountedUserVerifyingSigningKey( 32 std::unique_ptr<crypto::UserVerifyingSigningKey> key) 33 : key_(std::move(key)) { 34 CHECK(key_); 35 } 36 37 RefCountedUserVerifyingSigningKey::~RefCountedUserVerifyingSigningKey() = 38 default; 39 40 #if BUILDFLAG(IS_WIN) 41 std::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProviderWin(); 42 void IsKeyCredentialManagerAvailable(base::OnceCallback<void(bool)> callback); 43 #endif 44 45 #if BUILDFLAG(IS_MAC) 46 std::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProviderMac( 47 UserVerifyingKeyProvider::Config config); 48 void AreMacUnexportableKeysAvailable(UserVerifyingKeyProvider::Config config, 49 base::OnceCallback<void(bool)> callback); 50 #endif 51 GetUserVerifyingKeyProvider(UserVerifyingKeyProvider::Config config)52std::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProvider( 53 UserVerifyingKeyProvider::Config config) { 54 if (g_mock_provider) { 55 return g_mock_provider(); 56 } 57 #if BUILDFLAG(IS_WIN) 58 return GetUserVerifyingKeyProviderWin(); 59 #elif BUILDFLAG(IS_MAC) 60 return GetUserVerifyingKeyProviderMac(std::move(config)); 61 #else 62 return nullptr; 63 #endif 64 } 65 AreUserVerifyingKeysSupported(UserVerifyingKeyProvider::Config config,base::OnceCallback<void (bool)> callback)66void AreUserVerifyingKeysSupported(UserVerifyingKeyProvider::Config config, 67 base::OnceCallback<void(bool)> callback) { 68 if (g_mock_provider) { 69 std::move(callback).Run(g_mock_provider() != nullptr); 70 return; 71 } 72 #if BUILDFLAG(IS_WIN) 73 IsKeyCredentialManagerAvailable(std::move(callback)); 74 #elif BUILDFLAG(IS_MAC) 75 AreMacUnexportableKeysAvailable(std::move(config), std::move(callback)); 76 #else 77 std::move(callback).Run(false); 78 #endif 79 } 80 81 namespace internal { 82 SetUserVerifyingKeyProviderForTesting(std::unique_ptr<UserVerifyingKeyProvider> (* func)())83void SetUserVerifyingKeyProviderForTesting( 84 std::unique_ptr<UserVerifyingKeyProvider> (*func)()) { 85 if (g_mock_provider) { 86 // Prevent nesting of scoped providers. 87 CHECK(!func); 88 g_mock_provider = nullptr; 89 } else { 90 g_mock_provider = func; 91 } 92 } 93 94 } // namespace internal 95 96 } // namespace crypto 97