我编写了一个函数,该函数应该通过打开文件并根据
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;
}
我和你有完全一样的问题。 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)
此外,我还有一些有趣的观察: