1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CRYPTO_KEYCHAIN_MAC_H_ 6 #define CRYPTO_KEYCHAIN_MAC_H_ 7 8 #include <Security/Security.h> 9 10 #include "base/macros.h" 11 #include "build/build_config.h" 12 #include "crypto/crypto_export.h" 13 14 #if defined (OS_IOS) 15 typedef void* SecKeychainRef; 16 typedef void* SecKeychainItemRef; 17 typedef void SecKeychainAttributeList; 18 #endif 19 20 namespace crypto { 21 22 // Wraps the KeychainServices API in a very thin layer, to allow it to be 23 // mocked out for testing. 24 25 // See Keychain Services documentation for function documentation, as these call 26 // through directly to their Keychain Services equivalents (Foo -> 27 // SecKeychainFoo). The only exception is Free, which should be used for 28 // anything returned from this class that would normally be freed with 29 // CFRelease (to aid in testing). 30 class CRYPTO_EXPORT AppleKeychain { 31 public: 32 AppleKeychain(); 33 virtual ~AppleKeychain(); 34 35 virtual OSStatus FindGenericPassword(CFTypeRef keychainOrArray, 36 UInt32 serviceNameLength, 37 const char* serviceName, 38 UInt32 accountNameLength, 39 const char* accountName, 40 UInt32* passwordLength, 41 void** passwordData, 42 SecKeychainItemRef* itemRef) const; 43 44 virtual OSStatus ItemFreeContent(SecKeychainAttributeList* attrList, 45 void* data) const; 46 47 virtual OSStatus AddGenericPassword(SecKeychainRef keychain, 48 UInt32 serviceNameLength, 49 const char* serviceName, 50 UInt32 accountNameLength, 51 const char* accountName, 52 UInt32 passwordLength, 53 const void* passwordData, 54 SecKeychainItemRef* itemRef) const; 55 56 #if !defined(OS_IOS) 57 virtual OSStatus ItemCopyAttributesAndData( 58 SecKeychainItemRef itemRef, 59 SecKeychainAttributeInfo* info, 60 SecItemClass* itemClass, 61 SecKeychainAttributeList** attrList, 62 UInt32* length, 63 void** outData) const; 64 65 virtual OSStatus ItemModifyAttributesAndData( 66 SecKeychainItemRef itemRef, 67 const SecKeychainAttributeList* attrList, 68 UInt32 length, 69 const void* data) const; 70 71 virtual OSStatus ItemFreeAttributesAndData(SecKeychainAttributeList* attrList, 72 void* data) const; 73 74 virtual OSStatus ItemDelete(SecKeychainItemRef itemRef) const; 75 76 virtual OSStatus SearchCreateFromAttributes( 77 CFTypeRef keychainOrArray, 78 SecItemClass itemClass, 79 const SecKeychainAttributeList* attrList, 80 SecKeychainSearchRef* searchRef) const; 81 82 virtual OSStatus SearchCopyNext(SecKeychainSearchRef searchRef, 83 SecKeychainItemRef* itemRef) const; 84 85 virtual OSStatus AddInternetPassword(SecKeychainRef keychain, 86 UInt32 serverNameLength, 87 const char* serverName, 88 UInt32 securityDomainLength, 89 const char* securityDomain, 90 UInt32 accountNameLength, 91 const char* accountName, 92 UInt32 pathLength, const char* path, 93 UInt16 port, SecProtocolType protocol, 94 SecAuthenticationType authenticationType, 95 UInt32 passwordLength, 96 const void* passwordData, 97 SecKeychainItemRef* itemRef) const; 98 99 // Calls CFRelease on the given ref, after checking that |ref| is non-NULL. 100 virtual void Free(CFTypeRef ref) const; 101 #endif // !defined(OS_IOS) 102 103 private: 104 DISALLOW_COPY_AND_ASSIGN(AppleKeychain); 105 }; 106 107 } // namespace crypto 108 109 #endif // CRYPTO_KEYCHAIN_MAC_H_ 110