Online Store

Unterstützung für maschinenlesbare Reisedokumente (MRTD) der uFCoder-Bibliothek

Einleitung #

Die Unterstützung für das Lesen von Datengruppen aus dem NFC-Tag, der in die maschinenlesbaren Reisedokumente (MRTDs) eingebettet ist, einschließlich ePassports, die den ICAO-Spezifikationen entsprechen, wurde in der uFCoder-Bibliothek implementiert.

Die Implementierung unterstützt den Basic Access Control (BAC)-Mechanismus für den NFC-Chip-Zugriff. BAC ermöglicht die Authentifizierung und einen sicheren kryptografischen Kommunikationskanal mit einem im MRTD eingebetteten NFC-Tag. BAC basiert rein auf symmetrischer Kryptographie unter Verwendung des 3DES-Algorithmus und ist gemäß ICAO 9303, Teil 11, implementiert.

ICAO steht für International Civil Aviation Organization (https://www.icao.int). Die ICAO 9303-Spezifikation standardisiert MRTDs, einschließlich ePassports. Sie finden die gesamte ICAO Doc 9303-Serie auf https://www.icao.int/publications/pages/publication.aspx?docnum=9303Website.

MRTDs Basic Access Control wird in der uFCoder-Bibliothek ab Version 5.0.12 unterstützt.

Um sich zuerst bei dem im MRTD eingebetteten NFC-Tag zu authentifizieren, müssen Sie die Dokumentnummer, das Geburtsdatum des Dokumenteninhabers und das Ablaufdatum des Dokuments MRTD_MRZDataToMRZProtoKey () übergeben, um den "Proto-Schlüssel" zu erhalten, von dem andere notwendige Sicherheitsschlüssel abgeleitet werden. Alle Daten, die benötigt werden, um "proto key" zu erhalten (Dokumentnummer, Geburtsdatum des Dokumentinhabers und Ablaufdatum des Dokuments), sind in der Machine Readable Zone (MRZ) codiert, so dass die Bibliothek über MRTD_MRZSubjacentToMRZProtoKey() -Funktion verfügt, die anstelle von MRTD_MRZDataToMRZProtoKey() aufgerufen werden kann. Diese Funktion akzeptiert eine nullterminierte Zeichenfolge, die eine untergeordnete Zeile des Dokument-MRZ enthält.Der folgende Screenshot zeigt ein Beispiel der MRZ mit einer markierten untergeordneten Zeile, deren Inhalt Sie als Parameter übergeben müssen, um MRTD_MRZSubjacentToMRZProtoKey() zu funktionieren.

epassport MRZ

Funktionen der MRTD-Unterstützungsbibliothek #

MRTD_MRZDataToMRZProtoKey #

Funktionsbeschreibung

Um den MRZ Proto-Schlüssel zu erhalten, der in den folgenden Schritten benötigt wird, können Sie diese Funktion aufrufen und nullterminierte Zeichenfolgen übergeben, die die Dokumentnummer, das Geburtsdatum des Dokumenthalters und das Ablaufdatum des Dokuments enthalten. Nach erfolgreicher Funktionsausführung wird MRZ Proto Key in einem mrz_proto_key 25-Byte-Array gespeichert.

Eine Funktionsdeklaration (C-Sprache)

UFR_STATUS MRTD_MRZDataToMRZProtoKey(const char *doc_number,

const char *date_of_birth

const char *date_of_expiry,

uint8_t mrz_proto_key[25]);

Parameter

doc_number Zeiger auf eine nullterminierte Zeichenfolge, die genau 9 Zeichen Dokumentnummer enthält.
date_of_birth Zeiger auf eine nullterminierte Zeichenfolge, die genau 6 Zeichen enthält, die das Geburtsdatum im Format "JJMMTT" darstellen.
date_of_expiry Zeiger auf eine mit Null abgeschlossene Zeichenfolge, die genau 6 Zeichen enthält, die das Ablaufdatum im Format "JJMMTT" darstellen.
mrz_proto_key Dieses Bytearray enthält nach erfolgreicher Funktionsausführung den berechneten MRZ-Protoschlüssel. Dieses Array muss vor dem Aufruf dieser Funktion mindestens 25 Byte zugewiesen haben.

 

MRTD_MRZSubjacentToMRZProtoKey #

Funktionsbeschreibung

Um den MRZ-Protoschlüssel zu erhalten, der in den folgenden Schritten benötigt wird, können Sie im Falle des TD3 MRZ-Formats (insgesamt 88 Zeichen lang) diese Funktion aufrufen und ihr eine nullterminierte Zeichenfolge übergeben, die eine MRZ-Unterzeile enthält. Ein Beispiel für das TD3 MRZ-Format, das auf dem eMRTD-Dokument gedruckt ist, sieht folgendermaßen aus:

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

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Diese Funktion sollte einen Zeiger auf eine nullterminierte Zeichenfolge erhalten, die die MRZ-Unterzeile enthält, d. h. "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

Funktionsdeklaration (Sprache C)

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

Parameter  
MRZ Zeiger auf eine nullterminierte Zeichenfolge, die MRZ-Daten enthält. Gemäß ICAO Doc 9303-10, wo es drei MRZ-Datenformate gibt: TD1-, TD2- oder TD3-Formate. TD1 enthält genau 90 Zeichen, TD2 enthält genau 72 Zeichen und TD3 enthält genau 88 Zeichen.
mrz_proto_key Dieses Bytearray enthält nach erfolgreicher Funktionsausführung den berechneten MRZ-Protoschlüssel. Dieses Array muss mindestens 25 Bytes zugewiesen haben, bevor diese Funktion aufgerufen wurde.

MRTDAppSelectAndAuthenticateBac #

Funktionsbeschreibung

Verwenden Sie diese Funktion, um sich mit BAC beim eMRTD-NFC-Tag zu authentifizieren. Diese Funktion schafft einen sicheren Kommunikationskanal. Der Sicherheitskanal wird mit dem Parameter send_sequence_cnt verwaltet. Die Kanalsitzungsschlüssel sind ksenc (für die Verschlüsselung) und ksmac (für die Berechnung von MAC).

Funktionsdeklaration (Sprache C)

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

uint8_t ksmac[16]

uint64_t *send_sequence_cnt);

Parameter

mrz_proto_key MRZ-Protoschlüssel, der mit dem vorherigen Aufruf der MRTD_MRZDataToMRZProtoKey()- oder MRTD_MRZSubjacentToMRZProtoKey()-Funktofunktion erworben wurde
ksenc Dieses Array muss mindestens 16 Bytes zugewiesen haben, bevor diese Funktion aufgerufen wurde.Dieses Array enthält nach erfolgreicher Funktionsausführung einen Sitzungsverschlüsselungsschlüssel.
ksmac Dieses Array muss vor dem Calli dieser Funktion mindestens 16 Bytes zugewiesen haben.Dieses Array enthält einen Sitzungsschlüssel zur Berechnung des MAC nach erfolgreicher Funktionsausführung.
send_sequence_cnt Nach erfolgreicher Ausführung dieser Funktion sollte der Zeiger auf diesen 64-Bit-Wert gespeichert und bei jedem nachfolgenden Aufruf an MRTDFileReadBacToHeap() und/oder andere Funktionen zum Lesen von eMRTD weitergeleitet werden.

MRTDFileReadBacToHeap #

Funktionsbeschreibung

Verwenden Sie diese Funktion, um Dateien vom eMRTD NFC-Tag zu lesen. Sie können diese Funktion erst aufrufen, nachdem Sie erfolgreich einen Sicherheitskanal durch den zuvor aufgerufenen

MRTDAppSelectAndAuthenticateBac()-Funktion. Sitzungsschlüssel ksenc und ksmac, sowie Parameter send_sequence_cnt werden von der zuvor aufgerufenen

MRTDAppSelectAndAuthenticateBac()-Funktion. Nach dem erfolgreichen Aufruf dieser Funktion verweist *output auf die Dateidaten, die aus einer durch den Parameter file_index angegebenen eMRTD-Datei gelesen wurden. Der Puffer, in dem die Daten gespeichert sind, wird während der Funktionsausführung automatisch auf dem Speicherheap zugewiesen. Die maximal zugewiesene Datenmenge kann 32 KB betragen. Es liegt in der Verantwortung des Programmierers, die zugewiesenen Daten nach der Verwendung zu bereinigen (d. h. durch Aufrufen von free(), der Standard-C-Funktion).

Funktionsdeklaration (Sprache C)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **Ausgang,

uint32_t *output_length,

Const uint8_t KSENC[16]

Const uint8_t KSMAC[16]

Parameter

file_index

Der Parameter, der die Datei angibt, die wir aus dem eMRTD lesen möchten. Dies ist ein Zeiger auf ein Bytearray, das genau zwei Bytes enthält, die die eMRTD-Datei bezeichnen.Diese beiden Bytes sind File Identification (FID) und es gibt eine Liste von FIDs:

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}

*Ausgabe Nach dem erfolgreichen Aufruf dieser Funktion verweist dieser Zeiger auf die Dateidaten, die aus einer eMRTD-Datei gelesen wurden, die durch den Parameter file_index angegeben wurde. Der Puffer, in dem die Daten gespeichert sind, wird während der Funktionsausführung automatisch zugewiesen. Die maximal zugewiesene Datenmenge kann 32 KB betragen. Es liegt in der Verantwortung des Programmierers, die zugewiesenen Daten nach der Verwendung zu bereinigen (d. h. durch Aufrufen von free(), der Standard-C-Funktion).
output_length Nach dem erfolgreichen Aufruf dieser Funktion zeigt dieser Zeiger auf die Größe der Dateidaten, die aus einer eMRTD-Datei gelesen werden, die durch den file_index-Parameter angegeben wird.
ksenc Sitzungsverschlüsselungsschlüssel, der mit einem vorherigen Aufruf der MRTDAppSelectAndAuthenticateBac()-Funktion erworben wurde.
ksmac Der Sitzungsschlüssel zur Berechnung des MAC, der mit einem vorherigen Aufruf der Funktion MRTDAppSelectAndAuthenticateBac() erworben wurde.
send_sequence_cnt Dieser Zeiger sollte auf einen 64-Bit-Wert verweisen, der von der vorherigen
erfolgreicher Aufruf der MRTDAppSelectAndAuthenticateBac()-Funktion. Der Zeiger auf diesen 64-Bit-Wert sollte gespeichert und bei jedem nachfolgenden Aufruf an diese Funktion und/oder andere Funktionen weitergeleitet werden, die zum Lesen von eMRTD verwendet werden.

uint64_t *send_sequence_cnt);

 

ePassport MRTD-Beispiel #

Dieses Beispiel können Sie herunterladen von:

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

oder klonen Sie das gesamte Eclipse CDT-Projekt mit:

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

Befehl.

Wenn Sie nur eine Schnellausführung wünschen, laden Sie das Projekt herunter und starten Sie die ausführbare Binärdatei aus dem entsprechenden Ordner:

  • Starten Sie für eine 32-Bit-Version von Windows die Datei win32_releaserun_me.cmd
  • Starten Sie für eine 64-Bit-Version von Windows die Datei win64_releaserun_me.cmd
  • für einen 32-Bit-Linux-Start linux32_release/ePassport_mrtd
  • für ein 64-Bit-Linux starten Sie linux64_release/ePassport_mrtd.

Für das Softwarebeispiel muss das uFR-Lesegerät an den PC angeschlossen und konfiguriert werden. Keine andere Anwendung oder kein anderer Dienst, der den uFR-Reader verwendet, sollte auf dem Computer ausgeführt werden. Nach dem erfolgreichen Start des "ePassport MRTD Example" startet die Software die wichtigsten vielen, wie unten gezeigt.

ePassport-Lesegerät MRTD NFC

<">Jetzt sollten Sie eine der Optionen "M" oder "P" auswählen, wie in den Anwendungsanweisungen auf dem Bildschirm angegeben.

Wenn Sie die Option "M" gewählt haben, werden Sie mit dem folgenden Text aufgefordert:

Sie haben sich entschieden, die untere MRZ-Zeile unter der Spalte "P<XXXNAME<<VORNAME<<<<<<<<<<<<<<<<<<<<<" einzugeben:

Geben Sie die untergeordnete MRZ-Zeile ein. Die untergeordnete MRZ-Zeile muss 44 Zeichen lang sein.

Geben Sie also die untergeordnete MRZ-Zeile ein. Ein Beispiel für die untergeordnete MRZ-Zeile ist im ersten Bild zu sehen.

Andernfalls, wenn Sie die Option "P" wählen, werden Sie mit Text aufgefordert:

Sie haben sich entschieden, die Dokumentnummer, das Geburtsdatum und das Ablaufdatum separat einzugeben:

Geben Sie die Belegnummer ein. Die Dokumentnummer sollte 9 Zeichen lang sein.

_________ …

Geben Sie das Geburtsdatum ein. Das Datumsformat muss JJMMTT sein.

______ …

Geben Sie das Ablaufdatum ein. Das Datumsformat muss JJMMTT sein.

______ …

Geben Sie also die Daten im entsprechenden Format ein.

Nachdem Sie die gültigen Daten eingegeben haben, informiert Sie die Anwendung mit einer Nachricht:

MRZ-Proto-Schlüssel wurde erfolgreich gesetzt.

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

Nach dieser Meldung können Sie mit den Lesevorgängen auf dem in ePassport eingebetteten NFC-Tag fortfahren, zu dem die zuvor eingegebenen Daten gehören.

Jetzt können Sie den Reisepass in das uFR-Lesefeld eingeben. Bei erfolgreicher Kommunikation erhalten Sie grundlegende Informationen über den NFC-Tag im Reader-Feld. Zum Beispiel:

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

Tag-Typ: DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:??:??:??

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

SAK und UID in diesem Beispiel sind maskiert und können einen beliebigen Wert haben. ePässe werden immer wie DL_GENERIC_ISO14443_4 Tag-Typ erkannt.

Jetzt können Sie Anwendungsleseoptionen auswählen:

'C' – diese Option liest gängige Daten (EF.COM elementare Datei) aus dem ePassport. Nach erfolgreichem Lesen werden die Daten analysiert und im folgenden Format angezeigt:

EF.COM wurde erfolgreich gelesen. Die Dateilänge ist ?? Bytes

Rohdaten: 60 xx xx xx xx xx xx xx xx xx xx xx xx xx …

Analysieren der EF.COM Rohdaten:

LDS-Version ist 01.07

UNICODE-Version ist 04.00.00

Liste der vorhandenen Datengruppen:

Gefunden: EF. GD 1

Gefunden: EF. GD 2

Gefunden: EF. DG3

Gefunden: EF. GD 14

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

Rohdaten in diesem Beispiel sind maskiert und können einen beliebigen Wert haben. Nur das Rohdaten-Tag war vorhanden und es wird immer dasselbe sein (0x60). Wenn Sie Ihr eigenes Dokument lesen, erhalten Sie hier die tatsächlichen Rohdaten. Mehr über die LDS-Version und die UNICODE-Version können Sie im Dokument ICAO 9303, Teil 10 nachlesen.

Auf die LDS- und UNICODE-Versionen folgt die Datengruppenliste, die ePassport enthält. Nur DG1 und DG2 sind obligatorisch. Alle anderen Datengruppen können entweder in der jeweiligen MRTD vorhanden sein oder nicht.

'S' – diese Option liest das Document Security Objekt (EF. SO elementare Datei) und speichert es in der Binärdatei, welchen Pfad und Namen Sie eingeben müssen, wenn Sie dazu aufgefordert werden. Das Document Security-Objekt enthält eine digitale Signatur im Standard-PKCS#7-CMS-Format. Anwesenheit des EF. SO auf der MRTD ist obligatorisch.

D

'1'– diese Option liest die EF. DG1, analysieren Sie es und zeigen Sie Roh- und analysierte Daten im folgenden Format an:

Ef. DG1 wurde erfolgreich gelesen. Dateilänge ist ?? Bytes

Rohdaten:

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

  1. xx xx xx xx xx xx xx xx xx xx xx …  

Einfaches Parsen des EF. DG1 Rohdaten:

Dokumentencode: P (ePassport)

Ausstellender Staat oder Organisation: ???

Name des Inhabers: NACHNAME FIRST_NAME

Dokumentnummer: ?????????

Nationalität:???

Geburtsdatum (tt.MM.jjjj.): ??.??.????.

Sex:????

Ablaufdatum (tt.MM.jjjj.): ??.??.????.

Optionale Daten: ??????????????

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

Rohdaten in diesem Beispiel sind maskiert und können einen beliebigen Wert haben. Nur das Rohdaten-Tag war vorhanden und es wird immer dasselbe sein (0x61). Wenn Sie Ihr eigenes Dokument lesen, erhalten Sie hier die tatsächlichen Rohdaten.

'2' – diese Option liest den EF. DG2 und speichern Sie es in der Binärdatei, welchen Pfad und Namen Sie eingeben müssen, wenn Sie dazu aufgefordert werden. Ef. DG2 enthält ein Gesichtsbild des Dokumentenhalters und ist obligatorisch. Ef. DG2 könnte neben dem Gesichtsbild auch biometrische Gesichtszüge enthalten. Mehr über EF. DG2-Inhalte können Sie im Dokument ICAO 9303, Teil 10, nachlesen.

'I' – diese Option liest die EF. DG2 an. In diesem Fall wird nur das Gesichtsbild aus der MRTD-Datei extrahiert und in der Datei gespeichert, welchen Pfad und Namen Sie eingegeben haben. Das Bildformat wird automatisch erkannt und die Dateierweiterung entsprechend gesetzt. Für diesen Zusammenhang sind zwei mögliche Bilddateiformate definiert: JPEG oder JP2 (d.h.jpeg 2000).

'D' – diese Option liest jede der elementaren Datengruppen (EF. DG) Dateien aus dem MRTD und speichert es in der Binärdatei, welchen Pfad und Namen Sie eingeben müssen, wenn Sie dazu aufgefordert werden. Nachdem diese Option ausgewählt wurde, werden Sie zur Eingabe von EF aufgefordert. GD Index. Der Index kann im Bereich von 1 bis 16 liegen (z.B. 1 für EF. GD 1 und 14 für EF. GD 14). Die elementare Datei, die Sie lesen wollten, muss in der EF.COM Datengruppenliste aufgeführt sein.

Das Lesen einiger optionaler elementarer Dateien, insbesondere solcher, die biometrische Daten enthalten, erfordert spezielle Sicherheitsmechanismen, die außerhalb des Rahmens dieses Dokuments liegen.

Die aktuelle Version des "ePassport MRTD Example" ist 1.0 und hängt von der uFCoder-Bibliotheksversion 5.0.12 und der uFR-Firmware-Version 5.0.22 ab.