OpenSSL EVP_PKEY_verify() 返回 -1

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

我编写了一个函数,该函数应该通过打开文件并根据

unsigned char buff[]= "data";
检查签名来验证签名。 该函数返回-1,即

表示签名验证失败以外的错误

按照 evp_pkey_verify

这是什么错误?为什么那里没有进一步的文档?我发现如果函数返回函数描述中未描述的值,它就毫无用处。

bool verify_sig_of_buff(const string & pub_key_file_path, const unsigned char * buff, size_t buff_len, const string & sig){
    FILE * f = fopen(pub_key_file_path.c_str(), "r");
    EC_KEY *ec_key = PEM_read_EC_PUBKEY(f, NULL, NULL, NULL);
    fclose(f);


    EVP_PKEY * key = EVP_PKEY_new();
    assert(1==EVP_PKEY_assign_EC_KEY(key, ec_key));

    EVP_PKEY_CTX * key_ctx = EVP_PKEY_CTX_new(key,NULL);

    assert(1==EVP_PKEY_verify_init(key_ctx));
    assert(1==EVP_PKEY_CTX_set_signature_md(key_ctx, EVP_sha256()) );
    size_t sig_len=0;

    const int ret=EVP_PKEY_verify(key_ctx, (unsigned char * )&sig[0],sig.size(), buff , buff_len);

    EVP_PKEY_CTX_free(key_ctx);
    EVP_PKEY_free(key);

    cout<<ret<<endl;
    return ret;
}
c++ c openssl
1个回答
0
投票

我和你有完全一样的问题。 EVP_PKEY_verify 返回 -1。

我的功能与你的大致相同,除了我使用 std::vector 然后将其作为 .data() 传递给 EVP_PKEY_verify。

我已调用 Err_get_error() 来显示错误:

if (do_operation) { verification = EVP_PKEY_verify(ctx, signature.data(), signature.size(), digest.data(), digest.size()); } EVP_PKEY_CTX_free(ctx); if (verification == 1) { success = true; } else { unsigned long errCode = ERR_get_error(); char* err = ERR_error_string(errCode, NULL); std::cerr << "OpenSSL: message authentication failed: " << err << std::endl; }
这表明:

OpenSSL: message authentication failed: error:00000000:lib(0)::reason(0)
此外,我还有一些有趣的观察:

    我使用自己生成的 PK、消息、签名对该功能进行了单元测试。 => 函数通过测试,返回 1.
  1. 如果我稍微修改消息或签名,我会得到同样的错误。
  2. 我 99% 确定在处理真实数据时,我输入的消息和签名没问题,因为在此之前我使用它们进行另一个验证,这超出了这里的范围。
  3. 我出于同样的目的使用了 gnuTLS API。结果是完全相同的,调试和测试的数据相同。
这些经历让我做出以下主张:

    ossl 的 API(我正在使用 3+)以及 gnuTLS 按预期工作(顺便说一句,我什至不敢怀疑)
  1. 在处理真实数据时,您(和我)在消息或签名上遇到一些问题。
我陷入了僵局,因为我的案例中的消息和签名来自伽利略卫星,这大概也是没问题的。

© www.soinside.com 2019 - 2024. All rights reserved.