• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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() const25 bool UserVerifyingSigningKey::IsHardwareBacked() const {
26   return false;
27 }
28 
29 UserVerifyingKeyProvider::~UserVerifyingKeyProvider() = default;
30 
RefCountedUserVerifyingSigningKey(std::unique_ptr<crypto::UserVerifyingSigningKey> key)31 RefCountedUserVerifyingSigningKey::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)52 std::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)66 void 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)())83 void 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