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);
}