android - 奇巧 : How to route APDUs to the SIM

标签 android nfc android-4.4-kitkat apdu hce

我想将从 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/

相关文章:

android - Google 会推出 Android Kitkat 的安全更新吗?

android - 是否有开源 Android 应用公开其崩溃报告?

Android:ExoPlayer:从 DefaultHttpDataSource 创建 MediaSource

java - 使用JRuby直接调用Android Java方法

android - onNewIntent() 上的 NFC 标签为空

java - 检测用户何时将其 Android 设备连接到电视

Android - 如何在 API 级别 4 的 android WebViewClient 中拦截表单 POST

java - 是否有扩展/重写私有(private)类/方法的替代方案?

Android 响应 PN532 InListPassiveTarget

android - MonkeyTalk (2.0.4) Android (KitKat) - ActionBar 溢出菜单支持吗?