KitKat:如何将APDU路由到SIM

7
我希望将来自NFC读卡器的APDU路由到SIM卡。根据HCE文档,我认为可以通过创建具有相应路由条目的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

我认为这是路由设置不正确的线索,因为我认为Android操作系统不应该意识到SIM卡路由处于活动状态,并且发送选择或其他命令到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的工作示例吗?

你好,我正在处理同类问题,但是我不知道如何将APDU路由到SIM卡,请问你能否解释一下你在我提出的问题中使用的方法吗?我正在寻找如何覆盖offHostApduService的onBind方法。非常感谢。 - Morendo
3个回答

5
快速检查(分析插入设备的UICC上的SWP引脚的信号)表明Nexus 5未将SIM卡激活为NFC安全元件(无论是在启动时还是将手机放在智能卡读卡器上都没有)。
然而,在设备的系统分区中,我找到了两个有趣的文件:
/system/etc/libnfc-brcm-20791b05.conf以及 /system/etc/libnfc-brcm.conf。
这两个文件似乎为NFC控制器提供了配置(第一个是芯片特定的配置,第二个是芯片系列特定的配置)。
解锁了bootloader后,通过启动clockworkmod恢复映像来进行adb修改这些文件,因此我做了一些配置参数实验。
结果是,我设法让设备激活了UICC(UICC通过SWP被激活并注册了其CE门),设备有时甚至会通知UICC关于场状态变化的信息。然而,在我的所有修改配置中,我都无法使读卡器顺畅地发现卡模拟(当设备只有HCE可用时,这是有效的),也无法与UICC通信。
/system/etc/libnfc-brcm.conf 中的有趣参数包括:
NFA_MAX_EE_SUPPORTED:目前设置为0。我尝试了一个值为3的值,似乎是默认值。 ACTIVE_SE:当前设置为0(没有活动的SE)。我尝试取消注释该行,以使设备使用检测到的第一个SE。 NFA_HCI_STATIC_PIPE_ID_? ?:应该不必要,但我们的GS4中此设置为0x71,??=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控制器的SWP接口(如果设置)。 NFA_DM_PRE_DISCOVERY_CFG:注释表明需要取消注释以支持UICC。

非常感谢!只有一个问题:在GS4上,UICC可以用来响应NFC命令吗?我认为这已经包含在答案中了。 - charno
2
是的,至少在我们的GS4(来自A1 Telekom Austria)上,UICC可以通过NFC空中接口以及应用处理器(通过SEEK / Open Mobile API)访问。 - Michael Roland
1
我刚才进行了一些测试,发现当将设备放到读卡器上时,通用集成电路卡(UICC)会接收到开/关场事件和激活事件。然而,这些事件会到达UICC的B类仿真门,而读卡器仅检测A类卡片(向该卡发送APDU时,它们将被转发给主机 -- 无论OffHostApduService配置如何)。 - Michael Roland

3

我已经有一段时间没有在Android上使用卡模拟了,但据我所知(我可能错了),安全元素访问(内部或SIM内部)尚未向所有开发人员开放(除非进行某些黑客攻击)。关于SE控制的许多非技术问题似乎尚未得到解决(谁将获得最大的份额,电信运营商还是服务提供商?)。

消息是,Google采用了与KitKat不同的方法和其HCE,它基本上是通过实现没有硬件安全元素的NFC卡模拟模式来实现的。在我看来,这基本上破坏了有趣的卡模拟模式应用所需的安全性:电子支付、售票、身份验证等。 Nexus 5缺少这样的安全元素,我怀疑Google会迎合运营商,放松对SIM内部安全元素的访问,因此我认为仍然无法使用股票固件向SIM发送APDU。


2
如果您将以下内容添加到/etc/libnfc-brcm.conf
DEFAULT_ISODEP_ROUTE=0xF3 

UICC将接收APDU命令。

您还需要在 libnfc-brcm.conflibnfc-brcm-20791b05.conf 中进行所有修改,参考此链接

在Android 4.3及以下版本,通常使用 nfc_extras 库和其方法 CardEmulationRoute (<route>, <nfcEe>) 来将UICC路由到射频(RF)模块。 但是在KITKAT上通过DEFAULT_ISODEP_ROUTE的暴力修改就足够启用UICC卡模拟功能。


1
谢谢。我还没有测试过,但相信你。这是单向更改(破坏HCI),还是路由会按照文档工作? - charno
你好,能告诉我这个是否有效?还有其他手机也适用吗? - Arjun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接