2016-06-16 11 views
0

Я сгенерировал закрытый ключ PKCS # 12, а затем поместил его в формате PEM и отправил его в приложение iPhone. Я хочу сохранить этот закрытый ключ в iPhone Keychain.Поместите секретный ключ RSA в брелок для iPhone с помощью SecItemAdd

Во-первых, я удалил заголовки наподобие «НАЧАТЬ ЧАСОВОЙ КЛЮЧ RSA». Затем я преобразовал остальную часть в NSData. Затем, используя такой код:

CFDictionaryRef issues in Swift

Я был в состоянии получить SecKeyRef из этого секретного ключа.

Теперь я хочу знать, как я могу вставить этот SecKeyRef в брелок, используя SecItemAdd?

+0

есть у пытались использовать любую библиотеку? –

+0

Нет, какую библиотеку вы бы предложили? – hockeybro

+0

like - https://github.com/kishikawakatsumi/KeychainAccess или https://github.com/soffes/SSKeychain –

ответ

0

Попробуйте использовать этот метод для преобразования SecKeyRef в NSData

- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey { 

    static const uint8_t publicKeyIdentifier[] = "com.your.company.publickey"; 
    NSData *publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)]; 

    OSStatus sanityCheck = noErr; 
    NSData * publicKeyBits = nil; 

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; 
    [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; 
    [queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag]; 
    [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 

    // Temporarily add key to the Keychain, return as data: 
    NSMutableDictionary * attributes = [queryPublicKey mutableCopy]; 
    [attributes setObject:(__bridge id)givenKey forKey:(__bridge id)kSecValueRef]; 
    [attributes setObject:@YES forKey:(__bridge id)kSecReturnData]; 
    CFTypeRef result; 
    sanityCheck = SecItemAdd((__bridge CFDictionaryRef) attributes, &result); 
    if (sanityCheck == errSecSuccess) { 
     publicKeyBits = CFBridgingRelease(result); 

     // Remove from Keychain again: 
     (void)SecItemDelete((__bridge CFDictionaryRef) queryPublicKey); 
    } 

    return publicKeyBits; 
} 

А затем добавить его в брелок.
Я надеюсь, что это решит вашу проблему.