Я пытаюсь создать симметричный ключ шифрования с использованием Security Transforms в OSX, а затем сохранить этот ключ в цепочке ключей. Я могу создать рабочий ключ и сохранить его в цепочке ключей, но когда я вспоминаю ключ и пытаюсь его использовать, я получаю ошибку CDSA, что «отсутствующее значение было обнаружено».Сохранение симметричного ключа SecKeyRef в OSX
Также уместен. После того, как я сохранил ключ в цепочке ключей, если я попытаюсь удалить его вручную, я получаю сообщение об ошибке «Отсутствие значения было обнаружено», и если я попытаюсь создать второй ключ с другим ярлыком, мне сказали что ключ уже существует в цепочке ключей.
Вот код, который я использую, чтобы сохранить SecKeyRef в цепочке ключей, собранной из одного из примеров Transforms Security Transforms. Приветствовали бы любые предложения о том, что я могу делать неправильно. Существуют ли другие обязательные атрибуты для SecKeychainAttributeList, которые мне не хватает? Я неправильно храню данные ключей? Я не очень хорошо знаком с работой в C.
+ (BOOL)addKey:(SecKeyRef)key withLabel:(NSString*)label
{
OSStatus err;
SecKeychainItemRef item = nil;
const char *itemLabelUTF8 = [label UTF8String];
SecKeychainAttribute attrs[] = {
{ kSecLabelItemAttr, strlen(itemLabelUTF8), (char *)itemLabelUTF8 }
};
SecKeychainAttributeList attributes = { sizeof(attrs)/sizeof(attrs[0]),
attrs };
err = SecKeychainItemCreateFromContent(
kSecSymmetricKeyItemClass,//class of item being created
&attributes,//attributes dictionary
sizeof(key),//length of buffer holding data to store
key, //buffer with data to store
NULL, // use the default keychain
NULL,//access object to define access. null = access for this app
&item);//reference to created item on return
if (item) CFRelease(item);
if (err == errSecSuccess) {
DDLogVerbose(@"created keychain item");
return YES;
} else if (err == errSecDuplicateItem){
DDLogVerbose(@"key already exists in keychain");
return NO;
} else {
DDLogVerbose(@"error: %d", err);
return NO;
}
}