Преобразование SecKeyRef в EC_KEY в iOS

Я создаю CSR из openSSL, но из-за того, что OpenSSL не хранит ключи в безопасном анклаве, поэтому я выбираю цель C для создания пары ключей (закрытый ключ и открытый ключ) в безопасном анклаве и отправки в OpenSSL для сертификата X509. Я успешно получаю открытый ключ в NSData, затем конвертирую const unsigned char * bitsOfKeyDataPublicKey = (unsigned char *) [publicKey bytes]; и затем создаю открытый ключ EC_KEY*_ec_keyPublic = d2i_EC_PUBKEY(NULL,&bitsOfKeyDataPublicKey, publicKeyLegnth);. Но для закрытого ключа мы получаем SecKeyRef из цели c, поэтому для создания EC_Key как мы можем преобразовать закрытый ключ или это какой-либо способ преобразования или использования закрытого ключа? Ищу ответ. Спасибо


person Aleem    schedule 14.12.2016    source источник


Ответы (1)


Вы можете изменить закрытый ключ с SecKeyRef на NSData

Пример:

- (NSData *)getPrivateKeyBits {
    OSStatus sanityCheck = noErr;
    NSData * privateKeyBits = nil;

    NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.

    [queryPrivateKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPrivateKey setObject:_privateTag forKey:(id)kSecAttrApplicationTag];
    [queryPrivateKey setObject:(id)kSecAttrKeyTypeEC forKey:(id)kSecAttrKeyType];
    [queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPrivateKey, (void *)&privateKeyBits);

    if (sanityCheck != noErr) {
        privateKeyBits = nil;
    }
    else if (sanityCheck == errSecItemNotFound) {
        privateKeyBits = nil;
    }

    return privateKeyBits;
}

Не забудьте использовать _privateTag для генерации закрытого ключа.

теперь вы можете использовать:

const unsigned char *bitsOfKeyDataPrivateKey = (unsigned char *) [[self getPrivateKeyBits] bytes];
EC_KEY *_ec_keyPrivate = d2i_EC_PUBKEY(NULL,&bitsOfKeyDataPrivateKey, privateKeyLegnth);
person Hassan Shahbazi    schedule 20.01.2017
comment
Что должно отдавать в privateKeyLegnth? - person Sunil aruru; 07.03.2018
comment
Первая часть этого ответа (как экспортировать ключ) верна, но экспортированный ключ несовместим с d2i_EC_PUBKEY. См.: forums.developer.apple.com/message/84684#84684. - person Chaosed0; 18.05.2018
comment
Разве вы не должны использовать d2i_PrivateKey_bio для закрытого ключа? - person William GP; 02.04.2019