【发布时间】: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)?\