Próbuję dodać klucz prywatny do pęku kluczy systemu iOS. Certyfikat (klucz publiczny) działa dobrze, ale klucz prywatny odmawia ... Jestem całkowicie zdezorientowany, dlaczego poniższy kod nie działa.Dodawanie klucza prywatnego do pęku kluczy systemu iOS
Najpierw sprawdzam, czy bieżący klucz (= klucz, w przypadku którego Keychain jest magazynem kluczy/wartości) jest "wolny" w pęku kluczy. Następnie dodam klucz prywatny.
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;
}
Wyjście debugowania jest następująca:
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)
Pierwszy kod błędu -25300
reprezentuje errSecItemNotFound
. Tak więc nie ma wartości zapisanej dla tego klucza. Następnie, gdy próbuję dodać klucz prywatny do pęku kluczy, otrzymuję -25299
, co oznacza errSecDuplicateItem
. Nie rozumiem tego. Dlaczego to się dzieje?
Czy ktoś ma wskazówkę lub podpowiedź na ten temat?
kody błędów 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. */
Z góry dzięki!
Aktualizacja # 1: Stwierdziłem, że działa tylko po raz pierwszy. Nawet jeśli dane i klucz są różne, po pierwszym zapisaniu w pęku kluczy nie mogę przechowywać kolejnych kluczy.
Jestem stoi dokładnie ten sam problem. Pierwszy klucz dodany za pomocą SecItemAdd bez problemu, a następnie każde kolejne wywołanie SecItemAdd kończy się niepowodzeniem z errSecDuplicateItem, mimo że SecItemCopyMatching zwraca errSecItemNotFound. Czy znalazłeś już rozwiązanie? – 100grams