Подробности:
Я использую openssl для проверки цифровой подписи в нашем приложении. Когда подпись действительна, она должна приступить к завершению установки. С другой стороны, в случае неверной подписи, установка должна быть прервана. Я использую методы EVP_Verify * для проверки цифровой подписи.
Ошибка метода EVP_VerifyFinal (), возвращающая ноль (0) для действительных и недействительных подписей. Тогда я узнал, что методы EVP_Verify * устарели, и мы должны использовать метод EVP_DigestVerify * Ссылка: https://www.openssl.org/docs/man1.1.0/man3/EVP_VerifyInit.html
После замены методов EVP_Verify * методами EVP_DigestVerify *, я все еще получаю ноль (0) из EVP_DigestVerifyFinal() метод. Я проверил как действительную подпись, так и недействительную подпись, в обоих случаях это не удается (т. Е. Возвращает ноль (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;
}