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

问题描述 投票:0回答:1

我在VirtualBox上使用虚拟机instant-veins-4-7-1-i1Omnet++-5.3Sumo-0.32.0

我已经安装了库openssl 1.1.0版。当我尝试访问使用函数ECDSA_SIG存储签名的struct ECDSA_SIG_get0时,模拟突然终止,出现以下错误

enter image description here

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

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;
    }

}

我已将openssl库升级到1.1.1版,但错误仍在继续。

我究竟做错了什么?

谢谢

c++ openssl omnet++ veins ecdsa
1个回答
2
投票

你的问题与openssl无关,而是你的“C”代码和你滥用指针。

你的问题是:

signed_hash = ECDSA_do_sign(hash, 32, eckey);

你的代码假定它正在改变调用函数中的指针,但事实并非如此。它只是改变了指针的“副本”。您想要返回指针或传入指向指针的指针并将其设置为该方式。

EG

ECDSA_SIG *SignatureOpenSSL::generateSignature(const unsigned char* message, int messageLength)
{
    ...
    ECDSA_SIG *  signed_hash = ECDSA_do_sign(hash, 32, eckey);
    ...
    return signed_hash;
}


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

要么

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);
© www.soinside.com 2019 - 2024. All rights reserved.