Добавление закрытого ключа в цепочку ключей iOS

Я пытаюсь добавить закрытый ключ в цепочку ключей iOS. Открытый ключ сертификата ()работает нормально, но закрытый ключ отказывается... Я совершенно не понимаю, почему следующий код не работает.

Сначала я проверяю, является ли текущий ключ (=key в случае, если Связка ключей является хранилищем ключей/значений ), является «свободной» в Связке ключей. Затем я собираюсь добавить закрытый ключ.

CFStringRef labelstring = CFStringCreateWithCString(NULL, [key cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8);

NSArray* keys = [NSArray arrayWithObjects:(__bridge id)kSecClass,kSecAttrLabel,kSecReturnData,kSecAttrAccessible,nil];
NSArray* values = [NSArray arrayWithObjects:(__bridge id)kSecClassKey,labelstring,kCFBooleanTrue,kSecAttrAccessibleWhenUnlocked,nil];
NSMutableDictionary* searchdict = [NSMutableDictionary dictionaryWithObjects:values forKeys:keys];

CFRelease(labelstring);

NSMutableDictionary *query = searchdict;


CFTypeRef item = NULL;
OSStatus error = SecItemCopyMatching((__bridge_retained CFDictionaryRef) query, &item);

if (error)
{
    NSLog(@"Error: %ld (statuscode)", error);
}

if(error != errSecItemNotFound)
{
    SecItemDelete((__bridge_retained CFDictionaryRef) query);
}

[query setObject:(id)data forKey:(__bridge id)kSecValueData];

OSStatus status = SecItemAdd((__bridge_retained CFDictionaryRef) query, &item);

if(status)
{
    NSLog(@"Keychain error occured: %ld (statuscode)", status);
    return NO;
}

Результат отладки следующий:

2012-07-26 15:33:03.772 App[15529:1b03] Error: -25300 (statuscode)
2012-07-26 15:33:11.195 App[15529:1b03] Keychain error occured: -25299 (statuscode)

Первый код ошибки -25300представляет errSecItemNotFound. Таким образом, для этого ключа не сохраняется значение. Затем, когда я пытаюсь добавить закрытый ключ в связку ключей, я получаю -25299, что означает errSecDuplicateItem. Я этого не понимаю. Почему это происходит?

У кого-нибудь есть ключ или намек на это?

Коды ошибок Apple:

errSecSuccess                = 0,       /* No error. */
errSecUnimplemented          = -4,      /* Function or operation not implemented. */
errSecParam                  = -50,     /* One or more parameters passed to a function where not valid. */
errSecAllocate               = -108,    /* Failed to allocate memory. */
errSecNotAvailable           = -25291,  /* No keychain is available. You may need to restart your computer. */
errSecDuplicateItem          = -25299,  /* The specified item already exists in the keychain. */
errSecItemNotFound           = -25300,  /* The specified item could not be found in the keychain. */
errSecInteractionNotAllowed  = -25308,  /* User interaction is not allowed. */
errSecDecode                 = -26275,  /* Unable to decode the provided data. */
errSecAuthFailed             = -25293,  /* The user name or passphrase you entered is not correct. */ 

Заранее спасибо!

Обновление #1 :Я так понял, что работает только в первый раз. Даже если данные и ключ разные, после первого сохранения в связке ключей я не могу хранить другие ключи.

20
задан Kara 26 February 2014 в 00:33
поделиться