Autenticarsi con un ePassport inviando una richiesta di 8 byte e ottenendo una firma ECDSA. Prima, ho letto la chiave pubblica da ePassport e poi l'ho usata per verificare la firma.
Ho letto la chiave pubblica da oPKEY
che è una matrice codificata 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);
quindi utilizzo EVP_DigestVerifyInit(ctx, NULL, md, NULL, pPubkey)
per leggere la chiave pubblica pPubkey
con md
come algoritmo di hash utilizzato.
Ecco la parte difficile:
Come faccio a sapere se prendere EVP_sha1()
, EVP_sha224()
ecc. come md
?
Ho due ePassports in cui la chiave pubblica codificata DER oKEY
ha la stessa lunghezza (311 byte) e anche la lunghezza della firma è la stessa (64 byte).
Ma uno solo verifica quando uso EVP_sha1()
in EVP_DigestVerifyInit()
e l'altro solo verifica quando utilizzo EVP_sha256()
.
Ho un terzo caso ma con un PublicKey lungo 279 byte. E quello ha bisogno di EVP_sha224()
per verificare.
C'è un modo per dire dalla chiave pubblica quale algoritmo hash usare?
Grazie!