Online Store

ondersteuning voor uFCoder-bibliotheek MRTD (Machine Readable Travel Documents)

Inleiding #

Ondersteuning voor het lezen van gegevensgroepen van de NFC-tag die is ingesloten in de Machine Readable Travel Documents (MRTD's), inclusief ePassports die voldoen aan ICAO-specificaties, is geïmplementeerd in de uFCoder-bibliotheek.

De implementatie ondersteunt het Basic Access Control (BAC) mechanisme voor NFC-chiptoegang. BAC maakt authenticatie en een veilig cryptografisch communicatiekanaal mogelijk met een NFC-tag ingebed in de MRTD. BAC is puur gebaseerd op symmetrische cryptografie met behulp van het 3DES-algoritme en het is geïmplementeerd volgens ICAO 9303, deel 11.

ICAO staat voor International Civil Aviation Organization (https://www.icao.int). De ICAO 9303-specificatie standaardiseert MRTD's, inclusief ePassports. U kunt de volledige ICAO Doc 9303-serie vinden op https://www.icao.int/publications/pages/publication.aspx?docnum=9303weblocatie.

MRTDs Basic Access Control wordt ondersteund in de uFCoder-bibliotheek vanaf versie 5.0.12.

Om u eerst te verifiëren bij de NFC-tag die is ingesloten in de MRTD, moet u het documentnummer, de geboortedatum van de documenthouder en de vervaldatum van het document doorgeven om MRTD_MRZDataToMRZProtoKey() te functioneren om de "protosleutel" te krijgen waaruit andere noodzakelijke beveiligingssleutels worden afgeleid. Alle gegevens die nodig zijn om de "protosleutel" (documentnummer, de geboortedatum van de documenthouder en de vervaldatum van het document) te krijgen, worden gecodeerd in MRZ (Machine Readable Zone), zodat de bibliotheek MRTD_MRZSubjacentToMRZProtoKey() functie heeft die kan worden aangeroepen in plaats van MRTD_MRZDataToMRZProtoKey(). Deze functie accepteert een null-beëindigde tekenreeks met een subjacente rij van het document MRZ.De onderstaande schermafbeelding toont een voorbeeld van de MRZ met een gemarkeerde subjacentrij welke inhoud u als parameter moet doorgeven om te functioneren MRTD_MRZSubjacentToMRZProtoKey().

EPASSPORT MRZ

MRTD-ondersteuning bibliotheekfuncties #

MRTD_MRZDataToMRZProtoKey #

Functieomschrijving

Om mrz-protosleutel te krijgen die nodig is in volgende stappen, kunt u deze functie aanroepen en deze null-beëindigde tekenreeksen doorgeven met documentnummer, geboortedatum van documenthouder en vervaldatum van het document. Na succesvolle uitvoering van de functie wordt de MRZ-protosleutel opgeslagen in een mrz_proto_key array van 25 bytes.

Een functiedeclaratie (C-taal)

UFR_STATUS MRTD_MRZDataToMRZProtoKey(const char *doc_number,

const char *date_of_birth,

const char *date_of_expiry,

[25]uint8_t mrz_proto_key);

Parameters

doc_number Wijs naar een null-beëindigde tekenreeks met een documentnummer van precies 9 tekens.
date_of_birth Wijs naar een null-beëindigde tekenreeks met precies 6 tekens die de geboortedatum vertegenwoordigen in de indeling "YYMMDD".
date_of_expiry Wijs naar een null-beëindigde tekenreeks met precies 6 tekens die de vervaldatum vertegenwoordigen in de indeling "YYMMDD".
mrz_proto_key Deze bytearray bevat de berekende MRZ-protosleutel na succesvolle functie-uitvoering. Deze array moet ten minste 25 bytes hebben toegewezen voordat deze functie wordt aangeroepen.

 

MRTD_MRZSubjacentToMRZProtoKey #

Functieomschrijving

Om de MRZ-protosleutel te krijgen die nodig is in volgende stappen, in het geval van het TD3 MRZ-formaat (88 tekens lang), kunt u deze functie aanroepen en deze een null-beëindigde tekenreeks met MRZ-subjacentrij doorgeven. Een voorbeeld van de TD3 MRZ-indeling die op het eMRTD-document is afgedrukt, ziet er als volgt uit:

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

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Deze functie moet een aanwijzer ontvangen naar een null-beëindigde tekenreeks met mrz-subjacentrij, d.w.z. "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

Functiedeclaratie (C-taal)

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

Parameters  
Mrz Aanwijzer naar een null-beëindigde tekenreeks die MRZ-gegevens bevat. Volgens ICAO Doc 9303-10, waar het drie MRZ-gegevensindelingen heeft: TD1-, TD2- of TD3-indelingen. TD1 bevat precies 90 tekens, TD2 bevat precies 72 tekens en TD3 bevat precies 88 tekens.
mrz_proto_key Deze bytearray bevat de berekende MRZ-protosleutel na succesvolle functie-uitvoering. Deze array moet ten minste 25 bytes hebben toegewezen voordat u deze functie aanroept.

MRTDAppSelectAndAuthenticateBac #

Functieomschrijving

Gebruik deze functie om te verifiëren bij de eMRTD NFC-tag met BAC. Deze functie zorgt voor een veilig communicatiekanaal. Het beveiligingskanaal wordt onderhouden met behulp van de parameter send_sequence_cnt . De kanaalsessiesleutels zijn ksenc (voor codering) en ksmac (voor het berekenen van MAC).

Functiedeclaratie (C-taal)

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

uint8_t ksmac[16],

uint64_t *send_sequence_cnt);

Parameters

mrz_proto_key MRZ proto-sleutel verkregen door de voorafgaande aanroep naar MRTD_MRZDataToMRZProtoKey() of MRTD_MRZSubjacentToMRZProtoKey() functio
KSENC Deze array moet ten minste 16 bytes hebben toegewezen voordat u deze functie aanroept.Deze array bevat sessieversleutelingssleutel na succesvolle uitvoering van de functie
KSmac Deze array moet ten minste 16 bytes hebben toegewezen voordat deze functie wordt aangeroepen.Deze array bevat een sessiesleutel voor het berekenen van MAC na succesvolle uitvoering van de functie.
send_sequence_cnt Na succesvolle uitvoering van deze functie moet de aanwijzer naar deze 64-bits waarde worden opgeslagen en doorgestuurd bij elke volgende aanroep naar MRTDFileReadBacToHeap() en/of andere functies voor het lezen van eMRTD

MRTDFileReadBacToHeap #

Functieomschrijving

Gebruik deze functie om bestanden van de eMRTD NFC-tag te lezen. U kunt deze functie alleen aanroepen nadat u een beveiligingskanaal hebt ingesteld met de eerder aangeroepen

FUNCTIE MRTDAppSelectAndAuthenticateBac(). Sessietoetsen ksenc en ksmac, en ook parameter send_sequence_cnt worden verkregen door de eerder genoemde

FUNCTIE MRTDAppSelectAndAuthenticateBac(). Na het succesvol aanroepen van deze functie, *output verwijst naar de bestandsgegevens die worden gelezen uit een eMRTD-bestand dat is opgegeven door de parameter file_index. Buffer, waarin de gegevens worden opgeslagen, wordt automatisch toegewezen aan de geheugenheap tijdens de uitvoering van de functie. De maximale hoeveelheid toegewezen gegevens kan 32 kB zijn. Er is de verantwoordelijkheid van de programmeur om toegewezen gegevens op te schonen (d.w.z. door free(), de standaard C-functie) na gebruik aan te roepen.

Functiedeclaratie (C-taal)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **uitgang,

uint32_t *output_length,

const uint8_t ksenc[16],

const uint8_t ksmac[16],

Parameters

file_index

De parameter die het bestand aangeeft dat we uit de eMRTD willen lezen. Dit is een aanwijzer naar een bytearray die precies twee bytes bevat die het eMRTD-bestand aanduiden.Die twee bytes zijn bestandsidentificatie (FID) en er is een lijst met FID's:

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}

*uitvoer Nadat deze functie is aangeroepen, verwijst deze aanwijzer naar de bestandsgegevens die zijn gelezen uit een eMRTD-bestand dat is opgegeven door de parameter file_index. Buffer, waarin de gegevens worden opgeslagen, wordt automatisch toegewezen tijdens de uitvoering van de functie. De maximale hoeveelheid toegewezen gegevens kan 32 kB zijn. Er is de verantwoordelijkheid van de programmeur om toegewezen gegevens op te schonen (d.w.z. door free(), de standaard C-functie) na gebruik aan te roepen.
output_length Nadat deze functie met succes is aangeroepen, wijst deze aanwijzer naar de grootte van de bestandsgegevens die worden gelezen uit een eMRTD-bestand dat is opgegeven door de parameter file_index.
KSENC Sessiecoderingssleutel verkregen met behulp van een eerdere aanroep naar de functie MRTDAppSelectAndAuthenticateBac().
KSmac De sessiesleutel voor het berekenen van MAC die is verkregen met behulp van een eerdere aanroep van de functie MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt Deze aanwijzer moet verwijzen naar een 64-bits waarde die is geïnitialiseerd door de eerder
geslaagde aanroep van de functie MRTDAppSelectAndAuthenticateBac(). De aanwijzer naar deze 64-bits waarde moet worden opgeslagen en doorgestuurd bij elke volgende aanroep naar deze functie en/of andere functies die worden gebruikt voor het lezen van eMRTD.

uint64_t *send_sequence_cnt);

 

ePassport MRTD Voorbeeld #

Dit voorbeeld kunt u downloaden van:

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

of kloon het hele eclipse CDT-project met behulp van:

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

bevelen.

Als u alleen snel wilt uitvoeren, downloadt u het project en start u binair uitvoerbaar bestand vanuit de juiste map:

  • voor een 32-bits Windows start de win32_releaserun_me.cmd
  • voor een 64-bits Windows start de win64_releaserun_me.cmd
  • voor een 32-bits Linux start linux32_release/ePassport_mrtd
  • voor een 64-bits Linux start linux64_release/ePassport_mrtd.

Softwarevoorbeeld vereist dat het uFR-lezerapparaat is aangesloten en geconfigureerd op de pc. Er mag geen andere toepassing of service met uFR-lezer op de computer worden uitgevoerd. Na de succesvolle start van het "ePassport MRTD-voorbeeld", start de software de belangrijkste vele zoals hieronder weergegeven.

ePassport lezer MRTD NFC

<">Nu moet u een van de opties 'M' of 'P' kiezen zoals vermeld in de gebruiksinstructies van de toepassing op het scherm.

Als u de optie 'M' hebt gekozen, wordt u gevraagd om tekst:

U hebt ervoor gekozen om de subjacente MRZ-rij in te voeren onder de 'P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<':

Voer de subjacente MRZ-rij in. Subjacent MRZ-rij moet 44 tekens lang zijn.

dus voer subjacent MRZ-rij in. Een voorbeeld van de subjacente MRZ-rij is te zien in de eerste afbeelding.

Anders, als u de optie 'P' hebt gekozen, wordt u gevraagd met tekst:

U hebt ervoor gekozen om het documentnummer, de geboortedatum en de vervaldatum afzonderlijk in te voeren:

Voer het documentnummer in. Het documentnummer moet 9 tekens lang zijn.

_________ …

Voer de geboortedatum in. Datumnotatie moet JJMMDD zijn.

______ …

Voer de vervaldatum in. Datumnotatie moet JJMMDD zijn.

______ …

voer dus de gegevens in het juiste formaat in.

Nadat u de geldige gegevens hebt ingevoerd, zal de applicatie u informeren met een bericht:

MRZ proto-key is met succes ingesteld.

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

Na dit bericht kunt u doorgaan met het lezen van de NFC-tag die is ingesloten in ePassport en waartoe de gegevens behoren die u eerder hebt ingevoerd.

Nu kunt u het paspoort in het uFR-lezerveld plaatsen. Bij succesvolle communicatie krijgt u basisinformatie over de NFC-tag in het lezersveld. Bijvoorbeeld:

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

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

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

SAK en UID in dit voorbeeld zijn gemaskeerd en kunnen elke willekeurige waarde hebben. ePassports worden altijd herkend als DL_GENERIC_ISO14443_4 tagtype.

Nu kunt u opties voor het lezen van toepassingen kiezen:

'C' – deze optie leest algemene gegevens (EF.COM elementair bestand) van de ePassport. Na een succesvolle meting worden gegevens geparseerd en weergegeven in de volgende indeling:

EF.COM is met succes gelezen. De bestandslengte is ?? Bytes

Ruwe gegevens: 60 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx …

Het parseren van de EF.COM onbewerkte gegevens:

LDS versie is 01.07

UNICODE versie is 04.00.00

Lijst met bestaande gegevensgroepen:

Gevonden: EF. Dg 1

Gevonden: EF. Dg 2

Gevonden: EF. Dg3

Gevonden: EF. DG 14

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

Onbewerkte gegevens in dit voorbeeld worden gemaskeerd en kunnen elke willekeurige waarde hebben. Alleen de raw data tag is aanwezig geweest en deze zal altijd hetzelfde zijn (0x60). Wanneer u uw eigen document leest, krijgt u hier de werkelijke onbewerkte gegevens. Meer over de LDS-versie en UNICODE-versie kunt u lezen in het ICAO 9303, deel 10-document.

LDS- en UNICODE-versies worden gevolgd door de lijst met gegevensgroepen die ePassport bevat. Alleen DG1 en DG2 zijn verplicht. Alle andere gegevensgroepen kunnen al dan niet aanwezig zijn in de specifieke MRTD.

'S' – deze optie leest het documentbeveiligingsobject (EF. SO elementair bestand) en slaat het op in het binaire bestand welk pad en welke naam u moet invoeren wanneer u daarom vraagt. Documentbeveiligingsobject bevat een digitale handtekening in de standaard PKCS#7CMS-indeling. Aanwezigheid van de EF. SO op de MRTD is verplicht.

D

'1'– deze optie luidt de EF. DG1, parseer het en geeft onbewerkte en ontleed gegevens weer in de volgende indeling:

EF. DG1 is met succes gelezen. Bestandslengte is ?? Bytes

Ruwe gegevens:

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

Eenvoudig de EF ontleden. Ruwe gegevens van DG1:

Documentcode: P (ePassport)

Staat of organisatie van afgifte: ???

Naam van de houder: ACHTERNAAM FIRST_NAME

Documentnummer: ?????????

Nationaliteit:???

Geboortedatum (dd.MM.jjjj.): ??.??.????.

Geslacht:????

Vervaldatum (dd.MM.jjjj.): ??.??.????.

Optionele gegevens: ??????????????

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

Onbewerkte gegevens in dit voorbeeld worden gemaskeerd en kunnen elke willekeurige waarde hebben. Alleen de raw data tag is aanwezig geweest en deze zal altijd hetzelfde zijn (0x61). Wanneer u uw eigen document leest, krijgt u hier de werkelijke onbewerkte gegevens.

'2' – deze optie leest de EF. DG2 en sla het op in het binaire bestand welk pad en welke naam u moet invoeren wanneer u daarom vraagt. EF. DG2 bevat een gezichtsopname van de documenthouder en is verplicht. EF. DG2 kan naast gezichtsopname ook biometrische gelaatstrekken bevatten. Meer over EF. DG2-inhoud kunt u lezen in het ICAO 9303, deel 10-document.

'I' – deze optie leest de EF. DG2 aan. In dit geval wordt alleen de gezichtsopname uit het MRTD-bestand geëxtraheerd en opgeslagen in het bestand welk pad en welke naam u hebt ingevoerd. Het afbeeldingsformaat wordt automatisch gedetecteerd en de bestandsextensie wordt erop afgestemd. Er zijn twee mogelijke afbeeldingsbestandsindelingen gedefinieerd voor deze context: JPEG of JP2 (d.w.z.jpeg 2000).

'D' – deze optie leest een van de elementaire gegevensgroepen (EF. DG) bestanden van de MRTD en slaat het op in het binaire bestand welk pad en welke naam u moet invoeren wanneer u daarom vraagt. Nadat deze optie is gekozen, wordt u gevraagd om EF. DG-index. De index kan van het bereik 1 tot 16 zijn (bijvoorbeeld 1 voor EF. DG1 en 14 voor EF. DG 14). Het elementaire bestand dat u wilt lezen, moet worden vermeld in de lijst EF.COM gegevensgroepen.

Het lezen van sommige optionele elementaire bestanden, met name bestanden die biometrische gegevens bevatten, vereist speciale beveiligingsmechanismen die buiten het bereik van dit document vallen.

De huidige versie van het "ePassport MRTD Example" is 1.0 en is afhankelijk van de uFCoder-bibliotheekversie 5.0.12 en uFR-firmwareversie 5.0.22.