verificar el resumen firmado con clave privada usando un programa C

2

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?

    
pregunta Itay Sela 01.09.2015 - 10:12
fuente

0 respuestas

Lea otras preguntas en las etiquetas