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!