2013-07-09 2 views
1

Я пытаюсь создать симметричный ключ шифрования с использованием 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; 
    } 
} 

ответ

0

Одиночная проблема.
Но в целом вы должны использовать SecItemAdd, вот что говорит Apple DevDocs: Apple DevDocs Keychain Service Tasks for OSX (at the end of the page).

Я использую для хранения симметричного ключа следующий код, который на самом деле работает, но удаление по-прежнему беспорядок. ;-) Любые предложения также для меня приветствуются. Надеюсь, что это поможет:

// Identifier for symmetric key 
static const uint8_t keyIdentfier[] = "this.is.my.TestKeyLabel"; 
NSData *tag = [[NSData alloc] initWithBytes:keyIdentfier length:sizeof(keyIdentfier)]; 

// Simple keygen algo - JUST FOR EXAMPLE DO NOT USE! 
NSMutableData *key = [NSMutableData dataWithLength:8]; 
SecRandomCopyBytes(kSecRandomDefault, 8, key.mutableBytes); 
NSString *base64key = [key base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; 
[dict setObject:tag forKey:(__bridge id)kSecAttrApplicationTag]; 
[dict setObject:(__bridge id)kSecAttrKeyClassSymmetric forKey:(__bridge id)kSecAttrKeyType]; 
[dict setObject:key forKey:(__bridge id)kSecValueData]; 

// Insert key into keychain based on dictionary attributes above 
OSStatus osstatus = SecItemAdd((__bridge CFDictionaryRef)dict, NULL); 
Смежные вопросы