Supporto per la libreria uFCoder Machine Readable Travel Documents (MRTD)
View Categories

Supporto per la libreria uFCoder Machine Readable Travel Documents (MRTD)

Introduzione #

Il supporto per la lettura di gruppi di dati dal tag NFC incorporato nei documenti di viaggio leggibili dalla macchina (MRTD), inclusi gli ePassport conformi alle specifiche ICAO, è stato implementato nella libreria uFCoder.

L'implementazione supporta il meccanismo BAC (Basic Access Control) per l'accesso al chip NFC. BAC consente l'autenticazione e un canale di comunicazione crittografico sicuro con un tag NFC incorporato nell'MRTD. BAC si basa esclusivamente sulla crittografia simmetrica utilizzando l'algoritmo 3DES ed è implementato secondo ICAO 9303, parte 11.

ICAO è l'acronimo di International Civil Aviation Organization (https://www.icao.int). La specifica ICAO 9303 standardizza gli MRTD, inclusi gli ePassports. È possibile trovare l'intera serie ICAO Doc 9303 su https://www.icao.int/publications/pages/publication.aspx?docnum=9303sito web.

MRTDs Basic Access Control è supportato nella libreria uFCoder dalla versione 5.0.12.

Per autenticarsi prima al tag NFC incorporato nell'MRTD, è necessario passare il numero del documento, la data di nascita del titolare del documento e la data di scadenza del documento per funzionare MRTD_MRZDataToMRZProtoKey() al fine di ottenere la "proto chiave" da cui verranno derivate altre chiavi di sicurezza necessarie. Tutti i dati necessari per ottenere la "proto key" (numero del documento, data di nascita del titolare del documento e data di scadenza del documento) sono codificati in Machine Readable Zone (MRZ) in modo che la libreria abbia MRTD_MRZSubjacentToMRZProtoKey () funzione che può essere chiamata invece di MRTD_MRZDataToMRZProtoKey (). Questa funzione accetta una stringa con terminazione null contenente una riga sujacent del documento MRZ.Lo screenshot qui sotto mostra un esempio di MRZ con una riga sottojacent contrassegnata quale contenuto devi passare come parametro per funzionare MRTD_MRZSubjacentToMRZProtoKey().

epassport MRZ

MrTD supporta le funzioni della libreria #

MRTD_MRZDataToMRZProtoKey #

Descrizione della funzione

Per ottenere mrZ Proto Key necessario nei passaggi successivi, è possibile chiamare questa funzione e passarle stringhe null-terminate contenenti numero di documento, data di nascita del titolare del documento e data di scadenza del documento. Dopo l'esecuzione corretta della funzione, MRZ Proto Key verrà memorizzato in un array mrz_proto_key a 25 byte.

Una dichiarazione di funzione (linguaggio C)

UFR_STATUS MRTD_MRZDataToMRZProtoKey(const char *doc_number,

const char *date_of_birth,

const char *date_of_expiry,

[25]uint8_t mrz_proto_key);

Parametri

doc_number Puntatore a una stringa con terminazione null contenente esattamente un numero di documento di 9 caratteri.
date_of_birth Puntatore a una stringa con terminazione null contenente esattamente 6 caratteri che rappresentano la data di nascita nel formato "AAMMGG".
date_of_expiry Puntatore a una stringa con terminazione null contenente esattamente 6 caratteri che rappresentano la data di scadenza nel formato "AAMMGG".
mrz_proto_key Questa matrice di byte conterrà la proto-chiave MRZ calcolata dopo l'esecuzione corretta della funzione. Questa matrice deve aver allocato almeno 25 byte prima di chiamare questa funzione.

 

MRTD_MRZSubjacentToMRZProtoKey #

Descrizione della funzione

Per ottenere la MRZ Proto Key necessaria nei passaggi successivi, nel caso del formato TD3 MRZ (88 caratteri totali), è possibile chiamare questa funzione e passarle una stringa con terminazione null contenente la riga mrZ subjacent. Un esempio del formato TD3 MRZ stampato sul documento eMRTD è simile al seguente:

P<UTOERIKSSON<<ANNA<MARIA<<<<<<<<<<<<<<<<<<<

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Questa funzione dovrebbe ricevere un puntatore a una stringa con terminazione null contenente la riga mrz subjacent, ad esempio "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

Dichiarazione di funzione (linguaggio C)

UFR_STATUS MRTD_MRZSubjacentToMRZProtoKey(const char *mrz, uint8_t mrz_proto_key[25]);

Parametri  
mrz · Puntatore a una stringa con terminazione null contenente dati MRZ. Secondo ICAO Doc 9303-10, dove ha tre formati di dati MRZ: TD1, TD2 o TD3. TD1 contiene esattamente 90 caratteri, TD2 contiene esattamente 72 caratteri e TD3 contiene esattamente 88 caratteri.
mrz_proto_key Questa matrice di byte conterrà la proto-chiave MRZ calcolata dopo l'esecuzione corretta della funzione. Questa matrice deve aver allocato almeno 25 byte prima di chiamare questa funzione.

MRTDAppSelectAndAuthenticateBac #

Descrizione della funzione

Utilizzare questa funzione per eseguire l'autenticazione al tag NFC eMRTD utilizzando BAC. Questa funzione stabilisce un canale sicuro per la comunicazione. Il canale di protezione viene gestito utilizzando il parametro send_sequence_cnt . Le chiavi di sessione del canale sono ksenc (per la crittografia) e ksmac (per il calcolo del MAC).

Dichiarazione di funzione (linguaggio C)

UFR_STATUS MRTDAppSelectAndAuthenticateBac(const uint8_t mrz_proto_key[25], uint8_t ksenc[16],

uint8_t ksmac[16],

uint64_t *send_sequence_cnt);

Parametri

mrz_proto_key Proto-chiave MRZ acquisita utilizzando la chiamata precedente a MRTD_MRZDataToMRZProtoKey() o MRTD_MRZSubjacentToMRZProtoKey() functio
ksenc Questa matrice deve aver allocato almeno 16 byte prima di chiamare questa funzione.Questa matrice conterrà la chiave di crittografia della sessione dopo l'esecuzione corretta della funzione
ksmac Questa matrice deve aver allocato almeno 16 byte prima di calli questa funzione.Questa matrice conterrà una chiave di sessione per il calcolo del MAC dopo l'esecuzione corretta della funzione.
send_sequence_cnt Dopo aver eseguito correttamente questa funzione, il puntatore a questo valore a 64 bit deve essere salvato e inoltrato ad ogni chiamata successiva a MRTDFileReadBacToHeap() e/o ad altre funzioni per la lettura di eMRTD

MRTDFileReadBacToHeap #

Descrizione della funzione

Utilizzare questa funzione per leggere i file dal tag NFC eMRTD. È possibile chiamare questa funzione solo dopo aver stabilito correttamente un canale di protezione dal precedentemente chiamato

Funzione MRTDAppSelectAndAuthenticateBac(). Le chiavi di sessione ksenc e ksmac, e anche i send_sequence_cnt dei parametri vengono acquisiti dal precedentemente chiamato

Funzione MRTDAppSelectAndAuthenticateBac(). Dopo la chiamata riuscita a questa funzione, *output punta ai dati del file letti da un file eMRTD specificato dal parametro file_index. Il buffer, in cui vengono archiviati i dati, viene automaticamente allocato nell'heap di memoria durante l'esecuzione della funzione. La quantità massima di dati allocati può essere di 32 KB. C'è la responsabilità del programmatore di ripulire i dati allocati (cioè chiamando free(), la funzione C standard) dopo l'uso.

Dichiarazione di funzione (linguaggio C)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **uscita,

uint32_t *output_length,

const uint8_t ksenc[16],

const uint8_t ksmac[16],

Parametri

file_index

Parametro che specifica il file che vogliamo leggere dall'eMRTD. Questo è un puntatore a una matrice di byte contiene esattamente due byte che designano il file eMRTD.Questi due byte sono l'identificazione dei file (FID) e c'è un elenco di FID:

EF.COM = {0x01, 0x1E}
Ef. DG1 = {0x01, 0x01}
Ef. DG2 = {0x01, 0x02}
Ef. DG3 = {0x01, 0x03}
Ef. DG4 = {0x01, 0x04}
Ef. DG5 = {0x01, 0x05}
Ef. DG6 = {0x01, 0x06}
Ef. DG7 = {0x01, 0x07}
Ef. DG8 = {0x01, 0x08}
Ef. DG9 = {0x01, 0x09}
Ef. DG10 = {0x01, 0x0A}
Ef. DG11 = {0x01, 0x0B}
Ef. DG12 = {0x01, 0x0C}
Ef. DG13 = {0x01, 0x0D}
Ef. DG14 = {0x01, 0x0E}
Ef. DG15 = {0x01, 0x0F}
Ef. DG16 = {0x01, 0x10}
Ef. SOD = {0x01, 0x1D}

*uscita Dopo la chiamata riuscita a questa funzione, questo puntatore punta ai dati del file letti da un file eMRTD specificato dal parametro file_index. Il buffer, in cui vengono memorizzati i dati, viene allocato automaticamente durante l'esecuzione della funzione. La quantità massima di dati allocati può essere di 32 KB. C'è la responsabilità del programmatore di ripulire i dati allocati (cioè chiamando free(), la funzione C standard) dopo l'uso.
output_length Dopo la chiamata riuscita a questa funzione, questo puntatore punta alla dimensione dei dati del file letti da un file eMRTD specificato dal parametro file_index.
ksenc Chiave di crittografia della sessione acquisita utilizzando una chiamata precedente alla funzione MRTDAppSelectAndAuthenticateBac().
ksmac Chiave di sessione per il calcolo del MAC acquisito utilizzando una chiamata precedente alla funzione MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt Questo puntatore deve puntare a un valore a 64 bit inizializzato dal valore precedente
chiamata riuscita alla funzione MRTDAppSelectAndAuthenticateBac(). Il puntatore a questo valore a 64 bit deve essere salvato e inoltrato ad ogni chiamata successiva a questa funzione e/o ad altre funzioni utilizzate per la lettura di eMRTD.

uint64_t *send_sequence_cnt);

 

Esempio di ePassport MRTD #

Questo esempio è possibile scaricare da:

https://code.d-logic.com/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

o clonare l'intero progetto CDT eclipse utilizzando:

git clone –https://code.d-logic.com/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git ricorsiva

comando.

Se si desidera eseguire solo rapidamente, scaricare il progetto e avviare l'eseguibile binario dalla cartella appropriata:

  • Per Windows a 32 bit, avviare il win32_releaserun_me.cmd
  • Per Windows a 64 bit, avviare il win64_releaserun_me.cmd
  • per un linux32_release/ePassport_mrtd Linux a 32 bit
  • per un avvio Linux a 64 bit linux64_release/ePassport_mrtd.

L'esempio di software richiede che il dispositivo di lettura uFR sia collegato e configurato al PC. Nessun'altra applicazione o servizio che utilizza il lettore uFR deve essere in esecuzione sul computer. Dopo l'avvio positivo dell'"esempio MRTD ePassport", il software avvia i principali come mostrato di seguito.

Lettore ePassport MRTD NFC

<">Ora, è necessario scegliere una delle opzioni 'M' o 'P' come indicato nelle istruzioni per l'uso dell'applicazione sullo schermo.

Se hai scelto l'opzione "M", ti verrà richiesto il testo:

Hai scelto di inserire la riga MRZ subjacent situata sotto 'P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<':

Immettere la riga MRZ adiacente. La riga MRZ adiacente deve essere lunga 44 caratteri.

quindi inserisci la riga MRZ subjacent. Un esempio della riga MRZ subjacent può vedere nella prima immagine.

Altrimenti, se hai scelto l'opzione "P", ti verrà richiesto del testo:

Hai scelto di inserire separatamente il numero doc, la data di nascita e la data di scadenza:

Immettere il numero del documento. Il numero del documento deve contenere 9 caratteri.

_________ …

Inserisci la data di nascita. Il formato della data deve essere AAMMGG.

______ …

Inserisci la data di scadenza. Il formato della data deve essere AAMMGG.

______ …

quindi inserisci i dati nel formato appropriato.

Dopo aver inserito i dati validi, l'applicazione ti informerà con un messaggio:

La proto-chiave MRZ è stata impostata correttamente.

——————————————————————-

Dopo questo messaggio, è possibile continuare con le operazioni di lettura sul tag NFC incorporato in ePassport a cui appartengono i dati immessi in precedenza.

Ora puoi mettere il passaporto nel campo del lettore uFR. In caso di comunicazione di successo stabilita, otterrai informazioni di base sul tag NFC nel campo del lettore. Per esempio:

——————————————————————-

Tipo di tag: DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:??:???

——————————————————————-

SAK e UID in questo esempio sono mascherati e possono avere qualsiasi valore arbitrario. Gli ePassports saranno sempre riconosciuti come DL_GENERIC_ISO14443_4 tipo di tag.

Ora puoi scegliere le opzioni di lettura dell'applicazione:

'C' – questa opzione legge i dati comuni (EF.COM file elementare) dall'ePassport. Dopo una lettura riuscita, i dati vengono analizzati e visualizzati nel formato seguente:

EF.COM è stato letto con successo. La lunghezza del file è ?? Byte

Dati grezzi: 60 xx xx xx xx xx xx xx xx xx xx

Analisi dei dati grezzi EF.COM:

La versione LDS è 01.07

La versione UNICODE è 04.00.00

Elenco dei gruppi di dati esistenti:

Trovato: EF. DG1 ·

Trovato: EF. DG2 ·

Trovato: EF. DG3 ·

Trovato: EF. DG14 ·

——————————————————————-

I dati non elaborati in questo esempio sono mascherati e possono avere qualsiasi valore arbitrario. Solo il tag di dati grezzi è stato presente e sarà sempre lo stesso (0x60). Quando leggi il tuo documento, otterrai i suoi dati grezzi effettivi qui. Maggiori informazioni sulla versione LDS e sulla versione UNICODE si possono leggere nel documento ICAO 9303, parte 10.

Le versioni LDS e UNICODE sono seguite dall'elenco dei gruppi di dati contenuti in ePassport. Solo la DG1 e la DG2 sono obbligatorie. Tutti gli altri gruppi di dati possono essere presenti o meno nella particolare MRTD.

'S' – questa opzione legge l'oggetto di protezione del documento (EF. SO elementary file) e lo salva nel file binario quale percorso e nome devi inserire quando richiesto. L'oggetto di protezione del documento contiene una firma digitale nel formato CMS PKCS#7 standard. Presenza dell'EF. SO sulla MRTD è obbligatorio.

D

'1'– questa opzione legge l'EF. DG1, analizzalo e visualizza i dati non elaborati e analizzati nel seguente formato:

Ef. DG1 è stato letto con successo. La lunghezza del file è ?? Byte

Dati grezzi:

61 xx xx xx xx xx xx xx xx xx xx xx xx

  1. xx xx xx xx xx xx xx xx xx xx xx xx xx xx  

Semplice analisi dell'EF. Dati grezzi della DG1:

Codice documento: P (ePassport)

Stato o organizzazione di emissione: ???

Nome del titolare: COGNOME FIRST_NAME

Numero del documento: ?????????

Nazionalità:???

Data di nascita (gg.MM.aaaa.): ??.??.????.

Sesso:????

Data di scadenza (gg.MM.aaaa): ??.??.????.

Dati facoltativi: ??????????????

——————————————————————-

I dati non elaborati in questo esempio sono mascherati e possono avere qualsiasi valore arbitrario. Solo il tag di dati grezzi è stato presente e sarà sempre lo stesso (0x61). Quando leggi il tuo documento, otterrai i suoi dati grezzi effettivi qui.

'2' – questa opzione legge l'EF. DG2 e salvarlo nel file binario quale percorso e nome è necessario immettere quando richiesto. Ef. DG2 contiene un'immagine facciale del titolare del documento ed è obbligatoria. Ef. DG2 accanto all'immagine facciale potrebbe contenere anche caratteristiche facciali biometriche. Maggiori informazioni su EF. Il contenuto della DG2 è leggibile nel documento ICAO 9303, parte 10.

'I' – questa opzione legge l'EF. DG2 a. In questo caso, solo l'immagine del volto viene estratta dal file MRTD e salvata nel file di cui hai inserito il percorso e il nome. Il formato dell'immagine viene rilevato automaticamente e l'estensione del file viene impostata in base ad esso. Ci sono due possibili formati di file immagine definiti per questo contesto: JPEG o JP2 (cioè .jpeg 2000).

'D' – questa opzione legge uno qualsiasi dei gruppi di dati elementari (EF. DG) dal MRTD e lo salva nel file binario quale percorso e nome è necessario inserire quando richiesto. Dopo aver scelto questa opzione, ti verrà richiesto EF. Indice DG. L'indice può essere compreso tra 1 e 16 (ad esempio 1 per EF. DG1 e 14 per EF. DG14). Il file elementare che si desidera leggere deve essere elencato nell'elenco dei gruppi di dati EF.COM.

La lettura di alcuni file elementari facoltativi, in particolare quelli contenenti dati biometrici, richiede speciali meccanismi di sicurezza che esulano dall'ambito di questo documento.

La versione corrente dell'"esempio MRTD ePassport" è 1.0 e dipende dalla libreria uFCoder versione 5.0.12 e dalla versione del firmware uFR 5.0.22.