• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 VirtualUnexportableSigningKey::~VirtualUnexportableSigningKey() = default;
19 VirtualUnexportableKeyProvider::~VirtualUnexportableKeyProvider() = default;
20 
IsHardwareBacked() const21 bool UnexportableSigningKey::IsHardwareBacked() const {
22   return false;
23 }
24 
25 #if BUILDFLAG(IS_WIN)
26 std::unique_ptr<UnexportableKeyProvider> GetUnexportableKeyProviderWin();
27 std::unique_ptr<VirtualUnexportableKeyProvider>
28 GetVirtualUnexportableKeyProviderWin();
29 #elif BUILDFLAG(IS_MAC)
30 std::unique_ptr<UnexportableKeyProvider> GetUnexportableKeyProviderMac(
31     UnexportableKeyProvider::Config config);
32 #endif
33 
34 // Implemented in unexportable_key_software_unsecure.cc.
35 std::unique_ptr<UnexportableKeyProvider>
36 GetUnexportableKeyProviderSoftwareUnsecure();
37 
GetUnexportableKeyProvider(UnexportableKeyProvider::Config config)38 std::unique_ptr<UnexportableKeyProvider> GetUnexportableKeyProvider(
39     UnexportableKeyProvider::Config config) {
40   if (g_mock_provider) {
41     return g_mock_provider();
42   }
43 
44 #if BUILDFLAG(IS_WIN)
45   return GetUnexportableKeyProviderWin();
46 #elif BUILDFLAG(IS_MAC)
47   return GetUnexportableKeyProviderMac(std::move(config));
48 #else
49   return nullptr;
50 #endif
51 }
52 
53 std::unique_ptr<VirtualUnexportableKeyProvider>
GetVirtualUnexportableKeyProvider_DO_NOT_USE_METRICS_ONLY()54 GetVirtualUnexportableKeyProvider_DO_NOT_USE_METRICS_ONLY() {
55 #if BUILDFLAG(IS_WIN)
56   return GetVirtualUnexportableKeyProviderWin();
57 #else
58   return nullptr;
59 #endif
60 }
61 
62 namespace internal {
63 
HasScopedUnexportableKeyProvider()64 bool HasScopedUnexportableKeyProvider() {
65   return g_mock_provider != nullptr;
66 }
67 
SetUnexportableKeyProviderForTesting(std::unique_ptr<UnexportableKeyProvider> (* func)())68 void SetUnexportableKeyProviderForTesting(
69     std::unique_ptr<UnexportableKeyProvider> (*func)()) {
70   if (g_mock_provider) {
71     // Nesting ScopedMockUnexportableSigningKeyForTesting is not supported.
72     CHECK(!func);
73     g_mock_provider = nullptr;
74   } else {
75     g_mock_provider = func;
76   }
77 }
78 
79 }  // namespace internal
80 }  // namespace crypto
81