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#include "crypto/apple_keychain.h" 6 7#import <Foundation/Foundation.h> 8 9#include "base/synchronization/lock.h" 10#include "crypto/mac_security_services_lock.h" 11 12namespace crypto { 13 14AppleKeychain::AppleKeychain() {} 15 16AppleKeychain::~AppleKeychain() {} 17 18OSStatus AppleKeychain::ItemCopyAttributesAndData( 19 SecKeychainItemRef itemRef, 20 SecKeychainAttributeInfo* info, 21 SecItemClass* itemClass, 22 SecKeychainAttributeList** attrList, 23 UInt32* length, 24 void** outData) const { 25 base::AutoLock lock(GetMacSecurityServicesLock()); 26 return SecKeychainItemCopyAttributesAndData(itemRef, info, itemClass, 27 attrList, length, outData); 28} 29 30OSStatus AppleKeychain::ItemModifyAttributesAndData( 31 SecKeychainItemRef itemRef, 32 const SecKeychainAttributeList* attrList, 33 UInt32 length, 34 const void* data) const { 35 base::AutoLock lock(GetMacSecurityServicesLock()); 36 return SecKeychainItemModifyAttributesAndData(itemRef, attrList, length, 37 data); 38} 39 40OSStatus AppleKeychain::ItemFreeAttributesAndData( 41 SecKeychainAttributeList* attrList, 42 void* data) const { 43 base::AutoLock lock(GetMacSecurityServicesLock()); 44 return SecKeychainItemFreeAttributesAndData(attrList, data); 45} 46 47OSStatus AppleKeychain::ItemDelete(SecKeychainItemRef itemRef) const { 48 base::AutoLock lock(GetMacSecurityServicesLock()); 49 return SecKeychainItemDelete(itemRef); 50} 51 52OSStatus AppleKeychain::SearchCreateFromAttributes( 53 CFTypeRef keychainOrArray, 54 SecItemClass itemClass, 55 const SecKeychainAttributeList* attrList, 56 SecKeychainSearchRef* searchRef) const { 57 base::AutoLock lock(GetMacSecurityServicesLock()); 58 return SecKeychainSearchCreateFromAttributes(keychainOrArray, itemClass, 59 attrList, searchRef); 60} 61 62OSStatus AppleKeychain::SearchCopyNext(SecKeychainSearchRef searchRef, 63 SecKeychainItemRef* itemRef) const { 64 base::AutoLock lock(GetMacSecurityServicesLock()); 65 return SecKeychainSearchCopyNext(searchRef, itemRef); 66} 67 68OSStatus AppleKeychain::AddInternetPassword( 69 SecKeychainRef keychain, 70 UInt32 serverNameLength, 71 const char* serverName, 72 UInt32 securityDomainLength, 73 const char* securityDomain, 74 UInt32 accountNameLength, 75 const char* accountName, 76 UInt32 pathLength, 77 const char* path, 78 UInt16 port, 79 SecProtocolType protocol, 80 SecAuthenticationType authenticationType, 81 UInt32 passwordLength, 82 const void* passwordData, 83 SecKeychainItemRef* itemRef) const { 84 base::AutoLock lock(GetMacSecurityServicesLock()); 85 return SecKeychainAddInternetPassword(keychain, 86 serverNameLength, serverName, 87 securityDomainLength, securityDomain, 88 accountNameLength, accountName, 89 pathLength, path, 90 port, protocol, authenticationType, 91 passwordLength, passwordData, 92 itemRef); 93} 94 95OSStatus AppleKeychain::FindGenericPassword(CFTypeRef keychainOrArray, 96 UInt32 serviceNameLength, 97 const char* serviceName, 98 UInt32 accountNameLength, 99 const char* accountName, 100 UInt32* passwordLength, 101 void** passwordData, 102 SecKeychainItemRef* itemRef) const { 103 base::AutoLock lock(GetMacSecurityServicesLock()); 104 return SecKeychainFindGenericPassword(keychainOrArray, 105 serviceNameLength, 106 serviceName, 107 accountNameLength, 108 accountName, 109 passwordLength, 110 passwordData, 111 itemRef); 112} 113 114OSStatus AppleKeychain::ItemFreeContent(SecKeychainAttributeList* attrList, 115 void* data) const { 116 base::AutoLock lock(GetMacSecurityServicesLock()); 117 return SecKeychainItemFreeContent(attrList, data); 118} 119 120OSStatus AppleKeychain::AddGenericPassword(SecKeychainRef keychain, 121 UInt32 serviceNameLength, 122 const char* serviceName, 123 UInt32 accountNameLength, 124 const char* accountName, 125 UInt32 passwordLength, 126 const void* passwordData, 127 SecKeychainItemRef* itemRef) const { 128 base::AutoLock lock(GetMacSecurityServicesLock()); 129 return SecKeychainAddGenericPassword(keychain, 130 serviceNameLength, 131 serviceName, 132 accountNameLength, 133 accountName, 134 passwordLength, 135 passwordData, 136 itemRef); 137} 138 139void AppleKeychain::Free(CFTypeRef ref) const { 140 if (ref) 141 CFRelease(ref); 142} 143 144} // namespace crypto 145