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