KitKat:如何将APDU路由到SIM卡

时间:2014-01-14 09:52:27

标签: android nfc android-4.4-kitkat apdu hce

我想将从NFC读卡器获得的APDU路由到SIM卡。根据{{​​3}},我认为只需通过创建具有相应路由条目的OffHostApduService(我做过)就可以实现。

可悲的是,SIM似乎没有获得任何APDU。 SELECT-SIM由SIM-Reader直接连接到我的工作站时使用的命令返回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的路由处于活动状态时,Android操作系统不应该知道,并且向SIM发送选择或其他命令。 / p>

每次从阅读器的NFC区域移除手机时,都会收到以下错误:

01-14 10:46:48.791: E/BrcmNfcNfa(1009): UICC[0x0] is not activated

我尝试跟踪此错误的原因并找到了似乎属于Broadcom NFC驱动程序的文件external/libnfc-nci/src/nfa/ce/nfa_ce_act.chere

我认为错误是应用程序无法为APDU设置正确的路由,因为驱动程序认为SIM未被激活。在我发送命令的那一刻,SIM卡被解锁(PIN输入),但我怀疑这与它有什么关系,因为我不需要在读卡器中使用它之前解锁SIM卡。

我使用Nexus 5进行测试。是否有人有经验和/或工作示例,其中APDU可以路由到SIM而不是CPU?

3 个答案:

答案 0 :(得分:5)

快速检查(分析插入设备的UICC的SWP引脚上的信号)显示Nexus 5 激活SIM作为NFC安全元件(无论是在启动时还是在将手机放在智能卡读卡器上。)

但是,我在设备的系统分区上找到了两个有趣的文件:

  • /system/etc/libnfc-brcm-20791b05.conf
  • /system/etc/libnfc-brcm.conf

这两个文件似乎提供了NFC控制器的配置(第一个是芯片特定配置,第二个是芯片系列特定配置?)。

解锁引导程序后,我可以通过启动clockworkmod恢复映像来修改这些文件,所以我做了一些配置参数试验。

结果是我设法让设备激活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支持的评论。

答案 1 :(得分:3)

自从我上次在Android上使用卡模拟但是AFAIK(我可能错了)已经有一段时间了,安全元素访问(内部或内部SIM)尚未向所有开发人员开放(without some hacking)。关于SE控制的许多非技术问题似乎尚未解决(谁是电信公司或服务提供商最大的问题?)。

有消息称谷歌采用了与KitKat及其HCE不同的方法,基本上是在没有硬件安全元素的情况下实现NFC卡仿真模式。恕我直言,这基本上打破了有趣的卡仿真模式应用所需的安全性:电子支付,票务,身份验证等Nexus 5 lacks such secure element我怀疑谷歌将通过放宽对SIM内部安全元素的访问来迎合运营商,所以我猜测仍然无法通过库存固件将APDU发送到SIM卡。

答案 2 :(得分:2)

如果您将以下内容添加到/etc/libnfc-brcm.conf

DEFAULT_ISODEP_ROUTE=0xF3 

UICC将接收APDU

您还需要libnfc-brcm.conflibnfc-brcm-20791b05.conf

中的所有修改above

直到Jelly Bean 4.3,通常的方法是使用nfc_extras及其方法CardEmulationRoute (<route>, <nfcEe>)将UICC路由到RF。 但是在KITKAT上,通过DEFAULT_ISODEP_ROUTE进行的这种残酷修改足以启用UICC卡仿真。