Online Store

biblioteca uFCoder Machine Readable Travel Documents (MRTD) suport

Introducere #

Suportul pentru citirea grupurilor de date din eticheta NFC încorporată în documentele de călătorie care pot fi citite automat (MRTD), inclusiv ePassporturile care respectă specificațiile OACI, a fost implementat în biblioteca uFCoder.

Implementarea acceptă mecanismul Basic Access Control (BAC) pentru accesul la cipurile NFC. BAC permite autentificarea și un canal securizat de comunicare criptografică cu o etichetă NFC încorporată în MRTD. BAC se bazează exclusiv pe criptografia simetrică folosind algoritmul 3DES și este implementat în conformitate cu OACI 9303, partea 11.

OACI reprezintă Organizația Aviației Civile Internaționale (https://www.icao.int). Specificațiile ICAO 9303 standardizează MRTD-urile, inclusiv ePassport-urile. Puteți găsi întreaga serie ICAO Doc 9303 pe https://www.icao.int/publications/pages/publication.aspx?docnum=9303locație web.

MRTDs Basic Access Control este acceptat în biblioteca uFCoder din versiunea 5.0.12.

Pentru a vă autentifica mai întâi la eticheta NFC încorporată în MRTD, trebuie să treceți mai întâi numărul documentului, data de naștere a titularului documentului și data de expirare a documentului pentru a funcționa MRTD_MRZDataToMRZProtoKey() pentru a obține "cheia proto" din care vor fi obținute alte chei de securitate necesare. Toate datele necesare pentru a obține "cheia proto" (numărul documentului, data nașterii titularului documentului și data de expirare a documentului) sunt codificate în Machine Readable Zone (MRZ), astfel încât biblioteca are funcția MRTD_MRZSubjacentToMRZProtoKey() care poate fi apelată în loc de MRTD_MRZDataToMRZProtoKey(). Această funcție acceptă un șir null-terminated care conține un rând subjacent al documentului MRZ.Captura de ecran de mai jos arată un exemplu de MRZ cu un rând subjacent marcat pe care conținutul trebuie să-l treceți ca parametru pentru a funcționa MRTD_MRZSubjacentToMRZProtoKey().

epassport MRZ

Funcțiile bibliotecii de asistență MRTD #

MRTD_MRZDataToMRZProtoKey #

Descrierea funcției

Pentru a obține MRZ Proto cheie necesare în pașii următori, puteți apela această funcție și treceți-l nul-reziliat șiruri care conțin numărul documentului, data de naștere a titularului documentului, și data de expirare a documentului. După executarea cu succes a funcției, MRZ Proto Key va fi stocat într-o matrice mrz_proto_key de 25 de octeți.

O declarație de funcție (limba 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);

Parametrii

doc_number Indicator către un șir null-terminated care conține exact 9 caractere numărul documentului.
date_of_birth Indicator către un șir nul care conține exact 6 caractere reprezentând data nașterii în formatul "YYMMDD".
date_of_expiry Indicator către un șir null-terminated care conține exact 6 caractere reprezentând data expirării în formatul "YYMMDD".
mrz_proto_key Această matrice de octeți va conține proto-cheie MRZ calculată după executarea cu succes a funcției. Această matrice trebuie să fi alocat cel puțin 25 de octeți înainte de a apela această funcție.

 

MRTD_MRZSubjacentToMRZProtoKey #

Descrierea funcției

Pentru a obține cheia MRZ Proto necesară în pașii următori, în cazul formatului TD3 MRZ (88 total caractere lungi), puteți apela această funcție și trece un șir null-terminated care conține rând subjacent MRZ. Un exemplu de format TD3 MRZ imprimat pe documentul eMRTD arată astfel:

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

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Această funcție ar trebui să primească un indicator pentru un șir null-terminated care conține rândul subjacent MRZ adică "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

Declarația funcției (limba C)

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

Parametrii  
MRZ Indicator către un șir null-terminated care conține date MRZ. Conform ICAO Doc 9303-10, unde are trei formate de date MRZ: formate TD1, TD2 sau TD3. TD1 conține exact 90 de caractere, TD2 conține exact 72 de caractere, iar TD3 conține exact 88 de caractere.
mrz_proto_key Această matrice de octeți va conține proto-cheie MRZ calculată după executarea cu succes a funcției. Această matrice trebuie să fi alocat cel puțin 25 de octeți înainte de apel această funcție.

MRTDAppSelectAndAuthenticateBac #

Descrierea funcției

Utilizați această funcție pentru a vă autentifica la eticheta eMRTD NFC utilizând BAC. Această funcție stabilește un canal securizat de comunicare. Canalul de securitate este menținut utilizând parametrul send_sequence_cnt . Cheile sesiunii canalului sunt ksenc (pentru criptare) și ksmac (pentru calcularea MAC).

Declarația funcției (limba C)

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

uint8_t ksmac[16],

uint64_t *send_sequence_cnt);

Parametrii

mrz_proto_key Mrz proto-cheie achizitionata prin apelul anterior la functio MRTD_MRZDataToMRZProtoKey() sau MRTD_MRZSubjacentToMRZProtoKey()
KSENC Această matrice trebuie să fi alocat cel puțin 16 octeți înainte de apel această funcție.Această matrice va conține cheia de criptare a sesiunii după executarea cu succes a funcției
KSMAC Această matrice trebuie să fi alocat cel puțin 16 octeți înainte de calli această funcție.Această matrice va conține o cheie de sesiune pentru calcularea MAC după executarea cu succes a funcției.
send_sequence_cnt După executarea cu succes a acestei funcții, indicatorul către această valoare pe 64 de biți trebuie salvat și redirecționat la fiecare apel ulterior la MRTDFileReadBacToHeap() și/sau alte funcții pentru citirea eMRTD

MRTDFileReadBacToHeap #

Descrierea funcției

Utilizați această funcție pentru a citi fișiere din eticheta NFC eMRTD. Puteți apela această funcție numai după ce ați stabilit cu succes un canal de securitate de către apelați anterior

Funcția MRTDAppSelectAndAuthenticateBac(). Tastele de sesiune ksenc și ksmac și, de asemenea, parametrul send_sequence_cnt sunt achiziționate de către numitul anterior

Funcția MRTDAppSelectAndAuthenticateBac(). După apelul cu succes la această funcție, *punctele de ieșire către datele fișierului citite dintr-un fișier eMRTD specificat de parametrul file_index. Tampon, în care datele sunt stocate, este alocat automat pe heap de memorie în timpul executării funcției. Cantitatea maximă de date alocate poate fi de 32KB. Există responsabilitatea programatorului de a curăța datele alocate (de exemplu, apelând gratuit (funcția standard C) după utilizare.

Declarația funcției (limba C)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **ieșire,

uint32_t * output_length,

const uint8_t ksenc[16],

const uint8_t ksmac[16],

Parametrii

file_index

Parametrul care specifică fișierul pe care dorim să-l citim din eMRTD. Acesta este un indicator pentru o matrice de octeți conține exact doi octeți care desemnează fișierul eMRTD.Cei doi octeți sunt de identificare a fișierelor (FID) și există o listă de FID-uri:

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}

*Ieşire După apelul cu succes la această funcție, acest indicator indică spre datele fișierului citite dintr-un fișier eMRTD specificat de parametrul file_index. Tamponul, în care sunt stocate datele, este alocat automat în timpul executării funcției. Cantitatea maximă de date alocate poate fi de 32KB. Există responsabilitatea programatorului de a curăța datele alocate (de exemplu, apelând gratuit (funcția standard C) după utilizare.
output_length După apelul cu succes la această funcție, acest indicator indică spre dimensiunea datelor de fișier citite dintr-un fișier eMRTD specificat de parametrul file_index.
KSENC Cheie de criptare a sesiunii achiziționată utilizând un apel anterior la funcția MRTDAppSelectAndAuthenticateBac().
KSMAC Cheia de sesiune pentru calcularea MAC achiziționată utilizând un apel anterior la funcția MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt Acest indicator ar trebui să indice spre o valoare de 64 de biți inițializată de anterior
apelați cu succes la funcția MRTDAppSelectAndAuthenticateBac(). Indicatorul pentru această valoare pe 64 de biți trebuie salvat și redirecționat la fiecare apel ulterior la această funcție și/sau la alte funcții utilizate pentru citirea eMRTD.

uint64_t *send_sequence_cnt);

 

Exemplu ePassport MRTD #

Acest exemplu îl puteți descărca de la:

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

sau clonați întregul proiect ECLIPSE CDT folosind:

clona git –https://www.d-logic.com/code/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git recursivă

comanda.

Dacă doriți doar rulare rapidă, descărcați proiectul și porniți executabilul binar din folderul corespunzător:

  • pentru un Windows pe 32 de biți porniți win32_releaserun_me.cmd
  • pentru un Windows pe 64 de biți porniți win64_releaserun_me.cmd
  • pentru un start Linux pe 32 de biți linux32_release / ePassport_mrtd
  • pentru un Linux pe 64 de biți începe linux64_release / ePassport_mrtd.

Exemplu de software necesită uFR reader dispozitiv pentru a fi atașat și configurat la PC-ul. Nicio altă aplicație sau serviciu care utilizează cititorul uFR nu ar trebui să ruleze pe computer. După începerea cu succes a "exemplului ePassport MRTD", software-ul pornește principalele multe așa cum se arată mai jos.

Cititor ePassport MRTD NFC

<">Now, ar trebui să alegeți una dintre opțiunile "M" sau "P", așa cum se menționează în instrucțiunile de utilizare a aplicației de pe ecran.

Dacă ați ales opțiunea "M", vi se va solicita text:

Ați ales să introduceți rândul MRZ subjacent situat sub "P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<":

Introduceți rândul MRZ subjacent. Rândul MRZ subjacent trebuie să aibă o lungime de 44 de caractere.

deci introduceți rândul MRZ subjacent. Un exemplu de rând MRZ subjacent poate vedea în prima imagine.

În caz contrar, dacă alegeți opțiunea "P", vi se va solicita text:

Ați ales să introduceți separat numărul documentului, data nașterii și data expirării:

Introduceți numărul documentului. Numărul documentului trebuie să aibă o lungime de 9 caractere.

_________ …

Introduceți data nașterii. Formatul datei trebuie să fie YYMMDD.

______ …

Introduceți data expirării. Formatul datei trebuie să fie YYMMDD.

______ …

astfel încât să introduceți datele în formatul corespunzător.

După ce ați introdus datele valide, aplicația vă va informa cu un mesaj:

Mrz proto-cheie a fost setat cu succes.

––––––––––––––––––––––-

După acest mesaj, puteți continua cu operațiunile de citire pe eticheta NFC încorporată în ePassport că datele pe care le-ați introdus anterior aparțin.

Acum puteți pune pașaportul în câmpul cititor uFR. La comunicarea de succes stabilită veți obține informații de bază despre eticheta NFC în câmpul cititor. De exemplu:

––––––––––––––––––––––-

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

––––––––––––––––––––––-

SAK și UID în acest exemplu sunt mascate și pot avea orice valoare arbitrară. ePassporturile vor fi întotdeauna recunoscute ca DL_GENERIC_ISO14443_4 tip de etichetă.

Acum puteți alege opțiunile de citire a aplicațiilor:

"C" – această opțiune citește date comune (EF.COM fișier elementar) din ePassport. După o citire reușită, datele sunt analizate și afișate în următorul format:

EF.COM a fost citit cu succes. Lungimea fișierului este ?? Octeţi

Date brute: 60 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx …

Analiza datelor brute EF.COM:

Versiunea LDS este 01.07

Versiunea UNICODE este 04.00.00

Lista grupurilor de date existente:

Găsit: EF. DIRECȚIA GENERALĂ1

Găsit: EF. DG2

Găsit: EF. DG3

Găsit: EF. DG14

––––––––––––––––––––––-

Datele brute din acest exemplu sunt mascate și pot avea orice valoare arbitrară. Numai eticheta de date brute a fost prezentă și va fi întotdeauna aceeași (0x60). Când citiți propriul document, veți obține datele sale brute reale aici. Mai multe despre versiunea LDS și versiunea UNICODE puteți citi în ICAO 9303, partea 10 document.

Versiunile LDS și UNICODE sunt urmate de lista grupurilor de date pe care le conține ePassport. Numai DG1 și DG2 sunt obligatorii. Toate celelalte grupuri de date pot fi prezente sau nu în MRTD-ul respectiv.

"S" – această opțiune citește obiectul de securitate al documentului (EF. SO fișier elementar) și îl salvează în fișierul binar care calea și numele trebuie să introduceți atunci când vi se solicită. Obiect de securitate document conține o semnătură digitală în formatul standard PKCS #7CMS. Prezența EF. Deci, pe MRTD este obligatorie.

D

"1"– această opțiune citește EF. DG1, analizați-o și afișează date brute și analizate în următorul format:

EF. DG1 a fost citită cu succes. Lungimea fișierului este ?? Octeţi

Date brute:

61 xx xx xx xx xx xx xx xx xx 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 xx xx  

Analiza simplă a EF. Date brute ale DG1:

Codul documentului: P (ePassport)

Statul sau organizația emitentă: ???

Numele titularului: NUME de familie FIRST_NAME

Numărul documentului: ?????????

Naționalitate:???

Data nașterii (zz.LL.aaaa.): ??.??.????.

Sex:????

Data expirării (zz.LL.aaaa.): ??.??.????.

Date opționale: ??????????????

––––––––––––––––––––––-

Datele brute din acest exemplu sunt mascate și pot avea orice valoare arbitrară. Numai eticheta de date brute a fost prezentă și va fi întotdeauna aceeași (0x61). Când citiți propriul document, veți obține datele sale brute reale aici.

"2" – această opțiune citește EF. DG2 și salvați-l în fișierul binar ce cale și nume trebuie să introduceți atunci când vi se solicită. EF. DG2 conține o imagine facială a titularului documentului și este obligatorie. EF. DG2 pe lângă imaginea facială ar putea conține și caracteristici faciale biometrice. Mai multe despre EF. Conținutul DG2 pe care îl puteți citi în documentul OACI 9303, partea 10.

"I" – această opțiune citește EF. DG2 către. În acest caz, numai imaginea facială este extrasă din fișierul MRTD și salvată în fișierul care cale și nume ați introdus. Formatul imaginii este detectat automat și extensia de fișier este setată în funcție de acesta. Există două formate de fișiere imagine posibile definite pentru acest context: JPEG sau JP2 (adică.jpeg 2000).

"D" – această opțiune citește oricare dintre grupurile de date elementare (EF. DG) fișiere din MRTD și îl salvează în fișierul binar ce cale și nume trebuie să introduceți atunci când vi se solicită. După ce această opțiune a fost aleasă, vi se va solicita EF. Indicele DG. Indicele poate fi cuprins între 1 și 16 (de exemplu, 1 pentru EF. DG1 și 14 pentru EF. DG14). Fișierul elementar pe care doriți să-l citiți trebuie să fie listat în lista EF.COM grupuri de date.

Citirea unor fișiere elementare opționale, în special a celor care conțin date biometrice, necesită mecanisme speciale de securitate care nu intră în domeniul de aplicare al acestui document.

Versiunea curentă a "exemplului ePassport MRTD" este 1.0 și depinde de versiunea bibliotecii uFCoder 5.0.12 și de versiunea de firmware uFR 5.0.22.