gpt4 book ai didi

c++ - OpenSSL:当输出指针为空时,BIGNUM 的 bin2bn 不会分配新的 BIGNUM

转载 作者:太空宇宙 更新时间:2023-11-04 03:17:49 27 4
gpt4 key购买 nike

根据 OpenSSL 1.1.0's manual ,它说:

BN_bin2bn() converts the positive integer in big-endian form of length len at s into a BIGNUM and places it in ret. If ret is NULL, a new BIGNUM is created.

但是在下面的最小示例中:

#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 在调用 bin2bn() 之后再也不会是 nullptr

为什么 eccsig_r 仍然是 nullptr?我不明白这个。请指教。我在 Debian 9 .

PS:为了全面披露,您在上面看到的十六进制是我序列化的简单 ECC 签名。我不认为这对此有任何影响。如果我错了,请纠正我。

最佳答案

好的。我想我明白了。如果 retnullptr,则返回值 将在 bin2bn() 的返回值中创建一个新的 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
eccsig_r = BN_bin2bn(&out[1], 32, nullptr);
std::cout<<eccsig_r<<std::endl; // doesn't print zero anymore!
return 0;
}

如有错误请指正

关于c++ - OpenSSL:当输出指针为空时,BIGNUM 的 bin2bn 不会分配新的 BIGNUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49708857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com