Openssl EVP_DigestVerifyFinal始终返回0
详情: 我正在使用openssl验证我们应用程序中的数字签名。 签名有效后,应继续完成安装。另一方面,如果签名无效,则应中止安装。我正在使用EVP_Verify*方法验证数字签名 EVP_VerifyFinal()方法失败,有效和无效签名都返回零(0)。 然后我知道EVP_Verify*方法已经被弃用,我们应该使用EVP_DigestVerify*方法 参考: 在用EVP_DigestVerify*方法替换EVP_Verify*方法之后,我仍然从EVP_DigestVerifyFinal()方法中得到零(0)。我用有效签名和无效签名进行了测试,在这两种情况下都失败(即返回零(0)) 下面是我的代码片段。我每次都会收到verifySignature:verify_sha256 error, 具有有效或无效的签名文件 请参阅My_RsaSigVerify::verify_sha256函数 请让我知道任何信息。谢谢你的回答Openssl EVP_DigestVerifyFinal始终返回0,openssl,Openssl,详情: 我正在使用openssl验证我们应用程序中的数字签名。 签名有效后,应继续完成安装。另一方面,如果签名无效,则应中止安装。我正在使用EVP_Verify*方法验证数字签名 EVP_VerifyFinal()方法失败,有效和无效签名都返回零(0)。 然后我知道EVP_Verify*方法已经被弃用,我们应该使用EVP_DigestVerify*方法 参考: 在用EVP_DigestVerify*方法替换EVP_Verify*方法之后,我仍然从EVP_DigestVerifyFinal()方
#define DEFINE_RSA_SIGSIZE 256
#define R_ERROR_NONE 0
#define DEFINE_SHA256_LENGTH 32
My_RsaSigVerify::My_RsaSigVerify(const char *certfile) :
crypto_ctx_(NULL), cert_(NULL), pubkey_(NULL)
{
FILE *fp = NULL; // initialize by NULL
fp = fopen(certfile,"r");
crypto_ctx_ = EVP_MD_CTX_create();
cert_ = X509_new();
cert_ = PEM_read_X509(fp, NULL, NULL, NULL);
pubkey_ = X509_get_pubkey(cert_);
if(fp){
fclose(fp);
}
}
int My_RsaSigVerify::verify_sha256(unsigned char *hash, unsigned int
hsize, const char *sigfile)
{
int mes_ret = R_ERROR_NONE;
int result = R_ERROR_NONE;
FILE *fp = NULL;
int evp_dvi = R_ERROR_NONE;
int evp_dvu = R_ERROR_NONE;
int evp_dvf = R_ERROR_NONE;
if (!pubkey_ || !hash || !sigfile) {
printf( "My_RsaSigVerify:verify_sha256:NULL chk NG:%p:%p:%p\n",
pubkey_, hash, sigfile);
goto cleanup;
}
evp_dvi = EVP_DigestVerifyInit(crypto_ctx_, NULL, EVP_sha256(), NULL,
pubkey_);
if(1 != evp_dvi){
printf( "My_RsaSigVerify:verify_sha256:EVP_DigestVerifyInit
fails, return value=[%d]\n",evp_dvi);
result = evp_dvi;
goto cleanup;
}
fp = fopen(sigfile, "rb");
if (fp) {
unsigned char signature[DEFINE_RSA_SIGSIZE] = {0};
unsigned int sigsize = fread(signature, sizeof(unsigned char), DEFINE_RSA_SIGSIZE, fp);
if (!sigsize) {
printf( "My_RsaSigVerify:verify_sha256:fread err:%d\n", __LINE__);
goto cleanup;
}
evp_dvu = EVP_DigestVerifyUpdate(crypto_ctx_, hash, hsize);
if(1 != evp_dvu){
printf( "My_RsaSigVerify:verify_sha256:EVP_DigestVerifyUpdate fails, return value=[%d]\n",evp_dvu);
result = evp_dvu;
goto cleanup;
}
evp_dvf = EVP_DigestVerifyFinal(crypto_ctx_, signature, (size_t)sigsize);
if (1 != evp_dvf){
printf("My_RsaSigVerify:verify_sha256:EVP_DigestVerifyFinal fails, return value=[%d]\n",evp_dvf);
result = evp_dvf;
goto cleanup;
}
else{
printf("My_RsaSigVerify:verify_sha256:EVP_DigestVerifyFinal success, return value=[%d]\n",evp_dvf);
result = evp_dvf;
goto cleanup;
}
}
cleanup:
if (fp) {
fclose(fp);
}
printf( "My_RsaSigVerify:verify_sha256() end\n");
return result;
}
bool verifySignature(const char *file, const char* sigfile, const char*
certfile)
{
if ((!file)||(!sigfile)||(!certfile)) return false;
unsigned char buf[DEFINE_SHA256_LENGTH];
Hash hash;
if (hash.sha(file, buf, DEFINE_SHA256_LENGTH) != 0) {
printf( " verifySignature:sha256 error\n");
return false;
}
My_RsaSigVerify rsa(certfile);
if (rsa.verify_sha256(buf, DEFINE_SHA256_LENGTH, sigfile) != 1) {
printf( " verifySignature:verify_sha256 error\n");
return false;
}
return true;
}
这个问题与信息安全无关,因此我投票将其迁移到人们能够更好地提供答案的地方。我认为这是一个边缘问题。错误在于您显然计算了数据的散列,然后将该散列作为数据传递到
EVP_DigestVerifyUpdate
,作为验证过程的一部分对其进行第二次散列,导致不同且错误的值不匹配,因此无法验证。虽然该错误以代码表示,但可能反映了对所使用的安全原语的更抽象的误解。感谢您提供的信息声明。我们将进一步验证我们正在传递的数据。亲爱的Dave Thomson,我们也尝试了。但是EVP_DigestVerifyUpdate失败。请提供更多有关您所说信息的详细信息。签名验证流程如下。EVP_DigestInit EVP_DigestUpdate EVP_DigestFinal(ctx、hash和hashlen)->这里的散列数据是从EVP_DigestVerifyInit EVP_DigestVerifyUpdate(crypto_ctx,散列,hsize)获取的; 这里是传递数据的地方。EVP_DigestVerifyFinal这样传递散列数据有什么问题吗?如果有,请建议我们处理这个问题。这个问题与信息安全无关,因此我投票将它迁移到人们能够更好地提供答案的地方。我认为这是边缘问题。错误显然是您计算了数据的散列,然后将该散列作为数据传递到EVP_DigestVerifyUpdate
,作为验证过程的一部分对其进行第二次散列,导致不同且错误的值不匹配,因此无法验证。虽然该错误以代码表示,但可能反映了对所使用的安全原语的更抽象的误解。感谢您提供的信息声明。我们将进一步验证我们正在传递的数据。亲爱的Dave Thomson,我们也尝试了。但是EVP_DigestVerifyUpdate失败。请提供更多有关您所说信息的详细信息。签名验证流程如下。EVP_DigestInit EVP_DigestUpdate EVP_DigestFinal(ctx、hash和hashlen)->这里的散列数据是从EVP_DigestVerifyInit EVP_DigestVerifyUpdate(crypto_ctx,散列,hsize)获取的; 此处已传递数据。EVP_DigestVerifyFinal在这样传递哈希数据时是否存在任何问题?如果是,请建议我们处理此问题。