我正在尝试阅读2010年发行的美国护照。它有一个使用B型调制的NFC芯片。大多数国家使用A型,所以我现在只是第一次尝试B型。
我使用的是恩智浦PN532 NFC控制器。我正在使用inCommunicateThru指令而不是inDataExchange,因为我需要手动控制超时和错误处理,以成功与此型号NFC控制器上的B型芯片通信。我必须自己实现ISO-14443-4协议的部分内容,例如PCB,CID和CRC字节,但它似乎有效。我可以从标签中选择应用程序并请求挑战nonce。
问题是,即使没有预期的返回数据,也会在SW1 SW2字节之上返回大量额外数据。例如,响应选择的MRTD应用程序命令(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 8B 12 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 90 00
然后我尝试通过发送Type 4B Frame来获得挑战nonce:
- > 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命令很奇怪这个护照在那个设置Le到0x08,根据ICAO规范产生6700错误,但是Le = 0x00,返回了太多字节。使用inDataExchange(不是在CommunicateThru中)来获得挑战(例如,我得到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美国机场护照检疫通讯中的特质是什么?
答案 0 :(得分: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类代码可能还不错。