// 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. #ifndef CRYPTO_FAKE_APPLE_KEYCHAIN_V2_H_ #define CRYPTO_FAKE_APPLE_KEYCHAIN_V2_H_ #import #include #include #include "base/apple/scoped_cftyperef.h" #include "crypto/apple_keychain_v2.h" #include "crypto/crypto_export.h" #include "crypto/scoped_fake_apple_keychain_v2.h" namespace crypto { // FakeAppleKeychainV2 is an implementation of AppleKeychainV2 for testing. It // works around behavior that can't be relied on in tests, such as writing to // the actual Keychain or using functionality that requires code-signed, // entitled builds. class CRYPTO_EXPORT FakeAppleKeychainV2 : public AppleKeychainV2 { public: using UVMethod = ScopedFakeAppleKeychainV2::UVMethod; explicit FakeAppleKeychainV2(const std::string& keychain_access_group); FakeAppleKeychainV2(const FakeAppleKeychainV2&) = delete; FakeAppleKeychainV2& operator=(const FakeAppleKeychainV2&) = delete; ~FakeAppleKeychainV2() override; const std::vector>& items() { return items_; } void set_secure_enclave_available(bool is_secure_enclave_available) { is_secure_enclave_available_ = is_secure_enclave_available; } void set_uv_method(UVMethod uv_method) { uv_method_ = uv_method; } // AppleKeychainV2: NSArray* GetTokenIDs() override; base::apple::ScopedCFTypeRef KeyCreateRandomKey( CFDictionaryRef params, CFErrorRef* error) override; base::apple::ScopedCFTypeRef KeyCopyAttributes( SecKeyRef key) override; OSStatus ItemAdd(CFDictionaryRef attributes, CFTypeRef* result) override; OSStatus ItemCopyMatching(CFDictionaryRef query, CFTypeRef* result) override; OSStatus ItemDelete(CFDictionaryRef query) override; OSStatus ItemUpdate(CFDictionaryRef query, CFDictionaryRef keychain_data) override; #if !BUILDFLAG(IS_IOS) base::apple::ScopedCFTypeRef TaskCopyValueForEntitlement( SecTaskRef task, CFStringRef entitlement, CFErrorRef* error) override; #endif // !BUILDFLAG(IS_IOS) BOOL LAContextCanEvaluatePolicy(LAPolicy policy, NSError* __autoreleasing* error) override; private: bool is_secure_enclave_available_ = true; UVMethod uv_method_ = UVMethod::kBiometrics; // items_ contains the keychain items created by `KeyCreateRandomKey`. std::vector> items_; // keychain_access_group_ is the value of `kSecAttrAccessGroup` that this // keychain expects to operate on. base::apple::ScopedCFTypeRef keychain_access_group_; }; } // namespace crypto #endif // CRYPTO_FAKE_APPLE_KEYCHAIN_V2_H_