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() const21bool 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)38std::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()54GetVirtualUnexportableKeyProvider_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()64bool HasScopedUnexportableKeyProvider() { 65 return g_mock_provider != nullptr; 66 } 67 SetUnexportableKeyProviderForTesting(std::unique_ptr<UnexportableKeyProvider> (* func)())68void 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