xref: /aosp_15_r20/external/cronet/crypto/user_verifying_key.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)26 RefCountedUserVerifyingSigningKey::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)47 std::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)61 void 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)())78 void 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