ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android中访问内置SE和基于SE的卡模拟

2021-07-07 20:33:29  阅读:272  来源: 互联网

标签:内置 NFC route SE UICC Android 模拟


  我们已经了解,NFC RF模块可以支持卡模拟工作方式,而且可以通过两种方式实现卡模拟,

一种是基于硬件的,被称为虚拟卡模式(Virual Card Mode);

一种是基于软件的,被称为主机卡模式(Host Card Mode)。

无论哪种方式,都是NFC RF模块将外部读写器的指令转发到相关的处理模块,SE或手机上的应用程序,然后将回复信息发回外部读写器。

  本文不讨论基于软件的方式,因为在Android中,必须修改相关固件以支持该功能,也就是必须使用第三方ROM,例如Cyanogenmod。本文的重点是,如果使用硬件SE的方式,我们是否能够做到:

  1, 从手机内部访问SE,建立手机应用程序与SE之间的通讯连接并发送命令。

  2, 将NFC模块和SE置于卡模拟工作方式,使用外部读写器中的命令转向SE。

  3, 在SE中安装自己的应用,实现最终的卡模拟。

  这里先预告一下本文的结论,以免浪费大家的时间,在目前看来,没有SE密钥的用户,只能在特定条件下实现功能1和2,而功能3则是不可能的。而功能1和2的条件对一般用户也是非常苛刻的,包括手机支持NFC,并且SE为内置SE或SWP-SIM,手机已经ROOT,

  Android版本在Android 4.0.4 (API Level 15)上,而且因为用到了一些未公开类,所以不能保证在今后的版本中还能使用。(经测试这些未公开类在目前最新版本4.3中还可以工作)。

  当然,深入讨论需要更多的专业知识,包括Android编程,智能卡等,虽然不需要全部精通,但至少有所了解。

  SE硬件形态

  SE是一个CPU卡,可以运行智能卡应用程序(称为小应用或卡应用)。一个智能卡从本质上讲就是在单一芯片上的微型计算环境,具有完备的CPU,ROM,EEPROM,RAM和I/O接口。一般智能卡还具有密钥算法协处理器,可以支持常用的加解密算法,例如DES,AES和RSA等。智能卡通过多种技术实现抗攻击特性,很难通过分解或分析芯片提取数据。事实上手机用户对SE都不陌生,因为手机的SIM卡本身就是一个SE(技术上讲只能在GSM中叫做SIM卡,更通用的应该叫做UICC)。

  SE可以有多种集成形态:UICC,内置SE或在SD插槽上的插卡。本文主要讨论内置SE的方式,但首先简要了解一下其它形态的SE。

  UICC形式的SE

  普通的UICC仅仅和手机中的基带处理器相连,但基带处理器与运行Android的应用处理器是分离的,因此不能通过Android应用程序直接访问。所有的通讯需要通过射频界面层Radio Interface Layer (RIL),这是与基带处理器的IPC界面。UICC SE的通讯基于扩展AT命令 (AT+CCHO,AT+CCHC, AT+CGLA等),在目前Android中的telephony manager不支持。目前还没有能够通过RIL访问UICC SE的标准方式(尽管有些带有定制化固件的商业设备据说支持这种方式),因为这个原因,普通的UICC并不适合NFC应用。还有一种方法是使用Single Wire Protocol (SWP)方式,SWP类型的UICC通过SWP连接到NFC控制器,目前很多移动支付都使用该方式,只要手机支持NFC功能,就可以通过更换UICC实现移动支付应用。

  SD卡形式

  另一种形态是AdvancedSecurity SD card (ASSD),本质上是一个带有嵌入式SE芯片的SD卡。将SD卡插入Android设备SD插槽,并运行一个SEEK补丁过的Android版本,可以通过SmartCard API访问SE。但是并不是所有手机都具有SD插槽,因此ASSD方式不太可能成为主流。

  内置SE模式

  正如其名,内置SE是设备主板的一部分,并作为NFC芯片的专用芯片,或者干脆集成为NFC芯片的一部分,因此内置SE不能从手机上移除。第一个支持内置SE的设备是Nexus S,这款手机也是首款支持NFC的Android手机。我们实验用的设备,Galaxy Nexus,带有内置的NXP PN65N 芯片,该芯片在一个单独的封装中集成了一个NFC射频控制器和一个SE(NXP SmartMX系列的P5CN072)。下图为P5CN081的硬件架构图,由于没有找到P5CN072的图,用P5CN081代替,它们之间的区别仅仅是EEPROM大小不同。

改变SE工作模式

在NfcAdapterExtras类中,有两个关于卡模拟的函数,getCardEmulationRoute和setCardEmulationRoute,分别用于得到和设置卡模拟工作模式,其中getCardEmulationRoute返回一个CardEmulationRoute类对象,而setCardEmulationRoute需要构造一个CardEmulationRoute类对象作为参数。

CardEmulationRoute类为NfcAdapterExtras中定义的内部类,主要包括:

 NfcExecutionEnvironment

     nfcEe 
          The NFcExecutionEnvironment that is Card Emulation is routed to.

 int

     route 
          A route such as ROUTE_OFF or ROUTE_ON_WHEN_SCREEN_ON.

由于CardEmulationRoute是一个内部类,我们甚至不能用类名反射得到类定义,只能从NfcAdapterExtras类中提取,由于NfcAdapterExtras中只有一个内部类,我们可以简单的取第一个即可。通过构造CardEmulationRoute类,可以将相关SE设置为ROUTE_OFF或ROUTE_ON_WHEN_SCREEN_ON,即卡模拟关闭和卡模拟在屏幕开启时打开。以下 具体的实现:

int  routeOption = ROUTE_ON_WHEN_SCREEN_ON;

 //Get route inner class

Class nfcAdapterExtrasClazz =Class.forName("com.android.nfc_extras.NfcAdapterExtras");

Class[]  innerClazz =nfcAdapterExtrasClazz.getDeclaredClasses();

Constructor clazzConstuctor = innerClazz[0].getConstructor(Integer.TYPE,Class.forName("com.android.nfc_extras.NfcExecutionEnvironment"));

Object route = clazzConstuctor.newInstance(routeOption, se);

 //Setcard emulation route

Method setCardEmulationRouteMethod = nfcExtras.getClass().getMethod("setCardEmulationRoute",innerClazz[0]);

setCardEmulationRouteMethod.invoke(nfcExtras,route);

通过这些代码,我们可以将得到的SE(NFcExecutionEnvironment)设为卡模拟模式,

相应的,通过

int routeOption = ROUTE_OFF;

Object route =clazzConstuctor.newInstance(routeOption, null);

setCardEmulationRouteMethod.invoke(nfcExtras,route);

可以关闭卡模拟模拟。

如果不进行模式设置,使用getCardEmulationRoute得到的CardEmulationRoute中,NFCEE为空,状态为ROUTE_OFF,可见缺省状态下,卡模拟为关闭,且不关联到任何NFCEE上。

Object cardEmulationRoute = getCardEmulationRouteMethod.invoke(nfcExtras, null);

Field route = cardEmulationRoute.getClass().getDeclaredField("route");

Object r= route.get(cardEmulationRoute);

return Integer.parseInt(r.toString());

为了检查手机是否真正工作在卡模式下,我们需要一个读写器。注意不能用另外一个NFC手机,因为NFC手机之间总是优先使用NFC的P2P模式,而不会使用读写器-卡模式工作。

以下是使用读写器读取的例子

GALAXY NEXUSI9250                           

ISO/IEC 14443A(106 kbps) target:                                                                              

ATQA (SENS_RES):00  02                                                                                     

UID (NFCID1):2f  8a c6  99                                                                               

SAK (SEL_RES):38                                                                                            

ATS: 78  80 70  02  00 31  c1  73 c8  40  00 00  90  00     

可见模拟卡的UID为2f 8a c6 99,符合ISO14443-4协议。

再选择空的AID,能够得到从内部访问同样的GP数据。

[root@TestAgmnewDisk]# ./readnfccc

SELECT_APP-------------------------106

< 6f658408a000000003000000a5599f6501ff9f6e06479100783300734a06072a864886fc6b01600c060

a2a864886fc6b02020101630906072a864886fc6b03640b06092a864886fc6b040215650b06092b8510

864864020103660c060a2b060104012a026e01029000

在SE中添加应用以实现自己的卡模拟

         既然我们建立了与SE的连接,是否就可以安装应用了呢?当然不是,如果这样,SE也没有安全性可言了。前面提到SE是一个CPU卡,一般符合GP标准。GP标准的目的就是支持卡上的多应用的同时,保证卡内容的安全。

SE的发行者拥有GP卡管理器的密钥,即主安全域(ISD)密钥,可以进行辅助安全域和应用的创建和安装。

为了让不同的应用提供商都可以使用SE上的空间,应用提供商可以向SE发行者申请,建立辅助安全域,并通过密钥转换,控制一部分SE空间,并进行应用的下载/更新/删除。为了在后台自动完成这些流程,就需要一个代理中介实现,即所谓的授信服务管理器(Trusted Service ManagerTSM)。SE发行者通过建立发行者TSM(SE-TSM),提供对其拥有的SE的操作。应用提供商通过与SE发行者的达成合作协议,实现自己应用的下载安装。

因此,目前有以下几种方式可以获得在SE上安装应用的权力:

1,  自行发卡,自己控制SE的主密钥。

2,  从SE发行者得到密钥,在一般情况下,SE发行者是不可能提供这些密钥的,但是有些开发测试机是公开密钥的,以便提供给应用合作伙伴进行测试。

3,  不获取密钥,而是通过SE-TSM代理完成。

4,  破解,但由于SE一般有自锁功能,因此暴力破解是很困难的。

标签:内置,NFC,route,SE,UICC,Android,模拟
来源: https://blog.csdn.net/u010783226/article/details/118555891

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有