使用EVP库的openssl错误“EVP_DigestInit_ex:初始化错误”

时间:2017-09-30 14:01:02

标签: c++ openssl

我遇到openssl和EVP函数的问题: 当我执行以下代码时

#include <openssl/evp.h>
#include <openssl/engine.h>
#include <array>
#include <iostream>

void hash(ENGINE* eng) {
    EVP_MD_CTX *_mdctx(EVP_MD_CTX_create());
    int ret = EVP_DigestInit_ex(_mdctx, EVP_sha512(), eng);
    EVP_MD_CTX_destroy(_mdctx);
    if(1 == ret) { 
        std::cout << "Finished successfully (with eng=" << eng << ")" << std::endl;
        return;
    } else {
        std::array<char, 256> err_str;
        ERR_error_string_n(ERR_get_error(), err_str.data(), err_str.size());
        std::cout << "Error at Digest (engine: " << ENGINE_get_id(eng) << "): " << err_str.data() << std::endl;
    }
}

int main(void) {
    ENGINE_load_builtin_engines();

    hash(nullptr);
    for(ENGINE *eng = ENGINE_get_first(); eng != nullptr; eng = ENGINE_get_next(eng)) {
        hash(eng);
    }
}

我得到以下输出:

Finished successfully (with eng=0)
Error at Digest (engine: rdrand): error:260BA093:engine routines:ENGINE_get_digest:unimplemented digest
Error at Digest (engine: dynamic): error:06080086:digital envelope routines:EVP_DigestInit_ex:initialization error

据我所知,rdrand不支持摘要,但是当我使用动态引擎时,为什么会出现初始化错误?当我使用EVP_DigestInit_ex来呼叫eng=nullptr时,为什么会这样?

可以使用g++ example.cpp -std=c++17 -Wall -Wextra -Werror -pedantic -O2 -lssl -lcrypto编译代码。我使用的是g ++,版本6.3.0和openssl 1.1.0f。

0 个答案:

没有答案