Добавление личного ключа в iOS Keychain

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

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

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 . Таким образом, для этого ключа нет значения. Затем, когда я пытаюсь добавить закрытый ключ в Keychain, я получаю -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: Я понял, что он работает только в первый раз. Даже когда данные и ключ различны, после первого сохранения в цепочке ключей я не могу сохранить дополнительные ключи.

Следующий код работал для меня:

 NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; [query setObject:(id)kSecClassKey forKey:(id)kSecClass]; [query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible]; [query setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData]; //adding access key [query setObject:(id)key forKey:(id)kSecAttrApplicationTag]; //removing item if it exists SecItemDelete((CFDictionaryRef)query); //setting data (private key) [query setObject:(id)data forKey:(id)kSecValueData]; CFTypeRef persistKey; OSStatus status = SecItemAdd((CFDictionaryRef)query, &persistKey); if(status) { NSLog(@"Keychain error occured: %ld (statuscode)", status); return NO; } 

Извините, но я никогда не смогу отладить ваш код. Apple предоставляет некоторый пример кода (KeychainItemWrapper), который позволяет сохранить одну строку (я помню). Это большая помощь, связанная с цепочкой ключей. Существует сущность в Интернете, которая является модифицированной версией этого класса, но сохраняет и восстанавливает словарь (заархивированный как объект данных, что и делает код Apple для строки). Это позволяет сохранять несколько элементов в одном интерфейсе для связки ключей. Суть здесь Keychain для NSDictionary / data

Interesting Posts
Давайте будем гением компьютера.