我想将从 NFC 读卡器获取的 APDU 路由到 SIM 卡。根据HCE documentation我认为只需创建一个带有相应路由条目的 OffHostApduService 即可(我这样做了)。
遗憾的是,SIM 卡似乎没有收到任何 APDU。当 SIM 卡通过 SIM 卡读取器直接连接到我的工作站时有效的 SELECT 命令返回 6a82(未找到文件)。
在 LogCat 中我发现了两个有趣的信息:
每次我发出应该路由到 SIM 的选择命令时,我都会得到这些条目:
01-14 10:44:18.501: D/BrcmNfcJni(1009): RoutingManager::stackCallback: event=0x17
01-14 10:44:18.501: D/BrcmNfcJni(1009): RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=12
01-14 10:44:18.501: D/HostEmulationManager(1009): notifyHostEmulationData
我认为这是路由设置不正确的线索,因为我认为当到 SIM 卡的路由处于 Activity 状态时,Android 操作系统不应该知道,并且向 SIM 卡发送了选择或其他命令。
每次我从阅读器的 NFC 场中取出手机时,我都会收到以下错误:
01-14 10:46:48.791: E/BrcmNfcNfa(1009): UICC[0x0] is not activated
我试图追踪这个错误的原因,发现文件 external/libnfc-nci/src/nfa/ce/nfa_ce_act.chere
似乎属于 Broadcom NFC 驱动程序。
我认为错误是应用程序无法为 APDU 设置正确的路由,因为驱动程序认为 SIM 未激活。在我发送命令的那一刻,SIM 卡被解锁(PIN 码输入),但我怀疑这与它有什么关系,因为我在读卡器中使用 SIM 卡之前不必解锁它。
我使用 Nexus 5 进行测试。有没有人有经验和/或可以将 APDU 路由到 SIM 而不是 CPU 的工作示例?
最佳答案
快速检查(分析插入设备的 UICC 的 SWP 引脚上的信号)显示 Nexus 5 未将 SIM 激活为 NFC 安全元件(无论是在启动时还是在将手机放在智能卡读卡器上)。
但是,我在设备的系统分区上发现了两个有趣的文件:
/system/etc/libnfc-brcm-20791b05.conf
和/system/etc/libnfc-brcm.conf
。
这两个文件似乎提供了 NFC Controller 的配置(第一个是特定于芯片的配置,第二个是特定于芯片系列的配置?)。
解锁引导加载程序后,我能够通过引导 clockworkmod 恢复镜像通过 adb 修改这些文件,因此我对配置参数进行了一些试验。
结果是我设法让设备激活了UICC(UICC被激活并通过SWP注册了它的CE gates?),设备有时甚至会通知UICC字段状态变化。然而,在我没有修改任何配置的情况下,我能够让读卡器顺利地发现卡仿真(这在以前是有效的,当时设备上只有 HCE 可用),也无法与 UICC 通信。
/system/etc/libnfc-brcm.conf
中有趣的参数似乎是:
NFA_MAX_EE_SUPPORTED
:当前设置为 0。我尝试将值设为 3,这似乎是默认值。ACTIVE_SE
:当前设置为 0(无 Activity SE)。我试图取消对该行的注释,让设备使用检测到的第一个 SE。NFA_HCI_STATIC_PIPE_ID_??
:应该没有必要,但在 GS4 上,它被设置为 0x71 for ?? = F3 和 F4。UICC_LISTEN_TECH_MASK
:这在我们的 GS4 上设置为 0x00。REGISTER_VIRTUAL_SE
:我保留原样(== 注释掉)。SCREEN_OFF_POWER_STATE
:我没有对此进行试验,但在我们的 GS4 上它设置为 3(屏幕关闭 CE)。
/system/etc/libnfc-brcm-20791b05.conf
中有趣的参数似乎是:
NFA_DM_START_UP_CFG
:我已经为 UICC 尝试了注释掉的参数,并且尝试使用我们 GS4 的配置。该值以一个长度字节开始,并以 TLV 格式(一个标记字节、一个长度字节、参数数据)构成。 UICC 激活的相关标签似乎是C2
,其中第二个参数字节的高两位禁用 NFC Controller 的 SWP 接口(interface)(如果设置)。NFA_DM_PRE_DISCOVERY_CFG
:注释表明需要取消注释以支持 UICC。
关于android - 奇巧 : How to route APDUs to the SIM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110392/