bool Verificador::verificarFirma(ParDeClaves& parDeClaves,const std::string& firma,std::istream& mensaje){ RSA* rsa = parDeClaves; EVP_PKEY* pk = EVP_PKEY_new(); EVP_MD_CTX ctx; EVP_PKEY_set1_RSA(pk,parDeClaves); EVP_MD_CTX_init(&ctx); M_EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_PAD_PKCS1/*EVP_MD_CTX_FLAG_PAD_X931*/); EVP_VerifyInit_ex(&ctx, EVP_get_digestbynid(NID_sha1), NULL); while(!mensaje.eof()){ unsigned char buffer[tamanio_de_buffer_default]; mensaje.read((char*)buffer,tamanio_de_buffer_default); EVP_VerifyUpdate(&ctx, buffer, mensaje.gcount()); mensaje.peek(); } int ok = EVP_VerifyFinal(&ctx, (unsigned char*)firma.c_str(), firma.size(), pk); EVP_MD_CTX_cleanup(&ctx); // El free esta en el constructor de ParDeClaves no puede // liberarse aca //FIPS_rsa_free(pk.pkey.rsa); EVP_PKEY_free(pk); return ok==1; }
/* The caller can assume that this removes any secret data from the context */ int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) { int ret; assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); ret=ctx->digest->final(ctx,md); if (size != NULL) *size=ctx->digest->md_size; if (ctx->digest->cleanup) { ctx->digest->cleanup(ctx); M_EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); } memset(ctx->md_data,0,ctx->digest->ctx_size); EVP_MD_CTX_cleanup(ctx); return ret; }
void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags) { M_EVP_MD_CTX_set_flags(&ctx->i_ctx, flags); M_EVP_MD_CTX_set_flags(&ctx->o_ctx, flags); M_EVP_MD_CTX_set_flags(&ctx->md_ctx, flags); }