// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import #import #include "crypto/apple_keychain_v2.h" #include "base/apple/foundation_util.h" #include "base/apple/scoped_cftyperef.h" #include "base/no_destructor.h" namespace crypto { static AppleKeychainV2* g_keychain_instance_override = nullptr; // static AppleKeychainV2& AppleKeychainV2::GetInstance() { if (g_keychain_instance_override) { return *g_keychain_instance_override; } static base::NoDestructor k; return *k; } // static void AppleKeychainV2::SetInstanceOverride(AppleKeychainV2* AppleKeychainV2) { CHECK(!g_keychain_instance_override); g_keychain_instance_override = AppleKeychainV2; } // static void AppleKeychainV2::ClearInstanceOverride() { CHECK(g_keychain_instance_override); g_keychain_instance_override = nullptr; } AppleKeychainV2::AppleKeychainV2() = default; AppleKeychainV2::~AppleKeychainV2() = default; NSArray* AppleKeychainV2::GetTokenIDs() { return [[TKTokenWatcher alloc] init].tokenIDs; } base::apple::ScopedCFTypeRef AppleKeychainV2::KeyCreateRandomKey( CFDictionaryRef params, CFErrorRef* error) { return base::apple::ScopedCFTypeRef( SecKeyCreateRandomKey(params, error)); } base::apple::ScopedCFTypeRef AppleKeychainV2::KeyCreateSignature( SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef data, CFErrorRef* error) { return base::apple::ScopedCFTypeRef( SecKeyCreateSignature(key, algorithm, data, error)); } base::apple::ScopedCFTypeRef AppleKeychainV2::KeyCopyPublicKey( SecKeyRef key) { return base::apple::ScopedCFTypeRef(SecKeyCopyPublicKey(key)); } base::apple::ScopedCFTypeRef AppleKeychainV2::KeyCopyExternalRepresentation(SecKeyRef key, CFErrorRef* error) { return base::apple::ScopedCFTypeRef( SecKeyCopyExternalRepresentation(key, error)); } base::apple::ScopedCFTypeRef AppleKeychainV2::KeyCopyAttributes(SecKeyRef key) { return base::apple::ScopedCFTypeRef( SecKeyCopyAttributes(key)); } OSStatus AppleKeychainV2::ItemCopyMatching( CFDictionaryRef query, CFTypeRef* result) { return SecItemCopyMatching(query, result); } OSStatus AppleKeychainV2::ItemDelete(CFDictionaryRef query) { return SecItemDelete(query); } OSStatus AppleKeychainV2::ItemUpdate(CFDictionaryRef query, CFDictionaryRef keychain_data) { return SecItemUpdate(query, keychain_data); } #if !BUILDFLAG(IS_IOS) base::apple::ScopedCFTypeRef AppleKeychainV2::TaskCopyValueForEntitlement(SecTaskRef task, CFStringRef entitlement, CFErrorRef* error) { return base::apple::ScopedCFTypeRef( SecTaskCopyValueForEntitlement(task, entitlement, error)); } #endif // !BUILDFLAG(IS_IOS) BOOL AppleKeychainV2::LAContextCanEvaluatePolicy(LAPolicy policy, NSError** error) { LAContext* context = [[LAContext alloc] init]; return [context canEvaluatePolicy:policy error:error]; } } // namespace crypto