Me autentico con un pasaporte electrónico enviando un desafío de 8 bytes y obteniendo una firma ECDSA. Antes, leí la clave pública del pasaporte electrónico y luego la uso para verificar la firma.
Leí la clave pública de oPKEY que es una matriz codificada DER ( {0x30, 0x82, 0x01, 0x33, 0x30, 0x81, 0xec, 0x06, 0x07, 0x2a, ... )
EVP_PKEY* pPubkey;
BIO* keyBio = BIO_new_mem_buf(&oPKEY[0], (int)oPKEY.size());
pPubkey = d2i_PUBKEY_bio(keyBio, NULL);
BIO_free(keyBio);
luego uso EVP_DigestVerifyInit(ctx, NULL, md, NULL, pPubkey) para leer la clave pública pPubkey y md es el algoritmo hash utilizado.
Aquí está la parte difícil:
¿Cómo puedo saber si debo tomar EVP_sha1() , EVP_sha224() etc. como md ?
Tengo dos pasaportes electrónicos en los que la clave pública codificada en DER oKEY es de la misma longitud (311 bytes) y también la longitud de la firma es la misma (64 bytes).
Pero uno de ellos solo verifica cuando uso EVP_sha1() en EVP_DigestVerifyInit() y el otro solo verifica cuando uso EVP_sha256() .
Tengo un tercer caso, pero con un PublicKey de 279 bytes de longitud. Y ese uno necesita EVP_sha224() para verificar.
¿Hay alguna forma de saber a partir de la clave pública qué algoritmo hash usar?
¡Gracias!