Explicaré todos los pasos que he hecho hasta ahora y concluiré con mi pregunta.
utilizando OpenSSL 1.0.1e-fips 11 de febrero de 2013
Generando una clave privada y pública
openssl genrsa -des3 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
firmar un mensaje con compendio y clave privada
openssl dgst -sha256 -sign private.pem -out message.secret message.txt
en este momento tengo una clave pública, un mensaje firmado (con un resumen) y el mensaje original.
Parte 1: uso de CLI (este funciona)
Al utilizar la CLI, puedo verificar el resumen:
openssl dgst -sha256 -verify public.pem -signature message.secret message.txt
Obtengo "Verified OK" como valor de retorno.
Parte 2: uso del programa C
Mi programa se ve así:
donde:
msg es message.txt
la firma es message.secret
pkey es la clave pública (obtenida usando PEM_read_PUBKEY)
int verify_it(const byte* msg, size_t msg_len, byte* signature, EVP_PKEY* pkey) {
EVP_MD_CTX *ctx;
size_t sig_len;
int bool_ret;
int ret_val;
ret_val = EXIT_SUCCESS;
ctx = NULL;
do
{
ctx = EVP_MD_CTX_create();
const EVP_MD* md = EVP_get_digestbyname( "SHA256" );
EVP_DigestInit_ex( ctx, md, NULL );
EVP_DigestVerifyInit( ctx, NULL, md, NULL, pkey );
EVP_DigestVerifyUpdate(ctx, msg, msg_len);
sig_len = 256;
if ( !EVP_DigestVerifyFinal( ctx, signature, sig_len )
ERR_print_errors_fp( stdout )
);
} while(0);
return ret_val;
}
este código devuelve un error de verificación (valor de 0).
también la función ERR_print_errors_fp (stdout) imprime el siguiente mensaje:
140332412258152:error:04091077:lib(4):func(145):reason(119):rsa_sign.c:176
EDIT
gracias a @deniss he logrado solucionar este problema (la longitud de la firma era mala, probablemente una firma media '\ 0', así que solo edito la longitud en 256)
pero ahora tengo otro problema -
140195987986280:error:04091068:lib(4):func(145):reason(104):rsa_sign.c:293
comprobándolo con openssl errstr tengo
error:04091068:rsa routines:INT_RSA_VERIFY:bad signature
la forma en que adquiero mi firma es así:
secret_fp = fopen( "message.secret", "rb" );
fseek( secret_fp, 0, SEEK_END );
file_len = ftell( secret_fp );
fseek( secret_fp, 0, SEEK_SET );
signature = malloc( file_len );
fread( signature, file_len, 1, secret_fp );
¿Alguna sugerencia?