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?

4

3 回答 3

5

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

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

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

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

解锁引导加载程序后,我可以通过启动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 支持需要取消注释。
于 2014-01-22T22:52:46.163 回答
3

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

有消息称,谷歌对 KitKat 及其HCE采取了不同的方法,主要包括实现没有硬件安全元件的 NFC 卡模拟模式。恕我直言,这基本上破坏了有趣的卡模拟模式应用程序所需的安全性:电子支付、票务、身份验证等。Nexus 5 缺乏这样的安全元素,我怀疑谷歌会通过放宽对 SIM 内安全元素的访问来迎合运营商,所以我想仍然无法使用库存固件将 APDU 发送到 SIM 卡。

于 2014-01-16T12:37:09.003 回答
2

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

DEFAULT_ISODEP_ROUTE=0xF3 

UICC 将收到 APDU

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

直到 Jelly Bean 4.3,正常的方法是使用nfc_extras和它的方法CardEmulationRoute (<route>, <nfcEe>)将 UICC 路由到 RF。但在 KITKAT 上,这种通过 DEFAULT_ISODEP_ROUTE 进行的粗暴修改足以启用 UICC Card Emulation。

于 2014-02-19T17:11:48.527 回答