簡體   English   中英

在android中向USIM/SIM卡發送APDU命令

[英]Send APDU commands to USIM/SIM card in android

我已經使用過智能卡,並且熟悉 APDU 命令(在ISO/IEC 7816全球平台規范中定義)。

現在我想知道有沒有什么辦法可以給我插在手機上的USIM/SIM卡發送APDU命令? (安裝了 Android v4.4.4 kitkat 的三星 A3。)

我已經在 Google 中搜索過,發現了一些名為SIM Toolkit ApplicationSeek for Android 的相關主題和工具。 但我真的不明白這些是什么? 這些項目是我必須在手機上安裝的兩個應用程序嗎? 或者這兩個工具是否已經安裝在USIM/SIM卡上並從手機接收命令?

Proactive 命令APDU 命令AT 命令之間有什么區別?

我應該學習android來開發SIM卡應用程序還是我只需要Java Card規范和ETSI標准?

提前致謝。

SIM 卡上可以有兩種不同類型的小程序。

常見小程序

用普通 JavaCard 編寫的常見小程序。 這是您在普通智能卡世界中習慣的小程序類型。 它具有process方法,智能卡是通信中的被動主體:您的應用程序發送 APDU 命令和卡響應。

您可以使用一組稱為 SEEK for Android 的特殊 Android 庫與這些小程序進行通信。 查看本教程以了解如何創建這樣的電話應用程序。

從 API 級別 21 開始,還有一種使用Telephony Manager與 SIM 通信的方法。 但是,有一個巨大的障礙:您的應用程序需要MODIFY_PHONE_STATE權限,該權限只能授予系統應用程序。 不允許常規的非系統應用程序使用它。

SIM 工具包小程序

SIM 卡不僅僅是一張普通的智能卡,如果您想使用 SIM 卡提供的所有可能性,那么為 SIM 卡編寫小程序可能比普通智能卡復雜得多。 我建議你閱讀這篇論文——它是某人的學士論文,但它是我在互聯網上找到的對初學者最好的概述。 我也推薦這個來自 DefConn 會議的視頻

SIM卡上加載的小程序的作用不同:小程序不再是一個被動的實體。 電話會定期詢問您的小程序:“我可以為您做些新的事情嗎?” 您的小程序可以回復:“是的,請發送此短信”或“告訴我現在幾點了”等。此外,您的小程序可以成為某些事件的偵聽器:來電、收到的短信、已過的時間間隔等。 ,SIM卡從技術角度看似乎是被動的,但其實它的作用是主動的:向手機發送指令的是SIM卡。

這些命令稱為“主動命令”或 SIM 應用程序工具包命令。 結構相同——CLA INS P1 P2 LC 數據LE; 意思是不同的。

您可以使用名為sim.toolkit的特殊 JavaCard 包中的類從您的小程序發送它們。

(SIM 應用程序工具包是一個標准,它以 Global Platform 指定小程序生命周期的相同方式指定了主動命令。)

SIM 工具包小程序示例:

import sim.toolkit.ToolkitInterface;
import sim.toolkit.ToolkitRegistry;
...
import javacard.framework.ISOException;

public class STKTest extends Applet implements ToolkitInterface {

public static void install(byte[] bArray, short bOffset, byte bLength) {
    // GP-compliant JavaCard applet registration
    new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
//this method handles standard APDU commands
public void process(APDU apdu) {
    // Good practice: Return 9000 on SELECT
    if (selectingApplet()) {
        return;
    }

    apdu.setIncomingAndReceive();
    final byte[] buf = apdu.getBuffer();
    switch (buf[ISO7816.OFFSET_INS]) {
    case (byte) 0x00:
        //do something
        break;
    }
}
//this method handles the SIM Toolkit commands
public void processToolkit(byte event) throws ToolkitException {
    switch (event) {

    case ToolkitConstants.EVENT_TIMER_EXPIRATION:
        //do something
        break;
    }
}

}

是的,您應該學習 Android - 您將需要它來使用 SEEK 庫。 您的問題非常廣泛,如果您願意,請向我詢問任何詳細信息。

從 API 級別 22(Android 5.1)開始,還有另一個稱為“運營商特權”的選項。 它允許非系統應用程序使用 Android TelephonyManager 向 SIM 卡發送 APDU。 請參閱: https : //developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()

例如,在 Google Play 上分發的移動網絡運營商 (MNO) 應用程序可以使用它。 但它也不是對所有人開放。 在這種情況下,您需要獲得 SIM 卡的訪問權限。 SIM 上的訪問規則由發布它的 MNO 管理。 另見: http : //source.android.com/devices/tech/config/uicc.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM