EVP_DigestVerifyFinal всегда возвращает 0 - PullRequest
1 голос
/ 09 октября 2019

Подробности:

Я использую 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;
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...