我目前正在开发一个Android应用程序,可以读取电子护照和其他支持NFC的文档。
我已经在多个Android设备上测试了代码,但发现其中一个在阅读文档时不成功。
以电子护照为例,它正确地传达了选择应用程序调用并返回状态代码90 00。 我也获得了有效的BAC质询,但是当我调用EXTERNAL AUTHENTICATE时,它会返回状态代码69 86(不允许命令(无当前EF))。我所有的其他测试手机都返回状态码90 00
我的问题是为什么单一型号的手机给我一个不同的apdu响应。我试图阅读android内部的NFC硬件,但还没有找到答案,为什么会发生这种情况。我不得不假设这可能是一个协议问题?
如果有人能对此有所了解,我将非常感激。
答案 0 :(得分:1)
如果不分析实际的通信,则只能推测那里发生了什么。但是,有两个潜在原因:
您的体验可能是由Android标签存在检查机制引起的。默认情况下,如果您发送命令的速度不够快,Android会通过其状态检查机制来使您的通信交错。在某些设备上,此状态检查使用在基本逻辑信道上发送的APDU。因此,它们会被护照上的MRTD应用程序接收和处理,并可能导致状态更改。参见Android IsoDep command chaining failure。
机读旅行证件上的加密操作比其他操作需要更多的功能。如果您的护照需要的电力超过该特定测试设备提供的电力(请记住,NFC电话被设计为读取低功率NFC标签并且不与能量贪婪的非接触式智能卡进行交互),则与护照的通信可能会丢失,或者在最坏的情况是,这可能会导致智能卡应用程序发生意外状态更改(尽管通常将智能卡芯片设计为在这些情况下强制进行重置)。