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)35std::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()51GetVirtualUnexportableKeyProvider_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)())61void 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