// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CRYPTO_KEYCHAIN_MAC_H_ #define CRYPTO_KEYCHAIN_MAC_H_ #include <Security/Security.h> #include "base/macros.h" #include "build/build_config.h" #include "crypto/crypto_export.h" #if defined (OS_IOS) typedef void* SecKeychainRef; typedef void* SecKeychainItemRef; typedef void SecKeychainAttributeList; #endif namespace crypto { // Wraps the KeychainServices API in a very thin layer, to allow it to be // mocked out for testing. // See Keychain Services documentation for function documentation, as these call // through directly to their Keychain Services equivalents (Foo -> // SecKeychainFoo). The only exception is Free, which should be used for // anything returned from this class that would normally be freed with // CFRelease (to aid in testing). class CRYPTO_EXPORT AppleKeychain { public: AppleKeychain(); virtual ~AppleKeychain(); virtual OSStatus FindGenericPassword(CFTypeRef keychainOrArray, UInt32 serviceNameLength, const char* serviceName, UInt32 accountNameLength, const char* accountName, UInt32* passwordLength, void** passwordData, SecKeychainItemRef* itemRef) const; virtual OSStatus ItemFreeContent(SecKeychainAttributeList* attrList, void* data) const; virtual OSStatus AddGenericPassword(SecKeychainRef keychain, UInt32 serviceNameLength, const char* serviceName, UInt32 accountNameLength, const char* accountName, UInt32 passwordLength, const void* passwordData, SecKeychainItemRef* itemRef) const; #if !defined(OS_IOS) virtual OSStatus ItemCopyAttributesAndData( SecKeychainItemRef itemRef, SecKeychainAttributeInfo* info, SecItemClass* itemClass, SecKeychainAttributeList** attrList, UInt32* length, void** outData) const; virtual OSStatus ItemModifyAttributesAndData( SecKeychainItemRef itemRef, const SecKeychainAttributeList* attrList, UInt32 length, const void* data) const; virtual OSStatus ItemFreeAttributesAndData(SecKeychainAttributeList* attrList, void* data) const; virtual OSStatus ItemDelete(SecKeychainItemRef itemRef) const; virtual OSStatus SearchCreateFromAttributes( CFTypeRef keychainOrArray, SecItemClass itemClass, const SecKeychainAttributeList* attrList, SecKeychainSearchRef* searchRef) const; virtual OSStatus SearchCopyNext(SecKeychainSearchRef searchRef, SecKeychainItemRef* itemRef) const; virtual OSStatus AddInternetPassword(SecKeychainRef keychain, UInt32 serverNameLength, const char* serverName, UInt32 securityDomainLength, const char* securityDomain, UInt32 accountNameLength, const char* accountName, UInt32 pathLength, const char* path, UInt16 port, SecProtocolType protocol, SecAuthenticationType authenticationType, UInt32 passwordLength, const void* passwordData, SecKeychainItemRef* itemRef) const; // Calls CFRelease on the given ref, after checking that |ref| is non-NULL. virtual void Free(CFTypeRef ref) const; #endif // !defined(OS_IOS) private: DISALLOW_COPY_AND_ASSIGN(AppleKeychain); }; } // namespace crypto #endif // CRYPTO_KEYCHAIN_MAC_H_