2017-02-15 13 views
1

Я хочу создать EC_Key из NSData через OpenSSL. Итак, я пишу следующее:d2i_ECParameters Возвращает Null

- (void)setPrivateKey:(NSData *)privateKey { 
     const unsigned char *bits = (unsigned char *) [privateKey bytes]; 
     eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); 
     ec_group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1); 
     EC_KEY_set_group(eckey, ec_group); 
     EC_KEY_generate_key(eckey); 
     EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE); 
     eckey = d2i_ECParameters(&eckey, &bits, privateKey.length); 
} 

но

eckey = d2i_ECParameters(&eckey, &bits, privateKey.length); 

возвращает нулевое значение.

В чем проблема?

+0

Что возвращает 'ERR_get_error' после вызова' d2i_ECParameters'? – jww

+0

@jww Не генерирует правильный код ошибки. он генерирует «218570875». Я обнаружил, что это ошибки в 'd2i_ECPKParameters (& ret-> group, in, len)' в функции 'd2i_ECParameters'. но я не могу продолжать находить точную проблему. –

+0

'218570875'' '0xD07207B'. 'openssl errstr 0xD07207B' возвращает' error: 0D07207B: asn1 процедуры кодирования: ASN1_get_object: заголовок слишком длинный'. это звучит так, как параметры неверны для 'd2i_ECParameters'. Параметры ЕС являются параметрами домена. Возможно, вы должны использовать кривую, а не ключ. Может быть, что-то вроде 'd2i_ECParameters (& ec_group, & bits, privateKey.length)' вместо? – jww

ответ

1

Благодаря @jww за большие комментарии, наконец, мне удалось решить эту проблему с помощью следующего блока кода

- (void)setPrivateKey:(NSData *)privateKey { 
     const unsigned char *privateKeyBits = (unsigned char *) [privateKey bytes]; 

    ec_group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1); 
    eckey = EC_KEY_new(); 
    EC_KEY_set_group(eckey, ec_group); 
    EC_KEY_generate_key(eckey); 
    EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE); 

    BIGNUM *prv = BN_bin2bn(privateKeyBits, sizeof(privateKeyBits), NULL); 
    EC_KEY_set_private_key(eckey, prv); 

    EC_POINT *pub = EC_POINT_new(ec_group); 
    EC_POINT_mul(ec_group, pub, prv, NULL, NULL, NULL); 
    EC_KEY_set_public_key(eckey, pub); 

    pkey = EVP_PKEY_new(); 
    EVP_PKEY_set1_EC_KEY(pkey, eckey); 
} 

Хотя я как открытый ключ и закрытый ключ, но выше код, который я вычислил открытый ключ из закрытого ключа.