Online Store

Prise en charge des documents de voyage lisibles par machine (MRTD) de la bibliothèque uFCoder

Introduction #

La prise en charge de la lecture de groupes de données à partir de la balise NFC intégrée dans les documents de voyage lisibles par machine (MRTD), y compris les passeports électroniques conformes aux spécifications de l’OACI, a été mise en œuvre dans la bibliothèque uFCoder.

L’implémentation prend en charge le mécanisme de contrôle d’accès de base (BAC) pour l’accès à la puce NFC. BAC permet l’authentification et un canal de communication cryptographique sécurisé avec une balise NFC intégrée dans le MRTD. BAC est basé uniquement sur la cryptographie symétrique utilisant l’algorithme 3DES et il est implémenté selon ICAO 9303, partie 11.

OACI signifie Organisation de l’aviation civile internationale (https://www.icao.int). La spécification 9303 de l’OACI normalise les MRTD, y compris les passeports électroniques. Vous pouvez trouver l’intégralité de la série Doc 9303 de l’OACI sur https://www.icao.int/publications/pages/publication.aspx?docnum=9303site Web.

Le contrôle d’accès de base MRTDs est pris en charge dans la bibliothèque uFCoder à partir de la version 5.0.12.

Afin de vous authentifier auprès de la balise NFC intégrée dans le MRTD en premier, vous devez passer le numéro du document, la date de naissance du titulaire du document et la date d’expiration du document pour fonctionner MRTD_MRZDataToMRZProtoKey() afin d’obtenir la « clé proto » à partir de laquelle seront dérivées d’autres clés de sécurité nécessaires. Toutes les données nécessaires pour obtenir la « clé proto » (numéro du document, date de naissance du détenteur du document et date d’expiration du document) sont codées dans la zone lisible par machine (MRZ) afin que la bibliothèque dispose d’MRTD_MRZSubjacentToMRZProtoKey() qui peut être appelée au lieu de MRTD_MRZDataToMRZProtoKey(). Cette fonction accepte une chaîne terminée par une valeur NULL contenant une ligne sous-jacente de la MRZ du document.La capture d’écran ci-dessous montre un exemple de MRZ avec une ligne sous-jacente marquée dont vous devez passer le contenu comme paramètre pour fonctionner MRTD_MRZSubjacentToMRZProtoKey().

EPASSPORT MRZ

Fonctions de bibliothèque de support MRTD #

MRTD_MRZDataToMRZProtoKey #

Description de la fonction

Afin d’obtenir MRZ Proto Key nécessaire dans les étapes suivantes, vous pouvez appeler cette fonction et lui transmettre des chaînes terminées par une valeur NULL contenant le numéro du document, la date de naissance du titulaire du document et la date d’expiration du document. Après une exécution réussie de la fonction, MRZ Proto Key sera stocké dans un tableau mrz_proto_key de 25 octets.

Une déclaration de fonction (langage 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);

Paramètres

doc_number Pointeur vers une chaîne terminée par une valeur NULL contenant exactement un numéro de document de 9 caractères.
date_of_birth Pointeur vers une chaîne terminée par une valeur NULL contenant exactement 6 caractères représentant la date de naissance au format « AAAAMMJJ ».
date_of_expiry Pointeur vers une chaîne terminée par une valeur NULL contenant exactement 6 caractères représentant la date d’expiration au format « AAMMJJ ».
mrz_proto_key Ce tableau d’octets contiendra la proto-clé MRZ calculée après l’exécution réussie de la fonction. Ce tableau doit avoir alloué au moins 25 octets avant d’appeler cette fonction.

 

MRTD_MRZSubjacentToMRZProtoKey #

Description de la fonction

Afin d’obtenir la clé PROTO MRZ nécessaire dans les étapes suivantes, dans le cas du format TD3 MRZ (88 caractères au total), vous pouvez appeler cette fonction et lui passer une chaîne terminée par une valeur NULL contenant une ligne sous-jacente MRZ. Voici un exemple du format TD3 MRZ imprimé sur le document eMRTD :

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

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Cette fonction doit recevoir un pointeur vers une chaîne terminée par une valeur NULL contenant une ligne sous-jacente MRZ, c’est-à-dire « L898902C36UTO7408122F1204159ZE184226B<<<<<10 ».

Déclaration de fonction (langage C)

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

Paramètres  
mrz Pointeur vers une chaîne terminée par une valeur NULL contenant des données MRZ. Selon le document 9303-10 de l’OACI, où il dispose de trois formats de données MRZ: formats TD1, TD2 ou TD3. TD1 contient exactement 90 caractères, TD2 contient exactement 72 caractères et TD3 contient exactement 88 caractères.
mrz_proto_key Ce tableau d’octets contiendra la proto-clé MRZ calculée après l’exécution réussie de la fonction. Ce tableau doit avoir alloué au moins 25 octets avant d’appeler cette fonction.

MRTDAppSelectAndAuthenticateBac #

Description de la fonction

Utilisez cette fonction pour vous authentifier auprès de la balise NFC eMRTD à l’aide de BAC. Cette fonction établit un canal de communication sécurisé. Le canal de sécurité est géré à l’aide du paramètre send_sequence_cnt . Les clés de session de canal sont ksenc (pour le chiffrement) et ksmac (pour le calcul du MAC).

Déclaration de fonction (langage C)

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

uint8_t ksmac[16],

uint64_t *send_sequence_cnt);

Paramètres

mrz_proto_key Proto-clé MRZ acquise à l’aide de l’appel précédent à MRTD_MRZDataToMRZProtoKey() ou MRTD_MRZSubjacentToMRZProtoKey() functio
ksenc Ce tableau doit avoir alloué au moins 16 octets avant d’appeler cette fonction.Ce tableau contiendra la clé de chiffrement de session après l’exécution réussie de la fonction
ksmac Ce tableau doit avoir alloué au moins 16 octets avant d’appeler cette fonction.Ce tableau contiendra une clé de session pour calculer MAC après l’exécution réussie de la fonction.
send_sequence_cnt Après l’exécution réussie de cette fonction, le pointeur vers cette valeur 64 bits doit être enregistré et transféré à chaque appel suivant vers MRTDFileReadBacToHeap() et/ou d’autres fonctions de lecture eMRTD

MRTDFileReadBacToHeap #

Description de la fonction

Utilisez cette fonction pour lire les fichiers de la balise NFC eMRTD. Vous ne pouvez appeler cette fonction qu’après avoir établi avec succès un canal de sécurité par le canal précédemment appelé

Fonction MRTDAppSelectAndAuthenticateBac(). Les clés de session ksenc et ksmac, ainsi que les send_sequence_cnt de paramètres sont acquis par le précédemment appelé

Fonction MRTDAppSelectAndAuthenticateBac(). Après l’appel réussi de cette fonction, *output pointe vers les données de fichier lues à partir d’un fichier eMRTD spécifié par le paramètre file_index. La mémoire tampon, dans laquelle les données sont stockées, est automatiquement allouée sur le tas de mémoire pendant l’exécution de la fonction. La quantité maximale de données allouées peut être de 32 Ko. Il est de la responsabilité du programmeur de nettoyer les données allouées (c'est-à-dire en appelant free(), la fonction C standard) après utilisation.

Déclaration de fonction (langage C)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **sortie,

uint32_t *output_length,

const uint8_t ksenc[16],

const uint8_t ksmac[16],

Paramètres

file_index

Paramètre qui spécifie le fichier que nous voulons lire à partir de l’eMRTD. Il s’agit d’un pointeur vers un tableau d’octets contenant exactement deux octets désignant le fichier eMRTD.Ces deux octets sont l’identification de fichier (FID) et il existe une liste de 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}

*sortie Après l’appel réussi de cette fonction, ce pointeur pointe vers les données de fichier lues à partir d’un fichier eMRTD spécifié par le paramètre file_index. La mémoire tampon, dans laquelle les données sont stockées, est automatiquement allouée lors de l’exécution de la fonction. La quantité maximale de données allouées peut être de 32 Ko. Il est de la responsabilité du programmeur de nettoyer les données allouées (c'est-à-dire en appelant free(), la fonction C standard) après utilisation.
output_length Après l’appel réussi de cette fonction, ce pointeur pointe vers la taille des données de fichier lues à partir d’un fichier eMRTD spécifié par le paramètre file_index.
ksenc Clé de chiffrement de session acquise à l’aide d’un appel préalable à la fonction MRTDAppSelectAndAuthenticateBac().
ksmac Clé de session pour calculer mac acquis à l’aide d’un appel préalable à la fonction MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt Ce pointeur doit pointer vers une valeur de 64 bits initialisée par le
appel réussi à la fonction MRTDAppSelectAndAuthenticateBac(). Le pointeur vers cette valeur de 64 bits doit être enregistré et transféré à chaque appel ultérieur à cette fonction et/ou à d’autres fonctions utilisées pour lire eMRTD.

uint64_t *send_sequence_cnt);

 

Exemple de passeport électronique MRTD #

Cet exemple peut être téléchargé à partir de :

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

ou clonez l’intégralité du projet ECLIPSE CDT en utilisant :

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

commande.

Si vous souhaitez une exécution rapide uniquement, téléchargez le projet et démarrez l’exécutable binaire à partir du dossier approprié :

  • pour un Windows 32 bits, démarrez le win32_releaserun_me.cmd
  • pour un Windows 64 bits, démarrez le win64_releaserun_me.cmd
  • pour un démarrage Linux 32 bits linux32_release/ePassport_mrtd
  • pour un linux 64 bits, démarrez linux64_release/ePassport_mrtd.

L’exemple de logiciel nécessite que le périphérique de lecture uFR soit connecté et configuré au PC. Aucune autre application ou service utilisant le lecteur uFR ne doit être en cours d’exécution sur l’ordinateur. Après le démarrage réussi de l’exemple MRTD du passeport électronique, le logiciel démarre le nombre principal comme indiqué ci-dessous.

Lecteur de passeport électronique MRTD NFC

<">Maintenant, vous devez choisir l’une des options « M » ou « P » comme indiqué dans les instructions d’utilisation de l’application à l’écran.

Si vous avez choisi l’option « M », vous serez invité avec du texte :

Vous avez choisi d'entrer la ligne MRZ sous-jacente située sous le 'P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<':

Entrez la ligne MRZ sous-jacente. La ligne MRZ sous-jacente doit comporter 44 caractères.

entrez donc une ligne MRZ sous-jacente. Un exemple de la ligne MRZ sous-jacente peut être vu dans la première image.

Sinon, si vous avez choisi l’option 'P', vous serez invité avec du texte:

Vous avez choisi d’entrer le numéro de document, la date de naissance et la date d’expiration séparément :

Entrez le numéro du document. Le numéro du document doit comporter 9 caractères.

_________ …

Entrez la date de naissance. Le format de date doit être AAMMJJ.

______ …

Entrez la date d’expiration. Le format de date doit être AAMMJJ.

______ …

entrez donc les données dans le format approprié.

Après avoir entré les données valides, l’application vous informera par un message:

La proto-clé MRZ a été définie avec succès.

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

Après ce message, vous pouvez poursuivre les opérations de lecture sur la balise NFC intégrée dans le passeport électronique auquel appartiennent les données que vous avez précédemment saisies.

Vous pouvez maintenant mettre le passeport dans le champ du lecteur uFR. Une fois la communication établie avec succès, vous obtiendrez des informations de base sur la balise NFC dans le champ du lecteur. Par exemple:

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

Type de balise: DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:?:??????

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

SAK et UID dans cet exemple sont masqués et ils peuvent avoir n’importe quelle valeur arbitraire. Les passeports électroniques seront toujours reconnus comme DL_GENERIC_ISO14443_4 type d’étiquette.

Vous pouvez maintenant choisir les options de lecture de l’application:

'C' – cette option lit les données courantes (EF.COM fichier élémentaire) à partir du passeport électronique. Après une lecture réussie, les données sont analysées et affichées dans le format suivant :

EF.COM a été lu avec succès. La longueur du fichier est ?? Octets

Données brutes: 60 xx xx xx xx xx xx xx xx xx

Analyse des données brutes EF.COM :

La version LDS est 01.07

La version UNICODE est 04.00.00

Liste des groupes de données existants :

Trouvé : EF. DG1

Trouvé : EF. DG2

Trouvé : EF. DG3

Trouvé : EF. DG14

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

Les données brutes de cet exemple sont masquées et peuvent avoir n’importe quelle valeur arbitraire. Seule la balise de données brutes a été présente et elle sera toujours la même (0x60). Lorsque vous lisez votre propre document, vous obtiendrez ses données brutes réelles ici. Pour en savoir plus sur la version LDS et la version UNICODE, vous pouvez lire dans le document OACI 9303, partie 10.

Les versions LDS et UNICODE sont suivies de la liste des groupes de données contenue dans ePassport. Seules les DG1 et DG2 sont obligatoires. Tous les autres groupes de données peuvent être présents ou non dans le MRTD particulier.

'S' – cette option lit l’objet document security (EF. SO elementary file) et l’enregistre dans le fichier binaire quel chemin et nom vous devez entrer lorsque vous y êtes invité. L’objet Document Security contient une signature numérique au format CMS PKCS#7standard. Présence de l’EF. SO sur le MRTD est obligatoire.

D

'1'– cette option lit l’EF. DG1, analysez-le et affichez les données brutes et analysées dans le format suivant :

Ef. DG1 a été lu avec succès. La longueur du fichier est ?? Octets

Données brutes :

61 xx xx xx xx xx xx xx

  1. xx xx xx xx xx xx xx xx xx  

Analyse simple de l’EF. Données brutes DG1:

Code du document : P (passeport électronique)

État ou organisme émetteur : ???

Nom du titulaire : NOM FIRST_NAME

Numéro du document : ?????????

Nationalité:???

Date de naissance (jj.MM.aaaa) : ??.??.????.

Sexe:????

Date d’expiration (jj.MM.aaaa) : ??.??.????.

Données facultatives : ??????????????

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

Les données brutes de cet exemple sont masquées et peuvent avoir n’importe quelle valeur arbitraire. Seule la balise de données brutes a été présente et elle sera toujours la même (0x61). Lorsque vous lisez votre propre document, vous obtiendrez ses données brutes réelles ici.

'2' – cette option lit l’EF. DG2 et enregistrez-le dans le fichier binaire quel chemin et nom vous devez entrer lorsque vous y êtes invité. Ef. DG2 contient une image faciale du titulaire du document et elle est obligatoire. Ef. DG2 à côté de l’image faciale pourrait également contenir des caractéristiques faciales biométriques. En savoir plus sur EF. Contenu DG2 que vous pouvez lire dans le document OACI 9303, partie 10.

'I' – cette option lit l’EF. DG2 à. Dans ce cas, seule l’image faciale est extraite du fichier MRTD et enregistrée dans le fichier que vous avez entré. Le format d’image est automatiquement détecté et l’extension de fichier est définie en conséquence. Deux formats de fichiers image possibles sont définis pour ce contexte : JPEG ou JP2 (c’est-à-dire .jpeg 2000).

'D' – cette option lit n’importe quel groupe de données élémentaires (EF. DG) à partir du MRTD et l’enregistre dans le fichier binaire quel chemin et nom vous devez entrer lorsque vous y êtes invité. Une fois cette option choisie, vous serez invité à entrer EF. Index dg. L’indice peut être compris entre 1 et 16 (par exemple, 1 pour EF. DG1 et 14 pour EF. DG14). Le fichier élémentaire que vous souhaitez lire doit être répertorié dans la liste des groupes de données EF.COM.

La lecture de certains fichiers élémentaires facultatifs, en particulier ceux contenant des données biométriques, nécessite des mécanismes de sécurité spéciaux qui ne relèvent pas du champ d’application du présent document.

La version actuelle de l’exemple MRTD du passeport électronique est 1.0 et dépend de la bibliothèque uFCoder version 5.0.12 et du firmware uFR version 5.0.22.