Online Store

Compatibilidad con la biblioteca uFCoder Machine Readable Travel Documents (MRTD)

Introducción #

La compatibilidad con la lectura de grupos de datos de la etiqueta NFC incrustada en los documentos de viaje legibles por máquina (MRTD), incluidos los pasaportes electrónicos que cumplen con las especificaciones de la OACI, se ha implementado en la biblioteca uFCoder.

La implementación es compatible con el mecanismo de control de acceso básico (BAC) para el acceso al chip NFC. BAC permite la autenticación y un canal de comunicación criptográfica seguro con una etiqueta NFC incrustada en el MRTD. BAC se basa puramente en criptografía simétrica utilizando el algoritmo 3DES y se implementa de acuerdo con ICAO 9303, parte 11.

OACI significa Organización de Aviación Civil Internacional (https://www.icao.int). La especificación ICAO 9303 estandariza los MRTD, incluidos los pasaportes electrónicos. Puede encontrar toda la serie ICAO Doc 9303 en https://www.icao.int/publications/pages/publication.aspx?docnum=9303web.

MrTDs Basic Access Control es compatible con la biblioteca uFCoder desde la versión 5.0.12.

Para autenticarse primero en la etiqueta NFC incrustada en el MRTD, debe pasar el número de documento, la fecha de nacimiento del titular del documento y la fecha de vencimiento del documento para funcionar MRTD_MRZDataToMRZProtoKey() para obtener la "clave proto" de la que se derivarán otras claves de seguridad necesarias. Todos los datos necesarios para obtener la "clave proto" (número de documento, la fecha de nacimiento del titular del documento y la fecha de vencimiento del documento) se codifican en la zona legible por máquina (MRZ) para que la biblioteca tenga la función MRTD_MRZSubjacentToMRZProtoKey() a la que se puede llamar en lugar de MRTD_MRZDataToMRZProtoKey(). Esta función acepta una cadena terminada en nulo que contiene una fila subyacente del documento MRZ.La siguiente captura de pantalla muestra un ejemplo de mrz con una fila subyacente marcada cuyo contenido debe pasar como parámetro para funcionar MRTD_MRZSubjacentToMRZProtoKey().

epassport MRZ

FUNCIONES DE BIBLIOTECA DE SOPORTE DE MRTD #

MRTD_MRZDataToMRZProtoKey #

Descripción de la función

Para obtener mrz proto key necesaria en los pasos posteriores, puede llamar a esta función y pasarle cadenas con terminación nula que contengan el número de documento, la fecha de nacimiento del titular del documento y la fecha de vencimiento del documento. Después de la ejecución exitosa de la función, MRZ Proto Key se almacenará en una matriz mrz_proto_key de 25 bytes.

Una declaración de función (lenguaje 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);

Parámetros

doc_number Puntero a una cadena con terminación nula que contiene exactamente un número de documento de 9 caracteres.
date_of_birth Puntero a una cadena con terminación nula que contiene exactamente 6 caracteres que representan la fecha de nacimiento en el formato "YYMMDD".
date_of_expiry Puntero a una cadena con terminación nula que contiene exactamente 6 caracteres que representan la fecha de caducidad en el formato "YYMMDD".
mrz_proto_key Esta matriz de bytes contendrá la protoclave MRZ calculada después de la ejecución exitosa de la función. Esta matriz debe haber asignado al menos 25 bytes antes de llamar a esta función.

 

MRTD_MRZSubjacentToMRZProtoKey #

Descripción de la función

Para obtener la clave MRZ Proto necesaria en los pasos posteriores, en el caso del formato TD3 MRZ (88 caracteres totalmente), puede llamar a esta función y pasarle una cadena con terminación nula que contenga una fila subyacente MRZ. Un ejemplo del formato TD3 MRZ impreso en el documento eMRTD se ve así:

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

L898902C36UTO7408122F1204159ZE184226B<<<<<10

Esta función debe recibir un puntero a una cadena con terminación nula que contenga una fila subyacente MRZ, es decir, "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

Declaración de función (lenguaje C)

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

Parámetros  
mrz Puntero a una cadena con terminación nula que contiene datos MRZ. Según el Doc 9303-10 de la OACI, donde tiene tres formatos de datos MRZ: formatos TD1, TD2 o TD3. TD1 contiene exactamente 90 caracteres, TD2 contiene exactamente 72 caracteres y TD3 contiene exactamente 88 caracteres.
mrz_proto_key Esta matriz de bytes contendrá la protoclave MRZ calculada después de la ejecución exitosa de la función. Esta matriz debe haber asignado al menos 25 bytes antes de llamar a esta función.

MRTDAppSelectAndAuthenticateBac #

Descripción de la función

Utilice esta función para autenticarse en la etiqueta NFC eMRTD mediante BAC. Esta función establece un canal seguro para la comunicación. El canal de seguridad se mantiene mediante el parámetro send_sequence_cnt . Las claves de sesión de canal son ksenc (para cifrado) y ksmac (para calcular MAC).

Declaración de función (lenguaje C)

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

uint8_t ksmac[16],

uint64_t *send_sequence_cnt);

Parámetros

mrz_proto_key Protoclave MRZ adquirida mediante la llamada previa a MRTD_MRZDataToMRZProtoKey() o MRTD_MRZSubjacentToMRZProtoKey() functio
ksenc Esta matriz debe haber asignado al menos 16 bytes antes de llamar a esta función.Esta matriz contendrá la clave de cifrado de sesión después de la ejecución exitosa de la función
ksmac Esta matriz debe haber asignado al menos 16 bytes antes de llamar a esta función.Esta matriz contendrá una clave de sesión para calcular MAC después de la ejecución exitosa de la función.
send_sequence_cnt Después de la ejecución exitosa de esta función, el puntero a este valor de 64 bits debe guardarse y reenviarse en cada llamada posterior a MRTDFileReadBacToHeap() y/u otras funciones para leer eMRTD

MRTDFileReadBacToHeap #

Descripción de la función

Utilice esta función para leer archivos de la etiqueta NFC eMRTD. Puede llamar a esta función solo después de haber establecido correctamente un canal de seguridad por el llamado anteriormente

Función MRTDAppSelectAndAuthenticateBac(). Las teclas de sesión ksenc y ksmac, y también los send_sequence_cnt de parámetros son adquiridos por los anteriormente llamados

Función MRTDAppSelectAndAuthenticateBac(). Después de la llamada correcta a esta función, *output apunta a los datos de archivo leídos de un archivo eMRTD especificado por el parámetro file_index. El búfer, en el que se almacenan los datos, se asigna automáticamente al montón de memoria durante la ejecución de la función. La cantidad máxima de datos asignados puede ser de 32 KB. Existe la responsabilidad del programador de limpiar los datos asignados (es decir, llamando a free(), la función C estándar) después de su uso.

Declaración de función (lenguaje C)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t **salida,

uint32_t *output_length,

const uint8_t ksenc[16],

const uint8_t ksmac[16],

Parámetros

file_index

Parámetro que especifica el archivo que queremos leer desde el eMRTD. Este es un puntero a una matriz de bytes que contiene exactamente dos bytes que designan el archivo eMRTD.Esos dos bytes son identificación de archivos (FID) y hay una lista 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}

*salida Después de la llamada correcta a esta función, este puntero apunta a los datos de archivo leídos de un archivo eMRTD especificado por el parámetro file_index. El búfer, en el que se almacenan los datos, se asigna automáticamente durante la ejecución de la función. La cantidad máxima de datos asignados puede ser de 32 KB. Existe la responsabilidad del programador de limpiar los datos asignados (es decir, llamando a free(), la función C estándar) después de su uso.
output_length Después de la llamada correcta a esta función, este puntero apunta al tamaño de los datos de archivo leídos de un archivo eMRTD especificado por el parámetro file_index.
ksenc Clave de cifrado de sesión adquirida mediante una llamada previa a la función MRTDAppSelectAndAuthenticateBac().
ksmac La clave de sesión para calcular mac adquirida mediante una llamada previa a la función MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt Este puntero debe apuntar a un valor de 64 bits inicializado por el
llamada correcta a la función MRTDAppSelectAndAuthenticateBac(). El puntero a este valor de 64 bits debe guardarse y reenviarse en cada llamada posterior a esta función y/u otras funciones utilizadas para leer eMRTD.

uint64_t *send_sequence_cnt);

 

Ejemplo de MRTD de pasaporte electrónico #

Este ejemplo se puede descargar desde:

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

o clonar todo el proyecto CDT del eclipse utilizando:

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

comando.

Si solo desea una ejecución rápida, descargue el proyecto e inicie el ejecutable binario desde la carpeta adecuada:

  • Para un Windows de 32 bits, inicie el win32_releaserun_me.cmd
  • Para un Windows de 64 bits, inicie el win64_releaserun_me.cmd
  • para un inicio de Linux de 32 bits linux32_release/ePassport_mrtd
  • para un inicio de Linux de 64 bits linux64_release/ePassport_mrtd.

El ejemplo de software requiere que el dispositivo lector uFR esté conectado y configurado en el PC. Ninguna otra aplicación o servicio que utilice el lector uFR debe ejecutarse en el equipo. Después del inicio exitoso del "Ejemplo de MRTD de pasaporte electrónico", el software inicia los muchos principales como se muestra a continuación.

Lector de pasaporte electrónico MRTD NFC

<">Ahora, debe elegir una de las opciones 'M' o 'P' como se indica en las instrucciones de uso de la aplicación en la pantalla.

Si elige la opción 'M', se le pedirá un mensaje de texto:

Ha elegido introducir una fila MRZ subyacente situada debajo de la 'P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<':

Introduzca la fila MRZ subyacente. La fila MRZ subyacente tiene que tener 44 caracteres.

así que ingrese la fila MRZ subyacente. Un ejemplo de la fila MRZ subyacente se puede ver en la primera imagen.

De lo contrario, si elige la opción 'P', se le pedirá un mensaje de texto:

Ha elegido introducir el número de documento, la fecha de nacimiento y la fecha de caducidad por separado:

Introduzca el número de documento. El número de documento debe tener 9 caracteres.

_________ …

Introduzca la fecha de nacimiento. El formato de fecha tiene que ser AAAADD.

______ …

Introduzca la fecha de caducidad. El formato de fecha tiene que ser AAAADD.

______ …

así que introduzca los datos en el formato adecuado.

Una vez introducidos los datos válidos, la aplicación te informará con un mensaje:

La protoclave MRZ se ha configurado correctamente.

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

Después de este mensaje, puede continuar con las operaciones de lectura en la etiqueta NFC incrustada en el pasaporte electrónico a la que pertenecen los datos que ha introducido anteriormente.

Ahora puede poner el pasaporte en el campo del lector uFR. En una comunicación exitosa establecida, obtendrá información básica sobre la etiqueta NFC en el campo del lector. Por ejemplo:

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

Tipo de etiqueta: DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:???

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

SAK y UID en este ejemplo están enmascarados y pueden tener cualquier valor arbitrario. Los pasaportes electrónicos siempre se reconocerán como DL_GENERIC_ISO14443_4 tipo de etiqueta.

Ahora puede elegir las opciones de lectura de la aplicación:

'C': esta opción lee datos comunes (EF.COM archivo elemental) del pasaporte electrónico. Después de una lectura correcta, los datos se analizan y se muestran en el siguiente formato:

EF.COM ha sido leído con éxito. La longitud del archivo es ?? Bytes

Datos brutos: 60 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx

Análisis de los datos sin procesar EF.COM:

La versión SUD es 01.07

La versión de UNICODE es 04.00.00

Lista de grupos de datos existentes:

Encontrado: EF. DG1

Encontrado: EF. DG2

Encontrado: EF. DG3

Encontrado: EF. DG14

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

Los datos sin procesar de este ejemplo están enmascarados y pueden tener cualquier valor arbitrario. Solo la etiqueta de datos sin procesar ha estado presente y siempre será la misma (0x60). Cuando lea su propio documento, obtendrá sus datos brutos reales aquí. Puede leer más información sobre la versión SUD y la versión UNICODE en el documento ICAO 9303, parte 10.

Las versiones LDS y UNICODE van seguidas de la lista de grupos de datos que contiene ePassport. Sólo la DG1 y la DG2 son obligatorias. Todos los demás grupos de datos pueden estar presentes o no en el MRTD particular.

'S': esta opción lee el objeto de seguridad del documento (EF. SO elementary file) y lo guarda en el archivo binario cuya ruta y nombre debe ingresar cuando se le solicite. El objeto de seguridad de documentos contiene una firma digital en el formato CMSestándar PKCS#7. Presencia del EF. SO en el MRTD es obligatorio.

D

«: esta opción dice el EF. DG1, analícelo y muestre los datos sin procesar y analizados en el siguiente formato:

Ef. DG1 ha sido leído con éxito. La longitud del archivo es ?? Bytes

Datos sin procesar:

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

Análisis simple del EF. Datos brutos de dg1:

Código del documento: P (ePassport)

Estado u organización emisora: ???

Nombre del titular: APELLIDO FIRST_NAME

Número de documento: ?????????

¿¿¿Nacionalidad:???

Fecha de nacimiento (dd.MM.aaaa.): ??.??.????.

¿¿¿¿Sexo:????

Fecha de caducidad (dd.MM.aaaa.): ??.??.????.

Datos opcionales: ??????????????

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

Los datos sin procesar de este ejemplo están enmascarados y pueden tener cualquier valor arbitrario. Solo la etiqueta de datos sin procesar ha estado presente y siempre será la misma (0x61). Cuando lea su propio documento, obtendrá sus datos brutos reales aquí.

'2': esta opción dice el EF. DG2 y guárdelo en el archivo binario qué ruta y nombre debe ingresar cuando se le solicite. Ef. DG2 contiene una imagen facial del titular del documento y es obligatorio. Ef. DG2 junto a la imagen facial también podría contener rasgos faciales biométricos. Más sobre EF. Contenido dg2 que puede leer en el documento OACI 9303, parte 10.

«: esta opción dice el EF. DG2 a. En este caso, solo se extrae la imagen facial del archivo MRTD y se guarda en el archivo qué ruta y nombre ha ingresado. El formato de la imagen se detecta automáticamente y la extensión del archivo se establece de acuerdo con él. Hay dos posibles formatos de archivo de imagen definidos para este contexto: JPEG o JP2 (es decir.jpeg 2000).

'D': esta opción lee cualquiera de los grupos de datos elementales (EF. DG) desde el MRTD y lo guarda en el archivo binario cuya ruta y nombre debe ingresar cuando se le solicite. Una vez elegida esta opción, se le pedirá EF. Índice DG. El índice puede ser del rango 1 a 16 (por ejemplo, 1 para EF. DG1 y 14 para EF. DG14). El archivo elemental que desea leer debe aparecer en la lista de grupos de datos EF.COM.

La lectura de algunos archivos elementales opcionales, especialmente aquellos que contienen datos biométricos, requiere mecanismos de seguridad especiales que están fuera del alcance de este documento.

La versión actual del "Ejemplo de MRTD de pasaporte electrónico" es 1.0 y depende de la versión 5.0.12 de la biblioteca uFCoder y de la versión 5.0.22 del firmware uFR.