Openssl EVP_DigestVerifyFinal始终返回0

Openssl EVP_DigestVerifyFinal始终返回0,openssl,Openssl,详情: 我正在使用openssl验证我们应用程序中的数字签名。 签名有效后,应继续完成安装。另一方面,如果签名无效,则应中止安装。我正在使用EVP_Verify*方法验证数字签名 EVP_VerifyFinal()方法失败,有效和无效签名都返回零(0)。 然后我知道EVP_Verify*方法已经被弃用,我们应该使用EVP_DigestVerify*方法 参考: 在用EVP_DigestVerify*方法替换EVP_Verify*方法之后,我仍然从EVP_DigestVerifyFinal()方

详情:

我正在使用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函数

请让我知道任何信息。谢谢你的回答

#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在这样传递哈希数据时是否存在任何问题?如果是,请建议我们处理此问题。