J'ai implémenté une solution à cela et je l'ai mise sur GitHub. Vous pouvez désormais utiliser les API approuvées par Apple pour le trousseau au lieu d'OpenSSL. (Ils dissuadent OpenSSL dans leur littérature, malheureusement.)
https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS
SCZ-BasicEncodingRules iOS
Mise en œuvre de règles de codage pour permettre l'importation de clés RSA à iOS KeyChain utilisant l'exposant. Code cible iOS 5 avec ARC. Supposons que vous ayez déjà un module et un exposant de une clé publique RSA en tant que NSData dans les variables nommées pubKeyModData et pubKeyModData. Ensuite, le code suivant crée un NSData contenant cette clé publique RSA , que vous pouvez ensuite insérer dans le trousseau iOS ou OS X.
NSMutableArray *testArray = [[NSMutableArray alloc] init];
[testArray addObject:pubKeyModData];
[testArray addObject:pubKeyExpData];
NSData *testPubKey = [testArray berData];
Cela vous permettra de stocker la clé à l'aide du addPeerPublicKey: keyBits: méthode de SecKeyWrapper dans l'exemple d'Apple CryptoExercise. Ou, du point de vue de l'API de bas niveau, vous pouvez utiliser SecItemAdd().
NSString * peerName = @"Test Public Key";
NSData * peerTag =
[[NSData alloc]
initWithBytes:(const void *)[peerName UTF8String]
length:[peerName length]];
NSMutableDictionary * peerPublicKeyAttr = [[NSMutableDictionary alloc] init];
[peerPublicKeyAttr
setObject:(__bridge id)kSecClassKey
forKey:(__bridge id)kSecClass];
[peerPublicKeyAttr
setObject:(__bridge id)kSecAttrKeyTypeRSA
forKey:(__bridge id)kSecAttrKeyType];
[peerPublicKeyAttr
setObject:peerTag
forKey:(__bridge id)kSecAttrApplicationTag];
[peerPublicKeyAttr
setObject:testPubKey
forKey:(__bridge id)kSecValueData];
[peerPublicKeyAttr
setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecReturnPersistentRef];
sanityCheck = SecItemAdd((__bridge CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&persistPeer);