将 APDU 命令发送到 android 中的 USIM/SIM 卡

Send APDU commands to USIM/SIM card in android

我已经使用过智能卡并且我熟悉 APDU 命令(在 ISO/IEC 7816Global Platform规格)。

现在我想知道是否有任何方法可以将 APDU 命令发送到插入我的手机 phone 的 USIM/SIM 卡? (安装了 Android v4.4.4 kitkat 的三星 A3。)

我已经在 Google 中搜索了一些相关主题和工具,名为 SIM Toolkit ApplicationSeek for Android 。但是我真的不明白这些是什么?这些项目是我必须在手机上安装的两个应用程序 phone 吗?或者这两个工具已经安装在 USIM/SIM 卡上并接收来自移动设备的命令 phone?

主动命令APDU命令AT命令有什么区别?

我应该学习 android 开发 SIM 卡应用程序还是我只需要 Java 卡规范和 ETSI 标准?

提前致谢。

您的 SIM 卡上可能存在两种不同类型的小程序。

普通小程序

用纯 JavaCard 编写的常见小程序。这是您在普通智能卡世界中习惯使用的小程序类型。它具有 process 方法,智能卡是通信中的被动主体:您的应用程序发送 APDU 命令和卡响应。

您可以使用一组名为 SEEK for Android 的特殊 Android 库与这些小程序通信。看看这个 tutorial 了解如何创建这样一个 phone 应用程序。

从 API 级 21 开始,还有一种使用 Telephony Manager 与 SIM 卡通信的方法。但是,存在一个巨大的障碍:您的应用需要 MODIFY_PHONE_STATE 权限,该权限只能授予系统应用。不允许常规的非系统应用程序使用它。

SIM 工具包小程序

SIM 卡不仅仅是普通的智能卡,如果您想使用 SIM 卡提供的所有可能性,为 SIM 卡编写小程序可能比普通智能卡复杂得多。我推荐你阅读 this paper - it is someone's bachelor thesis, but it is the best overview for a beginner I have found all over the Internet. I also recommend this video from the DefConn conference.

SIM卡上加载的小程序的作用不同了:小程序不再是一个被动的实体。 phone定期询问你的小程序:"Is there anything new I can do for you?",你的小程序可以回复:"Yes, send this SMS, please"或"Tell me what time it is"等。此外,你的小程序可以成为一些事件的监听器:来电,收到短信,时间间隔等。是的,从技术角度来看,SIM 卡似乎是被动的,但它的作用实际上是主动的:它是 SIM 卡向 phone 发送命令。

这些命令称为 "proactive commands" 或 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) 开始,还有另一个名为 "Carrier Privileges" 的选项。它允许非系统应用程序使用 Android TelephonyManager 将 APDU 发送到 SIM 卡。看: 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