1. 程式人生 > >Android API Guides---Host-based Card Emulation

Android API Guides---Host-based Card Emulation

source 過程 特定 裏的 term 安裝 visa 保護 action

Host-based Card Emulation

很多提供NFC功能的Andr??oid手機已經支持NFC卡模擬。在大多數情況下。該卡是由在該裝置的單獨芯片仿真,稱為安全元件。

無線運營商提供了非常多的SIM卡還包括一個安全元件。


Android 4.4系統的介紹卡仿真的一個額外的方法,不涉及安全的元素,稱為基於主機的卡仿真。

這同意不論什麽Android應用程序來模擬卡。並直接交談的NFC讀取器。本文介紹了基於主機的卡模擬(HCE)怎樣適用於Android以及怎樣開發模擬使用這樣的技術的NFC卡的應用程序。




卡仿真與安全元素


當使用一個安全元件提供的NFC卡模擬。要被模仿的卡通過Android應用程序供應到設備上的安全元件。

然後。當用戶將器件保持在的NFC終端中,NFC控制器在設備路由來自讀取器直接到安全元件的全部數據。圖1示出了這個概念。


技術分享

圖1. NFC卡模擬與安全元件。


安全元件本身運行與NFC終端的通信。而且沒有Android應用是參與交易的。該交易完畢後,Android應用程序能夠直接查詢安全元件的交易狀態,並通知用戶。




基於主機的卡仿真


當NFC卡使用基於主機的卡模擬仿真,數據被路??由到其上Android應用直接執行的主機的CPU,而不是路由NFC協議幀的安全元件。圖2顯示了基於主機的卡仿真怎樣工作的。

技術分享

圖2. NFC卡模擬沒有一個安全元件。


支持NFC卡和協議
圖3. Android的HCE協議棧。


在NFC標準提供很多不同的協議的支持,而且有可模擬不同類型的卡。
Android 4.4系統支持多種協議,今天在市場上非經常見。很多現有的非接觸式卡已經依據這些協議,如非接觸式支付卡。這些協議也被當今市場上的很多讀者NFC。包含Android NFC設備作為讀者工作本身(見IsoDep類)的支持。

這使您能夠構建和部署各地HCE僅僅使用Android手機的終端到終端的NFC解決方式。


詳細地。機器人4.4支架模擬卡,基於NFC的論壇的ISO-DEP規範(依據ISO / IEC 14443-4)和如在ISO / IEC 7816-4規格定義的過程的應用協議數據單元(PDU)。 Android的授權僅僅在NFC-A(ISO / IEC 14443-3 A型)技術之上模仿ISO-DEP。對於NFC-B(ISO / IEC 14443-4 B型)的技術支持是可選的。全部這些規範的分層顯示在圖3中。
HCE服務
在Android上的HCE架構基於Android的左右Service組件(稱為“HCE服務”)。

一個的服務的主要長處是。它能夠在沒有不論什麽用戶界面的後臺執行。

這是天作之合很多HCE應用,如忠誠或過境卡。與用戶應該不須要啟動的應用程序來使用它。相反,輕敲設備對NFC讀取器啟動正確的服務(假設沒有執行),並在後臺執行事務。當然,你能夠自由地從服務推出很多其它的UI(如用戶通知)假設是有道理的。


服務選擇
當用戶點擊一個設備的NFC讀寫器,Android系統須要知道HCE服務的NFC讀卡器竟然想跟。這就是ISO / IEC 7816-4規格進來:它定義了一種方法來選擇應用程序。環繞一個應用程序ID(AID)居中。援助最多由16個字節。假設你是模擬卡現有的NFC閱讀器的基礎設施。艾滋病。這些讀者都在尋找一般知名及公開註冊的(比如。支付網絡。如Visa和萬事達卡的艾滋病)。
假設你想為自己的應用程序部署新的基礎設施的讀者。您將須要註冊自己的AID(S)。

艾滋病的註冊過程在ISO / IEC 7816-5規範中定義。

谷歌建議。假設你正在為Android部署HCE申請註冊一個AID按7816-5,由於這將避免與其它應用程序沖突。


援助團體
在一些情況下,HCE服務可能須要註冊多個艾滋病實現一定的應用。它須要以確保它是全部這些艾滋病的默認處理(相對於該組中的一些艾滋病到還有一個服務) 。
一個AID基是艾滋病的列表應被視為由OS一起屬於。對於AID組中的全部艾滋病,Android的保障下列之中的一個:
該組中的全部艾滋病被路由到該HCE服務
該組中沒有艾滋病被路由到這個HCE服務(比如,因為用戶優選的哪個請求的一個或多個艾滋病的組中的還有一個服務以及)
換句話說,沒有中間狀態,當中,該組中的某些助劑能夠被路由給一個HCE服務。一些到還有一個。
援助團體和類別
每一個AID基團可與一個類別相關聯。這使得Android的分組HCE服務結合在一起按類別,而這又使用戶能夠在類別級別而不是AID級別設置默認值。

普通情況下。避免在您的應用程序的不論什麽面向用戶的部分提的艾滋病:他們並不意味著不論什麽普通用戶。
Android 4.4系統支持兩類:CATEGORY_PAYMENT(包含行業標準的支付應用程序)和CATEGORY_OTHER(對於全部其它應用HCE)。
註意:僅僅有一個在CATEGORY_PAYMENT類別AID基團能夠在該系統中的不論什麽給定的時間被激活。通常情況下,這將是了解基本的信用卡支付protcols並能夠在不論什麽商戶工作的應用程序。
對於閉環支付應用程序,僅僅在一個商人的工作(如儲值卡),你應該使用CATEGORY_OTHER。此類別中的AID團能夠是總是活動的,而且能夠在必要時通過NFC閱讀器的AID選擇期間給予優先權。
實現一個HCE服務
要使用基於主機的卡仿真模擬的NFC卡,你須要創建一個處理NFC交易服務組件。
檢查HCE支持
您的應用程序能夠檢查通過檢查FEATURE_NFC_HOST_CARD_EMULATION功能的設備是否支持HCE。

您應該使用<用途特征>標簽在你的應用程序的清單,宣布你的應用程序使用HCE功能。它是否須要為應用程序的功能或沒有。


服務實現
Android 4.4系統配備了便民服務類,它能夠被用來作為一個基礎,實現HCE服務:HostApduService類。
因此。第一步驟是擴展HostApduService。

public class MyHostApduService extends HostApduService {
    @Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
       ...
    }
    @Override
    public void onDeactivated(int reason) {
       ...
    }
}
HostApduService聲明須要重寫和實施兩個抽象方法。
流程CommandApdu()當一個NFC讀寫器發送一個應用協議數據單元(APDU)到您的服務調用。

的APDU是在ISO / IEC 7816-4規格定義為好。 APDU的是NFC讀寫器和您的HCE服務之間交換的應用級的數據包。這樣的應用層協議是半雙工的:在NFC讀寫器會送你一個APDU命令,它會等待你的回報發送響應APDU。
註:ISO / IEC 7816-4規範還定義了多個邏輯通道。在那裏你能夠在不同的邏輯通道多路並行APDU交換的概念。

然而。Android的HCE實現僅僅支持一個單一的邏輯通道。所以有唯一的APDU單線程交流。
正如前面提到的。Android使用的AID來確定讀者想與哪個HCE服務。

典型地,第一APDU的NFC讀取器發送至設備是一個“SELECT AID”APDU;這個APDU包括了讀者想要交談的幫助。

Android的提取從APDU AID,它解析為HCE服務,那麽APDU到解決服務前鋒。
您能夠通過從processCommandApdu返回響應APDU的字節發送響應APDU()。註意,此方法將您的應用程序,它不應該被阻止的主線程中調用。所以,假設你不能立即計算並返回響應APDU。返回null。然後,您能夠做還有一個線程必要的工作。並使用在HostApduService類中定義的sendResponseApdu()方法來發送響應。當你完畢。
Android將保持從讀者服務的新轉發的APDU,直到:
在NFC讀取器發送還有一個“SELECT AID”APDU。該操作系統解析為不同的服務;
在NFC讀寫器和設備之間的NFC鏈路中斷。
在這兩種情況下,你的類onDeactivated()實現調用參數指示哪個兩個發生了。
假設您正在使用現有的基礎設施讀者工作。你須要實現現有應用級協議。讀者在你的HCE服務的期望。


假設您正在部署,你控制,以及新的讀者基礎設施,您能夠定義自己的協議和APDU序列。一般試圖限制的APDU的量和須要被交換的數據的大小:這使得確保用戶將僅僅須要在NFC讀取器持有他們的設備的時間短量。

一個理智的上限是數據。這通常300ms以內進行交換約1KB。


服務清單申報和登記AID
你的服務必須在清單照常被聲明,但一些附加件必須被加入到該服務聲明為好。
首先,要告訴這個平臺,這是實現HostApduService接口的HCE服務。您的服務聲明必須包括SERVICE_INTERFACE操作的意圖過濾器。
另外。告訴這是由該服務要求艾滋病群體平臺,SERVICE_META_DATA <元數據>標簽必須包括在服務的聲明,指出有關的HCE服務的附加信息的XML資源。
出口屬性設置為true,並要求在服務聲明中的“android.permission.BIND_NFC_SERVICE”權限:最後,你必須在Android設置。前者能夠確保該服務能夠通過外部應用程序綁定。

後者則強制運行該舉辦“android.permission.BIND_NFC_SERVICE”僅僅同意外部應用程序能夠綁定到你的服務。因為“android.permission.BIND_NFC_SERVICE”是一個系統的權限。這有效地強制運行,僅僅有Android操作系統能夠綁定到你的服務。


這裏有一個HostApduService艙單申報的例??子:

<service android:name=".MyHostApduService" android:exported="true"
         android:permission="android.permission.BIND_NFC_SERVICE">
    <intent-filter>
        <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
    </intent-filter>
    <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
               android:resource="@xml/apduservice"/>
</service>
這種元數據標記指向一個APDU service.xml文件。

與含有兩個專有艾滋病單個AID組聲明這種文件的一個樣例例如以下所看到的:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
               android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>
他<主機-APDU服務>標簽必須包括<安卓說明>包括了能夠在用戶界面中顯示的服務的用戶友好的描寫敘述屬性。該requireDeviceUnlock屬性能夠用來指定設備必須解鎖之前該服務能夠被調用來處理APDU的。


在<主機-APDU服務>必須包括一個或多個<援助團>標記。每一個<援助團>標簽要求:


包括一個機器人:包括AID組的一個用戶友好的描寫敘述。適合在UI顯示描寫敘述屬性。


有它的android:類屬性設置為指示AID集團所屬。比如類別通過CATEGORY_PAYMENT或CATEGORY_OTHER定義字符串常量。
每一個<援助組>必須包括一個或多個<援助濾波器>標記。每一個都包括一個幫助。

援助必須以十六進制格式指定,並包括偶數個字符。
最後要註意。你的應用程序也須要持有NFC權限才幹作為HCE服務註冊。


AID解決沖突


多個HostApduService部件能夠被安裝在單個設備上,和同樣的AID能夠由一個以上的服務進行註冊。

Android平臺的解決依賴於哪一類援助屬於AID沖突。每一個類別能夠有不同的解決沖突的政策。




比如,對於一些類別(比如支付)的用戶可以在Android設置界面。選擇默認服務。對於其它類別的政策可能是總是問這服務是在發生沖突時要調用的用戶。要查詢某一類的解決沖突的策略。請參閱getSelectionModeForCategory()。




檢查,假設你的服務是默認


應用程序能夠檢查通過使用isDefaultServiceForCategory(單元名,字符串)的API的HCE服務是否為特定類別的默認服務。


假設您的服務是不是默認的。能夠要求其進行預設。

見ACTION_CHANGE_DEFAULT。




支付應用程序


Android的覺得,已經宣布的“支付”類別作為支付應用的AID組HCE服務。

而Android 4.4版本號包括被稱為“感應付款”頂層設置菜單項,當中列舉了全部此類支付應用。

在此設置菜單中,用戶能夠選擇當一個支付終端被竊聽。將調用默認的支付應用。




支付應用所需的資產


為了提供更加視覺吸引力的用戶體驗,HCE支付應用都須要為他們提供服務的額外資產:所謂服務的一面旗幟。


該資產的大小應260x96 DP。可在您的元數據的XML文件裏加入了android指定:apduServiceBanner屬性加入到<主機-APDU服務>標簽,它指向繪制資源。

一個樣例例如以下所看到的:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/servicedesc"
        android:requireDeviceUnlock="false"
        android:apduServiceBanner="@drawable/my_banner">
    <aid-group android:description="@string/aiddescription"
               android:category="payment">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>
屏幕關閉和鎖定屏幕行為


眼下Android實現打開在NFC控制器和應用處理器全然關閉時,設備的屏幕被關閉。

當屏幕處於關閉狀態HCE服務會因此無法正常工作。




HCE服務能夠可是鎖屏功能:在requireDeviceUnlock屬性<主機-APDU服務>您HCE服務標簽:這是由機器人控制的。

缺省情況下,不要求設備解鎖。而且即使該設備被鎖定的服務將被調用。


假設你設置了android:requireDeviceUnlock屬性為“true”為您服務HCE,Android將提示用戶解鎖,當你點擊一個選擇被解析為您服務援助的NFC閱讀器的設備。

解鎖之後,Android將顯示一個對話框,提示用戶再次點擊就可以完畢交易。這是必要的,由於用戶可能會以解鎖移動該設備遠離NFC閱讀器。


共存安全元素卡


這部分是已部署了賴以卡仿真的安全元件上的應用程序開發者的興趣。 Android的HCE實現設計平行實施卡模擬的其它方法。包含使用安全元件的工作。




註意:Android不用於與安全元件本身直接通信提供的API。




此共存是基於一個所謂的“AID路由”的原則:在NFC控制器保持一個包括的路由規則(有限的)列表的路由表。每一個路由規則包括一個AID和目標。目標能夠是主機CPU(如Android應用程序正在執行),或連接的安全元件。


當NFC讀寫器發送一個APDU一個“SELECT AID”中,NFC控制器解析它,並檢查是否艾滋病在其路由表中的不論什麽引援。

假設匹配,該APDU和其後的全部的APDU將被發送到與AID相關聯的目的地,直到還有一個“SELECT AID”APDU被接收或在NFC鏈路斷開。


註意:在ISO / IEC 7816-4定義“部分匹配”的概念,那麽,這是不是眼下由Android HCE設備支持。


這樣的架構在圖4中示出。


技術分享

圖4. Android的既安全元件和主機卡仿真執行。


該NFC控制器通常還包括APDU的默認路由。當在路由表中沒有找到一個AID,則使用缺省路由。與Android 4.4開始,須要默認路由設置為主機CPU。這意味著。在路由表通常僅包括該須要去的安全元件艾滋病條目。


實現一個HCE服務或使用的安全元件不必操心配置路由表的Andr??oid應用程序 - 由Android的自己主動照應。機器人只須要知道哪個助劑能夠由HCE服務來處理和哪些能夠通過安全元件來處理。在此基礎上的服務的安裝和用戶已配置為優選的,路由表被自己主動配置。


我們已經介紹了怎樣申報艾滋病HCE服務。

下面部分說明怎樣聲明艾滋病使用安全元素為卡仿真應用。


安全元件AID登記


使用卡模擬的安全元件的應用程序可在其清單中聲明一個所謂的“關主機服務”。這樣的服務的聲明差點兒是同樣的一個HCE服務的聲明。

例外的是:


在意向濾波器中使用的動作必須被設置為SERVICE_INTERFACE。


元數據的名稱屬性必須設置為SERVICE_META_DATA。


元數據的XML文件必須使用<脫離主機-APDU服務>根標簽。

<service android:name=".MyOffHostApduService" android:exported="true"
         android:permission="android.permission.BIND_NFC_SERVICE">
    <intent-filter>
        <action android:name="android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE"/>
    </intent-filter>
    <meta-data android:name="android.nfc.cardemulation.off_host_apdu_ervice"
               android:resource="@xml/apduservice"/>
</service>
對應的APDU service.xml文件註冊二援助的一個樣例:

<offhost-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc">
    <aid-group android:description="@string/subscription" android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</offhost-apdu-service>
Android的:requireDeviceUnlock屬性並不適用於過主機服務,由於主機CPU不參與交易,因此無法阻止運行交易安全元件時,該設備已被鎖定。


Android的:apduServiceBanner屬性必須被用於那些支付應用,以及,以便選擇作為默認支付應用關閉主機服務。


關閉主機服務調用


Android的本身永遠不會啟動或綁定到被聲明為“關主”的服務。這是由於實際的事務是由安全元件,而不是由在Android服務本身運行。該服務聲明僅僅是同意應用程序註冊艾滋病存在的安全元素。


HCE和安全


該HCE架構本身提供了一個核心片的安全性:由於你的服務是由BIND_NFC_SERVICE系統權限保護,僅僅有操作系統能夠結合並與您的服務進行通信。這可確保您收到不論什麽APDU實際上是一個由來自NFC控制器操作系統收到APDU。不論什麽APDU你送回僅僅會去操作系統。這又直接轉發的APDU到NFC控制器。


核心剩下的部分是你在哪裏得到你的數據,你的應用程序發送到NFC閱讀器。

這是分離有意在HCE設計:它並不關心那裏的數據從何而來,它僅僅是確保它安全地運送到NFC控制器和輸出到NFC閱讀器。


為了安全地存儲和檢索,你想從你的HCE服務發送的數據,就能夠了,比如,依靠Android應用程序沙箱。它從其它應用程序隔離應用程序數據。有關Android安全的很多其它具體信息,請閱讀安全提示。




協議參數和細節


這部分是為希望了解什麽協議參數HCE設備中的NFC協議的防碰撞和激活階段使用的開發者的興趣。

這樣就能夠建立一個閱讀器的基礎設施。與Android HCE設備兼容。




NFC-A(ISO / IEC 14443 A類)協議,防沖突和激活


隨著NFC-A協議激活的一部分,多個幀交換。


在這次交易中HCE設備將展示其UID的第一部分; HCE設備應當被假定為具有隨機UID。這意味著,在每個抽頭。即呈現給讀者將UID將隨機生成的UID。正由於如此,NFC讀取器不應該依賴於HCE設備的UID作為認證或識別的一種形式。




該NFC閱讀器能夠通過發送一個命令SEL_REQ隨後選擇HCE設備。該HCE器件的響應SEL_RES將至少有6位(0x20的)集。表示該設備支持ISO-DEP。

註意。在SEL_RES其他位能夠被設置為好,指示為NFC-DEP(P2P)協議演示樣例的支持。由於其他位可設置,想與HCE設備進行交互的讀者應該明白檢查僅第6位,而不是完整的SEL_RES用0x20的值進行比較。


ISO-DEP激活


在NFC-A協議被激活後,將ISO-DEP協議激活由NFC讀取器啟動。

它發出了一個“老鼠”(請求應答來選擇)命令。的大鼠的反應中,ATS,全然是由NFC控制器產生,而不是由HCE服務配置。然而,HCE實現都必須以滿足ATS響應NFC論壇的要求。因此NFC讀者能夠對這些參數依照不論什麽HCE設備NFC論壇的要求被設置計數。


下面部分提供了一個HCE設備上的NFC控制器提供的ATS響應的各個字節的具體信息:


TL:ATS的響應長度。不能表明長度大於20個字節。
T0:比特5,6和7必須在全部HCE設備進行設置,指示的TA(1)。TB(1)和TC(1)包含在ATS響應。位1至4指示FSCI。編碼的幀的最大尺寸。在HCE設備FSCI的值必須在0H和8h之間。
T(A)1:定義碼率閱讀器和仿真器之間,以及他們能否夠是不正確稱的。有沒有比特率要求或擔保HCE設備。
T(B)1:1位到4指示啟動幀保護時間整數(SFGI)。在HCE設備,SFGI必須<= 8小時。位5至8指示幀的等待時間整數(FWI)和編碼幀的等待時間(FWT)。

在HCE設備,FWI必須<= 8小時。
T(C)1:5位指示“高級功能協議”的支持。 HCE設備可能支持或不支持“高級協議功能”。第2位表示支持DID。 HCE設備能夠支持或不支持DID。

位1指示NAD的支持。

HCE設備必須不支持NAD和設置位1至零。
歷史字節:HCE設備最多能夠返回15歷史字節。 NFC讀者願意與HCE服務交互。不應對歷史字節或他們的存在內容的如果。


請註意,很多HCE設備都有可能做出符合在EMVCo標準統一了支付網絡在他們的“非接觸式通信協議”規範中指定的協議的要求。尤其是:


FSCI在T0必須2H和8h之間。
T(A)1必須設置為0x80,表示僅僅有106千比特/秒的比特率被支持,而且不支持閱讀器和仿真器之間的非對稱比特率。


FWI在T(B)1必須<= 7小時。
APDU數據交換


如前所述,HCE實現僅僅支持一個單一的邏輯通道。嘗試選擇不同的邏輯通道的應用將不是一個HCE設備上執行。


Android API Guides---Host-based Card Emulation