Преобразование C-реализации OpenSSL в код Ruby - PullRequest
0 голосов
/ 01 декабря 2018

В 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)

1 Ответ

0 голосов
/ 01 декабря 2018

Функция EC_POINT_set_compressed_coordinates_GFp в C ожидает, что вы передадите x-координату точки и отдельно значение, чтобы указать, какой из двух возможных точек это может быть (в действительности вы передаете литерал 0вы должны определить фактическое значение).

В Ruby инициализатор Point ожидает точку, закодированную в виде строки, содержащей информацию об обеих координатах (я не знаю, есть ли у этого формата имя, ноэто довольно распространено и задокументировано SECG ).В случае сжатых координат эта строка в основном те же 32 байта, что и в коде C, но с дополнительным байтом в начале, либо 0x02 или 0x03, что соответствует передаче 0 или 1 какбит y в EC_POINT_set_compressed_coordinates_GFp.

Если строка не начинается с 0x02 или 0x03 (или 0x04 для несжатых точек) или имеет неправильную длину, то вы получитеinvalid encoding ошибка.

Не похоже, что привязки Ruby OpenSSL предоставляют способ указать точку, используя отдельные координаты x и y.Самый простой способ - добавить префикс 0x02 или 0x03 к строке перед передачей ее в Point.new.

Если у вас уже есть эта строка, вы можете использовать ее в C для создания точки, используяEC_POINT_oct2point.Сам Ruby вызывает EC_POINT_oct2point, если вы передаете строку в Point.new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...