# Pastebin TqXyQhki int verify_signature_hash(const unsigned char *data, int length_data, const unsigned char* signature, int length_signature, const char * public_key){ unsigned char* base64_decoded_signature; size_t base64_decoded_signature_length; int authentic; int result = 0; EVP_PKEY *pkey; BIO* certbio = NULL; X509* cert = NULL; int ret; ERR_load_BIO_strings(); ERR_load_crypto_strings(); certbio = BIO_new(BIO_s_file()); ret = BIO_read_filename(certbio, public_key); if (!(cert = PEM_read_bio_X509(certbio, NULL, 0, NULL))) { exit(-1); } if ((pkey = X509_get_pubkey(cert)) == NULL) printf("Error getting public key from certificate"); if (pkey) { switch (pkey->type) { case EVP_PKEY_RSA: printf("%d bit RSA Key\n\n", EVP_PKEY_bits(pkey)); break; case EVP_PKEY_DSA: printf("%d bit DSA Key\n\n", EVP_PKEY_bits(pkey)); break; default: printf("%d bit non-RSA/DSA Key\n\n", EVP_PKEY_bits(pkey)); break; } } base64_decoded_signature_length = base64Decode(signature, length_signature, &base64_decoded_signature); //openPublicRSAKey(pkey, public_key); EVP_MD_CTX* m_RSAVerifyCtx = EVP_MD_CTX_create(); const EVP_MD *md = EVP_sha256(); EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, NULL); if (1 != EVP_DigestVerifyInit(m_RSAVerifyCtx, pkey_ctx, md,NULL, pkey)) { handleErrors(); } if (1 != EVP_PKEY_CTX_set_rsa_padding(m_RSAVerifyCtx->pctx, RSA_PKCS1_PADDING)){ handleErrors(); } if (1 != EVP_DigestVerifyUpdate(m_RSAVerifyCtx, data, length_data)) { handleErrors(); } if(1 != EVP_DigestVerifyFinal(m_RSAVerifyCtx, base64_decoded_signature, base64_decoded_signature_length)){ handleErrors(); } X509_free(cert); BIO_free_all(certbio); EVP_MD_CTX_destroy(m_RSAVerifyCtx); EVP_cleanup(); return 1; }