我想将从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?
答案 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.conf
和libnfc-brcm-20791b05.conf
直到Jelly Bean 4.3,通常的方法是使用nfc_extras
及其方法CardEmulationRoute (<route>, <nfcEe>)
将UICC路由到RF。
但是在KITKAT上,通过DEFAULT_ISODEP_ROUTE进行的这种残酷修改足以启用UICC卡仿真。