在线商店

支持uFCoder库机读旅行文档(MRTD)

打印友好,PDF和电子邮件
[printfriendly电流= '是的']
打印友好,PDF和电子邮件

简介

支持从机读旅行文件(mrtd)中嵌入的NFC标签(包括符合ICAO规范的ePassports)读取数据组,已在uFCoder库中实现。

该实现支持NFC芯片访问的基本访问控制(BAC)机制。BAC通过MRTD中嵌入的NFC标签实现身份验证和安全加密通信通道。BAC是基于纯对称密码学,采用3DES算法实现的ICAO 9303,第11部分

ICAO是国际民用航空组织(https://www.icao.int).ICAO 9303规范标准化了mrtd,包括ePassports。你可以在上面找到整个ICAO Doc 9303系列https://www.icao.int/publications/pages/publication.aspx?docnum=9303网络位置。

mrtd基本访问控制支持uFCoder图书馆版本5.0.12

为了首先对嵌入在MRTD中的NFC标记进行身份验证,您必须将文档号、文档持有者的出生日期和文档过期日期传递给函数MRTD_MRZDataToMRZProtoKey(),以便获得“原密钥”,从中派生其他必要的安全密钥。获得“proto key”所需的所有数据(文档号、文档持有者的出生日期和文档过期日期)都编码在机器可读区域(MRZ)中,因此库有MRTD_MRZSubjacentToMRZProtoKey()函数,可以调用该函数来代替MRTD_MRZDataToMRZProtoKey()。此函数接受一个以空结束的字符串,其中包含文档MRZ的下一行。下面的截图显示了一个MRZ的例子,它带有一个标记的下一行,其中的内容必须作为参数传递给函数MRTD_MRZSubjacentToMRZProtoKey()。

epassport MRZ

MRTD支持库功能

MRTD_MRZDataToMRZProtoKey

功能描述

为了获得后续步骤所需的MRZ Proto Key,可以调用此函数并向其传递以空结束的字符串,其中包含文档号、文档持有者出生日期和文档过期日期。成功执行函数后,MRZ Proto Key将存储在一个25字节的mrz_proto_key数组中。

函数声明(C语言)

UFR_STATUS MRTD_MRZDataToMRZProtoKey(const char *doc_number,

Const char *date_of_birth

Const char *date_of_expiry,

uint8_t mrz_proto_key [25]);

参数

doc_number 指向一个以空结束的字符串的指针,该字符串包含恰好9个字符的文档号。
date_of_birth 指针指向一个以空结尾的字符串,包含恰好6个字符,表示" YYMMDD "格式的出生日期。
date_of_expiry 指针指向一个以空结束的字符串,该字符串包含6个字符,表示“YYMMDD”格式的到期日期。
mrz_proto_key 此字节数组将包含成功执行函数后计算出的MRZ原键。在调用此函数之前,该数组必须至少分配了25个字节。

MRTD_MRZSubjacentToMRZProtoKey

功能描述

为了在后续步骤中获得所需的MRZ Proto Key,在TD3 MRZ格式(总共88个字符长)的情况下,您可以调用此函数并向其传递一个包含MRZ下行的空结束字符串。eMRTD文件上打印的TD3 MRZ格式示例如下:

P < UTOERIKSSON < < <安娜玛丽亚 <<<<<<<<<<<<<<<<<<<

L898902C36UTO7408122F1204159ZE184226B < < < < < 10

这个函数应该接收一个指向包含MRZ下行的空结束字符串的指针,例如" L898902C36UTO7408122F1204159ZE184226B<<<<<10 "。

函数声明(C语言)

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

参数
mrz 指向包含MRZ数据的以空结束的字符串的指针。根据ICAO文件9303-10,其中有三种MRZ数据格式:TD1, TD2,或TD3格式。TD1刚好包含90个字符,TD2刚好包含72个字符,TD3刚好包含88个字符。
mrz_proto_key 此字节数组将包含成功执行函数后计算出的MRZ原键。在调用此函数之前,该数组必须至少分配了25个字节。

MRTDAppSelectAndAuthenticateBac

功能描述

使用这个函数使用BAC对eMRTD NFC标签进行身份验证。该功能为通信建立了一个安全通道。来维护安全通道send_sequence_cnt参数。通道会话密钥为ksenc(用于加密)和ksmac(用于计算MAC)。

函数声明(C语言)

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

uint8_t ksmac [16],

uint64_t * send_sequence_cnt);

参数

mrz_proto_key 使用先前调用MRTD_MRZDataToMRZProtoKey()或MRTD_MRZSubjacentToMRZProtoKey()函数获取的MRZ原键
ksenc 在调用此函数之前,该数组必须至少分配了16个字节。成功执行函数后,该数组将包含会话加密密钥
ksmac 在调用此函数之前,该数组必须至少分配了16个字节。该数组将包含一个会话键,用于在函数成功执行后计算MAC。
send_sequence_cnt 成功执行此函数后,应保存该64位值的指针,并在每次后续调用MRTDFileReadBacToHeap()和/或其他用于读取eMRTD的函数时将其转发

MRTDFileReadBacToHeap

功能描述

使用这个函数从eMRTD NFC标签读取文件。只有在前面调用的安全通道成功建立后,才能调用此函数

MRTDAppSelectAndAuthenticateBac()函数。会话键ksenc和ksmac,以及参数send_sequence_cnt都由前面调用的

MRTDAppSelectAndAuthenticateBac()函数。成功调用此函数后,*output指向从file_index参数指定的eMRTD文件中读取的文件数据。缓冲区是存储数据的地方,它在函数执行时自动分配到内存堆上。可分配的最大数据量为32KB。程序员有责任在使用后清理已分配的数据(即通过调用标准C函数free())。

函数声明(C语言)

UFR_STATUS MRTDFileReadBacToHeap(const uint8_t *file_index,

uint8_t * *输出,

uint32_t * output_length,

Const uint8_t ksenc[16],

Const uint8_t ksmac[16],

参数

file_index

指定要从eMRTD读取的文件的参数。这是一个指向字节数组的指针,该字节数组包含指定eMRTD文件的两个字节。这两个字节是文件识别(FID),有一个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}

*输出 成功调用此函数后,此指针指向从file_index参数指定的eMRTD文件中读取的文件数据。在函数执行期间自动分配用于存储数据的缓冲区。可分配的最大数据量为32KB。程序员有责任在使用后清理已分配的数据(即通过调用标准C函数free())。
output_length 成功调用此函数后,此指针指向由file_index参数指定的从eMRTD文件中读取的文件数据的大小。
ksenc 使用先前调用MRTDAppSelectAndAuthenticateBac()函数获得的会话加密密钥。
ksmac 用于计算通过先前调用MRTDAppSelectAndAuthenticateBac()函数获得的MAC的会话密钥。
send_sequence_cnt 该指针应该指向由前面的初始化的64位值
成功调用MRTDAppSelectAndAuthenticateBac()函数。该64位值的指针应该保存,并在每次后续调用此函数和/或用于读取eMRTD的其他函数时转发。

uint64_t * send_sequence_cnt);

护照MRTD示例

此示例可从以下网站下载:

//www.texashampton.com/code/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

或者使用以下方法克隆整个eclipse CDT项目:

git克隆-递归//www.texashampton.com/code/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

命令。

如果你只想快速运行,下载项目并从适当的文件夹启动二进制可执行文件:

  • 对于32位Windows启动win32_release\run_me.cmd
  • 对于64位Windows,启动win64_release\run_me.cmd
  • 对于32位Linux,请启动linux32_release/ePassport_mrtd
  • 对于64位Linux,请启动linux64_release/ePassport_mrtd。

软件示例:需要将uFR阅读器连接并配置到PC上。计算机上不应该运行使用uFR阅读器的其他应用程序或服务。在成功启动“ePassport MRTD示例”之后,软件启动如下所示的主要许多。

护照阅读器MRTD NFC

现在,您应该根据屏幕上的应用程序使用说明选择' M '或' P '选项之一。

如果你选择了“M”选项,你将会看到文字提示:

您已经选择进入位于' P< xxx姓氏<

输入下MRZ行。下MRZ行必须为44个字符长。

所以进入下MRZ行。下面的MRZ行可以在第一张图中看到。

否则,如果你选择了“P”选项,你将会收到文字提示:

您已经选择进入文档。分别编号、出生日期和到期日:

输入文档编号。文档编号应该是9个字符长。

_________ ...

输入出生日期。日期格式必须是YYMMDD。

______ ...

输入过期日期。日期格式必须是YYMMDD。

______ ...

因此,请以适当的格式输入数据。

在您输入有效数据后,应用程序将通知您一条消息:

MRZ原密钥设置成功。

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

在此消息之后,您可以继续读取您之前输入的数据所属的ePassport中嵌入的NFC标签的操作。

现在您可以将护照放在uFR阅读器字段中。在成功建立通信时,您将在读取器字段中获得关于NFC标签的基本信息。例如:

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

标签类型:DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:??

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

本例中的SAK和UID被屏蔽,它们可以有任意值。ePassports将总是像DL_GENERIC_ISO14443_4标记类型一样被识别。

现在您可以选择应用程序读取选项:

C '这个选项从ePassport读取公共数据(EF.COM基本文件)。读取成功后,数据被解析并以以下格式显示:

EF.COM已成功读取。文件长度为??字节

原始数据:60 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx…

解析EF.COM的原始数据:

LDS版本是01.07

UNICODE版本是04.00.00

现有数据组列表:

发现:EF。DG1

发现:EF。DG2

发现:EF。DG3

发现:EF。DG14

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

本例中的原始数据是被屏蔽的,它们可以是任意值。只有原始数据标记存在,并且它始终是相同的(0x60)。当您阅读自己的文档时,您将在这里获得它的实际原始数据。关于LDS版本和UNICODE版本的更多信息,您可以在ICAO 9303第10部分文件

LDS和UNICODE版本后面跟着ePassport包含的数据组列表。只有DG1和DG2是必选的。所有其他数据组都可以在特定的MRTD中出现或不出现。

年代-该选项读取文档安全对象(EF。SO基本文件)并将其保存到二进制文件中,在提示时必须输入该文件的路径和名称。文档安全对象在标准中包含一个数字签名PKCS # 7CMS格式。EF的存在。所以在MRTD上是强制性的。

D

1 '-这个选项读取EF。DG1,parse it and displays raw and parsed data in the following format:

EF。DG1has been successfully read. File length is ?? bytes

原始数据:

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

  1. xxXx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx Xx...

简单解析EF。DG1原始数据:

证件代码:P(护照)

签发国或组织:??

持证人姓名:姓氏FIRST_NAME

文档编号:?????????

国籍:? ?

出生日期(dd.MM.yyyy.): ???……????。

性:? ?

到期日(dd.MM.yyyy.): ???? ????。

可选数据:??????????????

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

本例中的原始数据是被屏蔽的,它们可以是任意值。只有原始数据标记存在,并且它始终是相同的(0x61)。当您阅读自己的文档时,您将在这里获得它的实际原始数据。

2》-这个选项读取EF。DG2and save it to the binary file which path and name you have to enter when you prompted. EF.DG2 contains a document holder facial image and it is mandatory. EF.DG2 beside facial image could contain biometric facial features too. More about EF.DG2 content you can read in theICAO 9303第10部分文件

-这个选项读取EF。DG2。在本例中,只从MRTD文件中提取面部图像,并保存到您输入的路径和名称的文件中。自动检测图像格式,并根据其设置文件扩展名。在此上下文中定义了两种可能的图像文件格式:JPEG或JP2(即JPEG 2000)。

D '-该选项从MRTD读取任何基本数据组(EF.DG)文件,并将其保存到二进制文件中,在提示时必须输入该文件的路径和名称。选择此选项后,将提示您输入EF。DG指数。索引的范围可以是1到16(例如EF为1)。DG1和14为EF.DG14)。您想要读取的基本文件必须列在EF.COM数据组列表中。

阅读一些可选的基本文件,特别是那些包含生物特征数据的文件,需要特殊的安全机制,这超出了本文档的范围。

“ePassport MRTD示例”的当前版本是1.0,依赖于uFCoder库版本5.0.12和uFR固件版本5.0.22。

Baidu
map