xref: /aosp_15_r20/external/cronet/crypto/unexportable_key.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2021 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/unexportable_key.h"
6 
7 #include "base/check.h"
8 #include "base/functional/bind.h"
9 
10 namespace crypto {
11 
12 namespace {
13 std::unique_ptr<UnexportableKeyProvider> (*g_mock_provider)() = nullptr;
14 }  // namespace
15 
16 UnexportableSigningKey::~UnexportableSigningKey() = default;
17 UnexportableKeyProvider::~UnexportableKeyProvider() = default;
18 
19 VirtualUnexportableSigningKey::~VirtualUnexportableSigningKey() = default;
20 VirtualUnexportableKeyProvider::~VirtualUnexportableKeyProvider() = default;
21 
22 #if BUILDFLAG(IS_WIN)
23 std::unique_ptr<UnexportableKeyProvider> GetUnexportableKeyProviderWin();
24 std::unique_ptr<VirtualUnexportableKeyProvider>
25 GetVirtualUnexportableKeyProviderWin();
26 #elif BUILDFLAG(IS_MAC)
27 std::unique_ptr<UnexportableKeyProvider> GetUnexportableKeyProviderMac(
28     UnexportableKeyProvider::Config config);
29 #endif
30 
31 // Implemented in unexportable_key_software_unsecure.cc.
32 std::unique_ptr<UnexportableKeyProvider>
33 GetUnexportableKeyProviderSoftwareUnsecure();
34 
GetUnexportableKeyProvider(UnexportableKeyProvider::Config config)35 std::unique_ptr<UnexportableKeyProvider> GetUnexportableKeyProvider(
36     UnexportableKeyProvider::Config config) {
37   if (g_mock_provider) {
38     return g_mock_provider();
39   }
40 
41 #if BUILDFLAG(IS_WIN)
42   return GetUnexportableKeyProviderWin();
43 #elif BUILDFLAG(IS_MAC)
44   return GetUnexportableKeyProviderMac(std::move(config));
45 #else
46   return nullptr;
47 #endif
48 }
49 
50 std::unique_ptr<VirtualUnexportableKeyProvider>
GetVirtualUnexportableKeyProvider_DO_NOT_USE_METRICS_ONLY()51 GetVirtualUnexportableKeyProvider_DO_NOT_USE_METRICS_ONLY() {
52 #if BUILDFLAG(IS_WIN)
53   return GetVirtualUnexportableKeyProviderWin();
54 #else
55   return nullptr;
56 #endif
57 }
58 
59 namespace internal {
60 
SetUnexportableKeyProviderForTesting(std::unique_ptr<UnexportableKeyProvider> (* func)())61 void SetUnexportableKeyProviderForTesting(
62     std::unique_ptr<UnexportableKeyProvider> (*func)()) {
63   if (g_mock_provider) {
64     // Nesting ScopedMockUnexportableSigningKeyForTesting is not supported.
65     CHECK(!func);
66     g_mock_provider = nullptr;
67   } else {
68     g_mock_provider = func;
69   }
70 }
71 
72 }  // namespace internal
73 }  // namespace crypto
74