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