2016-12-08 4 views
0

Я хочу экспортировать открытый ключ и закрытый ключ из EC_KEY, который создан из OpenSSL, и, как мы знаем, EC_KEY удерживайте keypair, но openssl не совместим для хранения keypair в защищенном анклаве. Поэтому я хочу создать сертификат из OpenSSL и создать там ключевую пару, а затем экспортировать ключи из EC_KEY в SecKeyRef, а затем создать пару ключей и сохранить в Secure Enclave.Экспортировать открытый ключ и закрытый ключ из EC_KEY OpenSSL в SecKeyRef

  • Так что, прежде всего, рассказ это возможно?
  • Если да, то как я могу экспортировать Private Public Key из EC_KEY и превратить их в SecRefKey
  • Если я ошибаюсь, на подходе, то руководство мне лучше один

я сделал Первая часть создана сертификат от кривой овальные EC_KEY из OpenSSL, а также сделана последняя часть для создания Keypair. Вот ниже код для создания Keypair.

- (void)generateKeyPair:(NSUInteger)keySize { 
OSStatus sanityCheck = noErr; 
publicKey = NULL; 
privateKey = NULL; 

// LOGGING_FACILITY1(keySize == 512 || keySize == 1024 || keySize == 2048, @"%d is an invalid and unsupported key size.", keySize); 

// First delete current keys. 
// [self deleteAsymmetricKeys]; 

// Container dictionaries. 
NSMutableDictionary * privateKeyAttr = [[NSMutableDictionary alloc] init]; 
NSMutableDictionary * publicKeyAttr = [[NSMutableDictionary alloc] init]; 
NSMutableDictionary * keyPairAttr = [[NSMutableDictionary alloc] init]; 

// Set top level dictionary for the keypair. 
[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeEC forKey:(__bridge id)kSecAttrKeyType]; 
[keyPairAttr setObject:[NSNumber numberWithUnsignedInteger:keySize] forKey:(__bridge id)kSecAttrKeySizeInBits]; 

    [keyPairAttr setObject:(__bridge id)kSecAttrTokenID forKey:(__bridge id)kSecAttrTokenIDSecureEnclave]; 
// [keyPairAttr setObject:(__bridge id)kSecAttrTokenID forKey:(__bridge id)kSecAttrTokenIDSecureEnclave]; 

// Set the private key dictionary. 
[privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent]; 
[privateKeyAttr setObject:privateTag forKey:(__bridge id)kSecAttrApplicationTag]; 

// See SecKey.h to set other flag values. 

// Set the public key dictionary. 
[publicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent]; 
[publicKeyAttr setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag]; 
// See SecKey.h to set other flag values. 

// Set attributes to top level dictionary. 
[keyPairAttr setObject:privateKeyAttr forKey:(__bridge id)kSecPrivateKeyAttrs]; 
[keyPairAttr setObject:publicKeyAttr forKey:(__bridge id)kSecPublicKeyAttrs]; 

// SecKeyGeneratePair returns the SecKeyRefs just for educational purposes. 
sanityCheck = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr, &publicKey, &privateKey); 

// LOGGING_FACILITY(sanityCheck == noErr && publicKey != NULL && privateKey != NULL, @"Something really bad went wrong with generating the key pair."); 
if(sanityCheck == noErr && publicKey != NULL && privateKey != NULL) 
{ 
    NSLog(@"Successful"); 
} 

// [privateKeyAttr release]; 
// [publicKeyAttr release]; 
// [keyPairAttr release]; 
} 

ответ

0

Вы не можете импортировать что-либо в защищенный анклав. Вы можете только сгенерировать пару ключей, используя SecKeyGeneratePair (как вы это делали в вашем коде)

Вот ссылка на это в документации компании Apple: https://developer.apple.com/reference/security/keychain_services/token_id_values

После того, как вы его генерироваться вы можете:

  • знак данные (SecKeyRawSign)
  • проверки подписи (SecKeyRawVerify)
  • шифрования/дешифрования (SecKeyCreateEncryptedData, SecKeyCreateDecryptedData)
  • получить ключи из (SecItemCopyMatching) и делать все, что вы хотите с ними

Если вы хотите Interop с OpenSSL вам просто нужно, чтобы преобразовать их к чему-то OpenSSL может прочитать (например, PEM, DER и т.д.)

Вот простое преобразование открытого ключа из сырых байт (то, что SecItemCopyMatching дает вам в словаре под kSecValueData) в PEM

+ (NSString*) openSSLPubKey:(NSData*) rawPublicKeyBytes { 

    uint8_t curveOIDHeader[] = {0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00}; 

    NSMutableData* data = [[NSMutableData alloc] initWithBytes:curveOIDHeader length:26]; 

    [data appendData:rawPublicKeyBytes]; 

    NSString* base64EncodedString = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithCarriageReturn]; 
    return [NSString stringWithFormat:@"-----BEGIN PUBLIC KEY-----\n%@\n-----END PUBLIC KEY-----",base64EncodedString]; 

} 

Обратите внимание, что вы можете хранить только 256-бит закрытые ключи эллиптической кривой в защищенном анклаве, следовательно, заголовок OID с жестким кодом