与机读旅行证件交互时,Android 台设备的不同响应

Different responses across a selection of Android devices when interacting with MRTD

我目前正在开发一个 Android 应用程序来读取电子护照和其他支持 NFC 的文档。

我已经在多台 Android 设备上测试了代码,但发现其中 1 台无法成功读取文档。

以电子护照为例,它正确传达了Select应用程序调用和return状态码90 00。 我也得到了一个有效的 BAC 质询,但是当我调用 EXTERNAL AUTHENTICATE 时,它 returns 状态代码为 69 86(不允许命令(没有当前 EF))。我所有其他测试 phones return 状态码 90 00.

我的问题是为什么 phone 的单一模型给我不同的 APDU 响应。我试图阅读 Android 中的 NFC 硬件,但没有找到关于为什么会发生这种情况的答案。我只能假设这可能是一个协议问题?

如果有人能对此有所说明,我将不胜感激。

在不分析实际通信的情况下,只能推测那里发生了什么。但是,有两个潜在原因:

  1. 您遇到的情况,可能是由 Android 标记存在检查机制引起的。默认情况下,如果您发送命令的速度不够快,Android 会将您的通信与其存在检查机制交织在一起。在某些设备上,此存在性检查使用在基本逻辑通道上发送的 APDU。因此,它们由护照上的机读旅行证件申请接收和处理,并可能导致状态变化。参见 Android IsoDep command chaining failure

  2. 机读旅行证件上的加密操作比其他操作需要更多的功能。如果您的护照需要的电量超过该特定测试设备提供的电量(请记住,NFC 手机设计用于读取低功率 NFC 标签,而不是与能量贪婪的非接触式智能卡交互),与护照的通信可能会丢失,或者在最坏的情况,可能会导致智能卡应用程序发生意外状态更改(尽管智能卡芯片通常设计为在这些情况下强制执行重置)。