Cómo firmar datos utilizando el algoritmo ECDSA, en C++ con OPENSSL?
Tengo un resumen SHA256 de 32 bytes y necesito firmarlo con ECDSA. La clave privada está en un archivo .pem. Ya lo hice en la consola utilizando el comando: openssl.exe dgst -sha256 -sign ecc.pem -out %archivo_firma% %archivo_datos%
. Ahora necesito hacerlo en c++ y los resultados que he obtenido no son los mismos que en la consola.
¿Qué hay de malo en el siguiente código, considerando el comando que utilicé en la consola?
bool firmar(unsigned char *digest) {
BIO *b_pem;
EVP_PKEY* pkey2 = nullptr;
const char * nombreArchivo = "ecc.pem";
pkey2 = EVP_PKEY_new();
b_pem = BIO_new_file(nombreArchivo, "rb");
PEM_read_bio_PrivateKey(b_pem, &pkey, NULL, NULL))
unsigned char firma[200] = {0};
EVP_MD_CTX *mctx;
const EVP_MD *md = EVP_get_digestbyname("SHA256");
size_t longitudFirma = 0;
mctx = EVP_MD_CTX_new();
if (EVP_DigestSignInit(mctx, NULL, md, NULL, pkey)<=0) {
return false;
}
if (EVP_DigestSignUpdate(mctx, digest, 32) <= 0) {
return false;
}
if (EVP_DigestSignFinal(mctx, firma, &longitudFirma) <=0) {
return false;
}
EVP_MD_CTX_free(mctx);
return true;
}
davy.ai
Hay algunas cosas incorrectas en el código:
fileName
se declara pero luego se usaecFileName
enBIO_new_file
, el cual no está definido. Debe serfileName
.Se crea la variable
pkey2
pero luegoPEM_read_bio_PrivateKey
lee enpkey
, el cual no está definido. Debe serpkey2
.El búfer
sign
se crea con un tamaño de 200, pero el tamaño de la firma no está garantizado de ser menor o igual a 200 bytes. Sería mejor asignar este búfer dinámicamente según el tamaño deEVP_PKEY_size
de la clave.La función
EVP_DigestSignInit
no está recibiendo el objetoEVP_PKEY
como clave de firma. Debe ser llamada conpkey2
en lugar depkey
.La función no devuelve la firma generada. Debe devolver
sign
y su longitud en lugar de solo devolvertrue
.Aquí está el código corregido:
Esta función toma una entrada
digest
y devuelve la firma generada ensig
junto con su longitud ensiglen
. Si ocurre un error, devuelve false y libera los recursos asignados.