1. 程式人生 > >在Android中訪問內建SE和基於SE的卡模擬(二)

在Android中訪問內建SE和基於SE的卡模擬(二)

改變SE工作模式

在NfcAdapterExtras類中,有兩個關於卡模擬的函式,getCardEmulationRoute和setCardEmulationRoute,分別用於得到和設定卡模擬工作模式,其中getCardEmulationRoute返回一個CardEmulationRoute類物件,而setCardEmulationRoute需要構造一個CardEmulationRoute類物件作為引數。

CardEmulationRoute類為NfcAdapterExtras中定義的內部類,主要包括:

     nfcEe 
          The NFcExecutionEnvironment that is Card Emulation is routed to.

由於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資料。

[[email protected]]# ./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一般有自鎖功能,因此暴力破解是很困難的。

OK,感謝你看完這篇晦澀的文章,希望能有所幫助,如果有錯誤,請指正。本文主要參考:

http://nelenkov.blogspot.com/2012/08/accessing-embedded-secure-element-in.html

http://nelenkov.blogspot.com/2012/08/android-secure-element-execution.html

相關推薦

Android訪問SE基於SE的卡模擬

改變SE工作模式 在NfcAdapterExtras類中,有兩個關於卡模擬的函式,getCardEmulationRoute和setCardEmulationRoute,分別用於得到和設定卡模擬工作模式,其中getCardEmulationRoute返回一個CardEmul

jqueryappend、prepend, beforeafter方法的區別

1.append()與after() 這兩個都是在元素的後面插入內容,不同的是前者是在元素內部插入(作為該元素的子元素),後者是在元素外部插入(作為該元素的兄弟元素);但是這裡我要講的是,當用表單驗證中用到這兩個方法時的區別:append()比較正常;而after()則會沒

ROSGazebo進行機器人模擬

一.在Gazebo中使用ROS控制器 在本節中,我們將討論如何在Gazebo中讓機器人的每個關節運動。 為了讓關節動起來,我們需要分配一個ROS控制器,尤其是,我們需要為每個關節連上一個與transmission標籤內指定的硬體介面相容的控制器。 ROS控制器主要由一套反饋機構組成,可以接受某一設定點,並用執

LRURL方式錄製基於HTML錄製指令碼

1、 如何在lr中錄製js等 在錄製設定中選擇url_base,即可 2、cookie問題? Simulate a new user on each iteration意味著每次Iteration的時候LR會把cookie和session之類的清除。所以如果指令碼中登入過程放

Android的IntentIntent-Filter詳解

 Data、Type屬性與intent-filter配置 Data屬性接收一個Uri物件作為其值,Uri物件類似於“content://com.android.contacts/contacts/#”,關於Uri的相關知識大家可以自行搜尋。 Data屬性通常

jqueryappend、prepend, beforeafter方法的區別

mod serve com oos 兄弟節點 sha pos 插入 5% 原文:http://blog.csdn.net/woosido123/article/details/64439490 在 jquery中append() 與 prepend()是在元素內插

TCP協議的三次握手四次揮手(圖解)

繼續 丟失 get 所有 如果 idt 請求報文 網絡 center 轉自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而斷開連接則需要四次握手。整個過程如下圖所示: 先來看看如

關於JS變量提升的規則原理的一點理解

cnblogs 打印 blog javascrip 誤區 down mark fun ont 上篇文章中講到變量提升和函數提升的先後順序時蒙了,後來去查了一下資料,特別整理一下。 在《你不知道的JavaScript(上卷)》一書的第40頁中寫到:函數會首先被提升,然後才是變

linux進程計劃任務的管理命令補充

blob 情況 tro 緩沖 9.png 命令 計劃 時間 image Ps命令:查看靜態的進程統計信息 Ps :不帶任何參數將只顯示當前用戶會話中打開的進程、Ps aux :將以簡單列表的形式顯示出所有進程信息註釋:User:啟動該進程的用戶賬號的名稱Pid:該進程在系

ajax post 請求 get 請求的區別

get 請求 1、傳遞資料方式: 資料直接在post 的 url 中傳遞,直接拼接在 url ? 後面,多個數據用 & 符號拼接 xhr.open('get ‘, 2.get.php?username = Tom & age = 30&’)

3.0 類的方法 3.1 類的繼承1 3.2 類的繼承2

3.0 類的內建方法 所謂內部類,就是在類的內部定義的類,主要目的是為了更好的抽象現實世界。 比如,汽車是一個類,汽車的地盤,輪胎也可以抽象為類,將其定義到汽車的類中,則形成內部類,更好的描述汽車類,因為底盤、輪胎是汽車的一部分 建立內部類的方法和建立類的方法很相似 內部類的例項化方法 方法1:直接使用外部類

3.0 類的方法 3.1 類的繼承1 3.2 類的繼承2

3.0 類的內建方法 所謂內部類,就是在類的內部定義的類,主要目的是為了更好的抽象現實世界。 比如,汽車是一個類,汽車的地盤,輪胎也可以抽象為類,將其定義到汽車的類中,則形成內部類,更好的描述汽車類,因為底盤、輪胎是汽車的一部分 建立內部類的方法和建立類的方法很相似 內部類的例項化方

python關於迭代器生成器的名詞解釋python3

迭代器協議:對有__next__方法的物件(迭代器物件)自動呼叫__next__方法,直到結尾引發stopIteration. 迭代工具:迭代工具按迭代協議處理迭代器 常見的工具有 for, list(), tuple(), str.join(), in map, sorted, zip, enumera

跨域訪問防盜鏈基本原理

二、跨域訪問基本原理 在上一篇,介紹了盜鏈的基本原理和防盜鏈的解決方案。這裡更深入分析一下跨域訪問。先看看跨域訪問的相關原理:跨網站指令碼。維基上面給出了跨站訪問的危害性。從這裡可以整理出跨站訪問的定義:JS指令碼在瀏覽器端發起的請求其他域(名)下的網站資料的HTTP請求。 這

python 資料結構的基本操作 —— tuple1

We saw that lists and strings have many common properties, such as indexing and slicing operations. They are two examples of sequen

Android應用使用百度地圖API定位自己的位置

百度地圖SDK為開發者們提供瞭如下型別的地圖覆蓋物: 我的位置圖層(MyLocationOverlay):用於顯示使用者當前位置的圖層(支援自定義位置圖示); Poi搜尋結果圖層(PoiOverlay):用於顯示興趣點搜尋結果的圖層; 路線圖層(RouteOve

python 資料結構的基本操作 —— Set1

Python also includes a data type for sets. A set is an unordered collection with no duplicate elements. Basic uses include membersh

androidEditText有游標不彈出軟鍵盤處理

if (android.os.Build.VERSION.SDK_INT <= 10) {et_input_batch_num_in.setInputType(InputType.TYPE_NULL); } else {getActivity().getWindow().setSoftInputMode

python 資料結構的基本操作 —— dict2

A mapping object maps hashable values to arbitrary objects. Mappings are mutable objects. There is currently only one standard mapp

python 資料結構的基本操作 —— list2

The list data type has some more methods. Here are all of the methods of list objects: list.append(x) Add an item to the end of t