Sto facendo l'autenticazione attiva di ePassports secondo lo standard ICAO 9303 (parte 11).
- Invia una sfida al chip, il chip lo firma usando la sua chiave privata (memorizzata all'interno del chip, non leggibile)
- Il chip invia la sigla.
- Quindi verifica la firma utilizzando la chiave pubblica (può essere letta dal chip)
Esistono due possibili algoritmi di firma: RSA (RSA-SHA1, RSA-PSS, RSA-SHA224, RSA-SHA256, RSA-SHA512) e ECDSA.
Nella sezione 6.1.2.3 di ICAO9303 parte 11 si legge su ECDSA: "Per ECDSA, il formato di firma semplice in base a TR-03111 DEVE essere utilizzato. Solo le prime curve con non compresso i punti DEVONO essere usati. Un algoritmo di hash, la cui lunghezza di uscita è della stessa lunghezza o inferiore alla lunghezza del Utilizzare la chiave ECDSA. "
Quello che non capisco è come utilizzare la firma ECDSA in questo formato normale con OpenSSL?
Nel seguente codice EVP_DigestVerifyFinal
restituisce -1. Come posso portare la firma oSIG
dal formato normale al formato DER?
bool doAA(std::vector<unsigned char> oRND, std::vector<unsigned char> oSIG, std::vector<unsigned char> oPKEY)
{
EVP_PKEY* m_pPubkey;
BIO* keyBio = BIO_new_mem_buf(&oPKEY[0], (int)oPKEY.size());
m_pPubkey = d2i_PUBKEY_bio(keyBio, NULL);
BIO_free(keyBio);
if (NULL == m_pPubkey)
{
std::cout << "Error Public key is NULL" << std::endl;
return false;
}
// check if ECDSA signature and then verify
int nRes = 0;
int type = EVP_PKEY_base_id(m_pPubkey);
if (type == EVP_PKEY_EC)
{
EVP_MD_CTX* ctx = EVP_MD_CTX_create();
nRes = EVP_DigestVerifyInit(ctx, NULL, EVP_sha1(), NULL, m_pPubkey);
if (1 != nRes)
{
EVP_MD_CTX_cleanup(ctx);
std::cout << "Error EVP_DigestVerifyInit" << std::endl;
return false;
}
nRes = EVP_DigestVerifyUpdate(ctx, &oRND[0], oRND.size());
if (1 != nRes)
{
EVP_MD_CTX_cleanup(ctx);
std::cout << "Error EVP_DigestVerifyUpdate" << std::endl;
return false;
}
nRes = EVP_DigestVerifyFinal(ctx, &oSIG[0], oSIG.size());
EVP_MD_CTX_cleanup(ctx);
if (nRes < 0)
{
std::cout << "Error EVP_DigestVerifyFinal failed" << std::endl;
return false;
}
else if (nRes == 0)
{
std::cout << "Error EVP_DigestVerifyFinal: Signature could not be verified" << std::endl;
return false;
}
}
else
{
std::cout << "Not a ECDSA Signature" << std::endl;
return false;
}
return nRes == 1;
}
EDIT: questo è l'errore che ottengo: error:0D07207B:lib(13):func(114):reason(123)