OpenSSL: bin2bn BIGNUM не выделяет новый BIGNUM, когда выходной ptr равен нулю

В соответствии с Руководство по OpenSSL 1.1.0, это говорит:

BN_bin2bn () преобразует положительное целое число в форме с прямым порядком байтов длины len в s в BIGNUM и помещает его в ret. Если ret равен NULL, создается новый BIGNUM.

Но тогда в следующем минимальном примере:

#include <iostream>
#include <boost/algorithm/hex.hpp>
#include <openssl/bn.h>
#include <vector>

int main()
{
std::string in = "200ec31326d7a933222e3b43a7d6c920a1d2e8a74d1e6f4980ca78b2d9c1aaba6c2ad71f0f1d0cbb40695f27be048982589bccf30066a8735db4a6b0928925077e";
std::vector<unsigned char> out;
// convert hex to binary bytes
boost::algorithm::unhex(in.begin(), in.end(), std::back_inserter(out));
BIGNUM *eccsig_r = nullptr;
// convert bytes to a BIGNUM object
BN_bin2bn(&out[1],  32, eccsig_r);
std::cout<<eccsig_r<<std::endl; // prints 0!
return 0;
}

Адрес указателя eccsig_r остается 0 (или nullptr). Если я понимаю, что написано в руководстве, это должно быть так eccsig_r никогда nullptr снова после звонка bin2bn(),

Почему eccsig_r еще nullptr? Я не могу этого понять. Пожалуйста, порекомендуйте. Я на Debian 9.

PS: Для полного раскрытия, в том гексе, который вы видите, есть простая подпись ECC, которую я сериализовал. Я не верю, что это как-то повлияет на это. Пожалуйста, поправьте меня, если я ошибаюсь.

1

Решение

ХОРОШО. Я думаю, что я понял это. Если ret является nullptrтогда возвращаемое значение создаст новый BIGNUM в ответ bin2bn(), По моему мнению, это странный способ делать вещи. Я не понимаю цель, но это работает:

#include <iostream>
#include <boost/algorithm/hex.hpp>
#include <openssl/bn.h>
#include <vector>

int main()
{
std::string in = "200ec31326d7a933222e3b43a7d6c920a1d2e8a74d1e6f4980ca78b2d9c1aaba6c2ad71f0f1d0cbb40695f27be048982589bccf30066a8735db4a6b0928925077e";
std::vector<unsigned char> out;
// convert hex to binary bytes
boost::algorithm::unhex(in.begin(), in.end(), std::back_inserter(out));
BIGNUM *eccsig_r = nullptr;
// convert bytes to a BIGNUM object
eccsig_r = BN_bin2bn(&out[1],  32, nullptr);
std::cout<<eccsig_r<<std::endl; // doesn't print zero anymore!
return 0;
}

Пожалуйста, поправьте меня, если я ошибаюсь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector