C++ 静脉模拟终止调用openssl ECDSA_SIG_get0函数

C++ 静脉模拟终止调用openssl ECDSA_SIG_get0函数,c++,openssl,omnet++,veins,ecdsa,C++,Openssl,Omnet++,Veins,Ecdsa,我正在使用带有Omnet++-5.3和Sumo-0.32.0的VirtualBox上的虚拟机 我已经安装了库openssl1.1.0版。当我尝试访问使用函数ECDSA\u SIG\u get0存储签名的结构时,模拟突然终止,出现以下错误 这是生成错误的代码片段: ECDSA_SIG * signed_hash; s->generateSignature(message, messageLength, signed_hash); const BIGNUM **pr; const BIGNU

我正在使用带有Omnet++-5.3和Sumo-0.32.0的VirtualBox上的虚拟机

我已经安装了库
openssl
1.1.0版。当我尝试访问使用函数
ECDSA\u SIG\u get0
存储签名的结构时,模拟突然终止,出现以下错误

这是生成错误的代码片段:

ECDSA_SIG * signed_hash;
s->generateSignature(message, messageLength, signed_hash);
const BIGNUM **pr;
const BIGNUM **ps;
ECDSA_SIG_get0(signed_hash, pr, ps);
generateSignature
功能代码为:

void SignatureOpenSSL::generateSignature(const unsigned char* message, int messageLength, ECDSA_SIG * signed_hash)
{

    unsigned char *md;
    unsigned char *hash;
    hash = SHA256(message, messageLength, md);

    // Computes the ECDSA signature of the given message using the supplied private key and returns the created signature
    signed_hash = ECDSA_do_sign(hash, 32, eckey);

    if (signed_hash == NULL){
        std::cout <<" ko signature " << std::endl;
    }else{
        std::cout <<" ok signature" << std::endl;
    }

}
void signaturepenssl::generateSignature(const unsigned char*message、int messageLength、ECDSA_SIG*signed\u hash)
{
无符号字符*md;
无符号字符*散列;
hash=SHA256(消息,消息长度,md);
//使用提供的私钥计算给定消息的ECDSA签名,并返回创建的签名
signed_hash=ECDSA_do_sign(hash,32,eckey);
if(带符号的_散列==NULL){

std::cout您的问题与openssl无关,而是您的“C”代码和指针的滥用

你的问题是:

signed_hash = ECDSA_do_sign(hash, 32, eckey);
您的代码假定它正在更改调用函数中的指针,但事实并非如此。它只是在更改指针的“副本”。您希望返回指针或将指针传递给指针,并以这种方式进行设置

e、 g

void signaturepenssl::generateSignature(const unsigned char*message,int messageLength,ECDSA_SIG**signed_hash)
{
...
*signed_hash=ECDSA_do_sign(hash,32,eckey);
if(*带符号的_散列==NULL){

std::cout您的问题与openssl无关,而是您的“C”代码和指针的滥用

你的问题是:

signed_hash = ECDSA_do_sign(hash, 32, eckey);
您的代码假定它正在更改调用函数中的指针,但事实并非如此。它只是在更改指针的“副本”。您希望返回指针或将指针传递给指针,并以这种方式进行设置

e、 g

void signaturepenssl::generateSignature(const unsigned char*message,int messageLength,ECDSA_SIG**signed_hash)
{
...
*signed_hash=ECDSA_do_sign(hash,32,eckey);
if(*带符号的_散列==NULL){

std::我不能谢谢你。我使用了第二种解决方案。在本例中,调用函数
ECDSA\u SIG\u get0的正确方法是
ECDSA\u SIG\u get0(signed\u hash,&pr,&ps);
。对吗?谢谢。我使用了第二种解决方案。在本例中,调用函数
ECDSA\u SIG\u get0的正确方法是
ECDSA\u SIG\u get0(签名为“\u hash,&pr,&ps);
。对吗?
void SignatureOpenSSL::generateSignature(const unsigned char* message, int messageLength, ECDSA_SIG ** signed_hash)
{
    ...
    *signed_hash = ECDSA_do_sign(hash, 32, eckey);

    if (*signed_hash == NULL){
        std::cout <<" ko signature " << std::endl;
    }else{
        std::cout <<" ok signature" << std::endl;
    }
}

ECDSA_SIG * signed_hash;
s->generateSignature(message, messageLength, &signed_hash);