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!