SecIdentityRef SecIdentityCopyPreferred(CFStringRef name, CFArrayRef keyUsage, CFArrayRef validIssuers) { // This function will look for a matching preference in the following order: // - matches the name and the supplied key use // - matches the name and the special 'ANY' key use // - matches the name with no key usage constraint SecIdentityRef identityRef = NULL; CSSM_KEYUSE keyUse = ConvertArrayToKeyUsage(keyUsage); OSStatus status = SecIdentityCopyPreference(name, keyUse, validIssuers, &identityRef); if (status != errSecSuccess && keyUse != CSSM_KEYUSE_ANY) status = SecIdentityCopyPreference(name, CSSM_KEYUSE_ANY, validIssuers, &identityRef); if (status != errSecSuccess && keyUse != 0) status = SecIdentityCopyPreference(name, 0, validIssuers, &identityRef); return identityRef; }
Boolean ConvertSecKeyImportExportParametersToSecImportExportKeyParameters(SecKeyRef aKey, const SecItemImportExportKeyParameters* newPtr, SecKeyImportExportParameters* oldPtr) { Boolean result = false; if (NULL != oldPtr && NULL != newPtr) { oldPtr->version = newPtr->version; oldPtr->flags = newPtr->flags; oldPtr->passphrase = newPtr->passphrase; oldPtr->alertTitle = newPtr->alertTitle; oldPtr->alertPrompt = newPtr->alertPrompt; oldPtr->accessRef = newPtr->accessRef; oldPtr->keyUsage = ConvertArrayToKeyUsage(newPtr->keyUsage); oldPtr->keyAttributes = ConvertArrayToKeyAttributes(aKey, newPtr->keyAttributes); result = true; } return result; }
OSStatus SecIdentitySetPreferred(SecIdentityRef identity, CFStringRef name, CFArrayRef keyUsage) { CSSM_KEYUSE keyUse = ConvertArrayToKeyUsage(keyUsage); return SecIdentitySetPreference(identity, name, keyUse); }