В CI можно сделать следующее:
bignum = BN_new();
BN_bin2bn(my_message, 32, bignum);
group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
ecp = EC_POINT_new(group);
check = EC_POINT_set_compressed_coordinates_GFp(group, ecp, bignum, 0, NULL);
key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
check = EC_KEY_set_public_key(key, ecp);
check = EVP_PKEY_set1_EC_KEY(public_key, key);
В Ruby я думал, что это будет делать то же самое, но я получаю ошибку *
bignum = OpenSSL::BN.new(my_message, 2)
group = OpenSSL::PKey::EC::Group.new('prime256v1')
group.point_conversion_form = :compressed
public_key = OpenSSL::PKey::EC::Point.new(group, bignum)
В обоих случаях ямогу зарегистрировать bignum и увидеть, что это то же самое, и я вполне уверен, prime256v1
- правильная группа.
В обоих случаях C и Ruby используют одну и ту же версию OpenSSL (OpenSSL 1.0.2p 14Авг 2018)
Любой совет о том, что я делаю здесь, будет очень ценным.
* Полученное сообщение об ошибке invalid encoding (OpenSSL::PKey::EC::Point::Error)