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;
}
Пожалуйста, поправьте меня, если я ошибаюсь.