L'ajout de la clé privée dans iOS Trousseau

Je suis en train d'ajouter une clé privée dans l'iOS trousseau de clés. Le certificat de clé publique) fonctionne très bien mais la clé privée refuse... je suis totalement confus pourquoi le code suivant ne fonctionne pas.

D'abord je vérifie si la clé actuelle (=clé en cas de que le Trousseau est un magasin de clé/valeur) est "libre" dans le Trousseau d'accès. Ensuite, je vais ajouter la clé privée.

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;
}

La sortie de débogage est la suivante:

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)

Le premier code d'erreur -25300 représente errSecItemNotFound. Donc, il n'y a pas de valeur stockée pour cette clé. Puis, lorsque j'essaie d'ajouter la clé privée dans le Trousseau je obtenir -25299 qui signifie errSecDuplicateItem. Je ne comprends pas cette. Pourquoi est-ce arrivé?

Quelqu'un a une idée ou une astuce à ce sujet?

Apple codes d'erreur:

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. */ 

Merci d'avance!

Mise à jour #1: j'ai compris que cela ne fonctionne que pour la première fois. Même lorsque les données et la clé est différente, après la première fois stockées dans le trousseau je ne peut pas stocker plus de touches.

  • Je me pose exactement la même question. Première clé ajoutés à l'aide de SecItemAdd sans problème, puis une période consécutive de l'appel à SecItemAdd échoue avec errSecDuplicateItem bien que malgré SecItemCopyMatching retour errSecItemNotFound. Avez-vous trouvé une solution à cela?
InformationsquelleAutor Chris | 2012-07-26