美国护照机读旅行证件中的 B 型 NFC 芯片
Posted
技术标签:
【中文标题】美国护照机读旅行证件中的 B 型 NFC 芯片【英文标题】:Type B NFC Chip in US Passport MRTD 【发布时间】:2014-11-25 01:10:39 【问题描述】:我正在尝试阅读 2010 年发行的美国护照。它有一个使用 B 型调制的 NFC 芯片。大多数国家都使用 A 型,所以我现在只是第一次尝试 B 型。
我正在使用 NXP PN532 NFC 控制器。我使用的是 inCommunicateThru 指令而不是 inDataExchange,因为我需要手动控制超时和错误处理,才能成功与该型号 NFC 控制器上的 B 型芯片通信。我必须自己实现部分 ISO-14443-4 协议,例如 PCB、CID 和 CRC 字节,但它似乎可以工作。我可以选择应用程序并从标签中请求挑战随机数。
问题是在 SW1 和 SW2 字节之上返回了大量额外数据,即使没有预期返回数据也是如此。例如,响应选择机读旅行证件应用命令(INS = 0xA4),返回的字节数很多:
发送类型 4B 帧(PCB = 0A,CID = 01,CRC = 8A 2E)
->0A 01 00 A4 04 0C 07 A0 00 00 02 47 10 01 8A 2E
收到类型 4B 响应帧:
-> 0A 01 62 36 82 01 38 83 02 00 11 85 01 00 84 07 A0 00 00 02 47 10 01 86 0D FF FF FF FF FF FF FF FF FF FF FF FF FF 8B 12 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 90 00
然后我尝试通过发送 Type 4B 帧来获得挑战随机数:
->0A 01 00 84 00 00 00 8E 3E
注意:出于某种原因,我需要将 Le 设置为 00,以免出现错误的长度错误
收到类型 4B 响应帧:
->0B 01 90 9C 46 70 EC 02 BF FC 6E E2 A6 40 2D A5 0C 5F 93 02 B6 EB B5 61 1B BA 90 00
前两个字节是PCB和CID,最后一个是SW1 SW2,我懂的。
BOLD 中的字节我无法解释。有人对美国机读旅行证件或其他 B 型 NFC 芯片有任何经验,可以帮助我解释这些字节吗?有没有可以解释这些额外字节的参考资料?
*****2014 年 11 月 27 日更新**********
好吧,不,我没疯,Get Challenge 命令对这个护照很奇怪,因为根据 ICAO 规范将 Le 设置为 0x08 会产生 6700 错误,但如果 Le=0x00,返回的字节太多。使用 inDataExchange(不是 inCommunicateThru)来获得挑战(如,我得到 8 个字节)。这样我就不必猜测哪个 8 个字节是挑战。
太好了,现在我有了挑战和静态公钥,我可以使用扩展超时模式执行相互认证指令并获取响应字节。 INS为0x82,P1,P2 = 0x00, Le,Lc=0x28
结果是我从 PN532(NFC 控制器)返回 0x00,但没有返回字节!甚至没有 SW1 或 SW2。下面是一个例子:
发送类型4B帧:0A 01 00 82 00 00 28 73 3D 4E 2E C1 37 18 99 49 7C 4B 2A E0 79 A8 08 E2 6B 14 53 56 2C A4 66 D5 3E D8 94 56 79 50 2A 0D 6B C6 9A 75 5E B1 CB 28 11 75
收到的类型 4B 响应帧:D5 43 00
ITALIC 字节是协议字节,BOLD 是实际的 APDU
有人知道 2008-2010 年颁发的美国机读旅行证件护照有什么特点吗?
【问题讨论】:
你有没有源代码的副本,可能是在它消失之前下载的? 更新:@Papyrus,Google Play 上的一些应用程序现在可以解码美国护照,而以前不能。我不知道发生了什么。也许,你是修复它的人之一?无论如何,这里有一个指向此类应用程序的链接:play.google.com/store/apps/…(我不知道他们的代码是否开源,我只是发布此评论以替换和修改我之前的评论)。 可能是等待时间延长请求 (WTX)?\ 【参考方案1】:在第一个 APDU 响应中,您可能会从芯片中获取 FCP 和 FCI 数据。这很奇怪,因为您明确告诉应用程序您不想要它(通过在您发送的 SELECT by NAME APDU 中指定 P2=0C
)。
返回的是 ASN.1 编码,请查看链接 here。这些字节的解释在 ISO/IEC 7816-4 中。您可能需要以某种方式获得该标准。
对于获取挑战,您指定一个值为00
的Le。这转换为值为 256 的 Ne。由于 Ne 是 最大 大小,因此您基本上要求 eMRTD 返回它可以返回的所有内容,最多 256 个字节。你得到的 22 个字节 (+9000
) 是民用的,它本可以返回完整的 256 个字节。通常您需要 8 个字节的挑战,因此请尝试将 Le 设置为 08
。
值得注意的是,这一切都在 ISO/IEC 7816-4 级别,因此您的 ISO/IEC 14443 B 类代码可能没问题。
【讨论】:
非常感谢您的回复,是的,您是正确的,额外的字节是文件控制信息(JS解码器的链接很好,谢谢!) 非常感谢您的回复,它提示我查看我的一些十六进制转储跟踪,您是对的,由于我的代码中的长度错误,我没有发送正确的字节数。我发送的是 00 84 00 00 ,因此长度错误!我会清理它并发布结果以上是关于美国护照机读旅行证件中的 B 型 NFC 芯片的主要内容,如果未能解决你的问题,请参考以下文章