Симуляция вен завершает вызов функции openssl ECDSA_SIG_get0 - PullRequest
0 голосов
/ 28 марта 2019

Я использую виртуальную машину instant-veins-4-7-1-i1 в VirtualBox с Omnet++-5.3 и Sumo-0.32.0.

Я установил библиотеку openssl версии 1.1.0.Когда я пытаюсь получить доступ к структуре ECDSA_SIG, в которой хранится подпись с помощью функции 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, но ошибка продолжает возникать.

Что я делаю не так?

Спасибо

1 Ответ

2 голосов
/ 28 марта 2019

Ваша проблема не имеет ничего общего с openssl, но ваш код "C" и неправильное использование указателей.

Строка вашей проблемы:

signed_hash = ECDSA_do_sign(hash, 32, eckey);

Ваш код предполагает, что он изменяетУказатель в вызывающей функции это не так.Это только изменение «копии» указателя.Вы хотите либо вернуть указатель, либо передать указатель на указатель и установить его таким образом.

например,

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);
...