1/* 2 * Copyright (c) 2002-2004,2011,2014 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24#include <Security/SecIdentitySearch.h> 25#include <Security/SecIdentitySearchPriv.h> 26#include <security_keychain/IdentityCursor.h> 27#include <security_keychain/Identity.h> 28 29#include "SecBridge.h" 30 31 32CFTypeID 33SecIdentitySearchGetTypeID(void) 34{ 35 BEGIN_SECAPI 36 37 return gTypes().IdentityCursor.typeID; 38 39 END_SECAPI1(_kCFRuntimeNotATypeID) 40} 41 42 43OSStatus 44SecIdentitySearchCreate( 45 CFTypeRef keychainOrArray, 46 CSSM_KEYUSE keyUsage, 47 SecIdentitySearchRef *searchRef) 48{ 49 BEGIN_SECAPI 50 51 Required(searchRef); 52 53 StorageManager::KeychainList keychains; 54 globals().storageManager.optionalSearchList(keychainOrArray, keychains); 55 SecPointer<IdentityCursor> identityCursor(new IdentityCursor (keychains, keyUsage)); 56 *searchRef = identityCursor->handle(); 57 58 END_SECAPI 59} 60 61OSStatus SecIdentitySearchCreateWithAttributes( 62 CFDictionaryRef attributes, 63 SecIdentitySearchRef* searchRef) 64{ 65 BEGIN_SECAPI 66 67 // 68 // %%%TBI This function needs a new form of IdentityCursor that takes 69 // the supplied attributes as input. 70 // 71 Required(searchRef); 72 StorageManager::KeychainList keychains; 73 globals().storageManager.getSearchList(keychains); 74 SecPointer<IdentityCursor> identityCursor(new IdentityCursor (keychains, 0)); 75 *searchRef = identityCursor->handle(); 76 77 END_SECAPI 78} 79 80OSStatus SecIdentitySearchCreateWithPolicy( 81 SecPolicyRef policy, 82 CFStringRef idString, 83 CSSM_KEYUSE keyUsage, 84 CFTypeRef keychainOrArray, 85 Boolean returnOnlyValidIdentities, 86 SecIdentitySearchRef* searchRef) 87{ 88 BEGIN_SECAPI 89 90 Required(searchRef); 91 92 StorageManager::KeychainList keychains; 93 globals().storageManager.optionalSearchList(keychainOrArray, keychains); 94 SecPointer<IdentityCursorPolicyAndID> identityCursor(new IdentityCursorPolicyAndID (keychains, keyUsage, idString, policy, returnOnlyValidIdentities)); 95 96 *searchRef = identityCursor->handle(); 97 98 END_SECAPI 99} 100 101OSStatus 102SecIdentitySearchCopyNext( 103 SecIdentitySearchRef searchRef, 104 SecIdentityRef *identityRef) 105{ 106 BEGIN_SECAPI 107 108 RequiredParam(identityRef); 109 SecPointer<Identity> identityPtr; 110 if (!IdentityCursor::required(searchRef)->next(identityPtr)) 111 return errSecItemNotFound; 112 113 *identityRef = identityPtr->handle(); 114 115 END_SECAPI 116} 117