2017-02-15 9 views
1

OpenSSLを使用してNSDataからEC_Keyを作成します。だから私は、次のように記述: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); 

リターンはnull。

何が問題ですか?彼の偉大なコメントを@jwwする

+0

'd2i_ECParameters'への呼び出しが失敗した後、' ERR_get_error'は何を返しますか? – jww

+0

@jww適切なエラーコードは生成されません。 '218570875'を生成します。 'd2i_ECParameters'関数の' d2i_ECPKParameters(&ret-> group、in、len) 'のエラーです。私は正確な問題を見つけることができません –

+0

'218570875'は' 0xD07207B'です。 'openssl errstr 0xD07207B'は' error:0D07207B:asn1エンコーディングルーチン:ASN1_get_object:header too long'を返します。 'd2i_ECParameters'のパラメータが間違っているようです。 ECパラメータは、ドメインパラメータです。キーではなく曲線を使うべきでしょうか?たぶん 'd2i_ECParameters(&ec_group、&bits、privateKey.length)'のようなものでしょうか? – jww

答えて

1

おかげで、最終的に、私は、公開鍵と秘密鍵の両方を持っていましたが、上記のコードで、私は計算が次のコードブロック

- (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); 
} 

することにより、この問題を解決するために成功します秘密鍵からの公開鍵。

関連する問題