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

时间:2015-05-19 12:29:50

标签: java android smartcard javacard sim-card

我已经使用过智能卡,我熟悉APDU命令(在 ISO / IEC 7816 全球平台规范中定义)。

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

我已经在谷歌搜索过,我发现了一些名为 SIM工具包应用寻求Android 的相关主题和工具。但我真的不明白这些是什么?这些项目是我必须在手机上安装的两个应用程序吗?或者这两个工具是否已经安装在USIM / SIM卡上并从手机接收命令?

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

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

提前致谢。

2 个答案:

答案 0 :(得分:12)

SIM卡上可以有两种不同类型的小程序。

常见小程序

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

您可以使用一组名为SEEK for Android的特殊Android库与这些小程序进行通信。请查看此tutorial以了解如何创建此类电话应用程序。

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

SIM工具包小程序

SIM卡不仅仅是一张普通的智能卡,如果您想使用SIM卡提供的所有功能,为SIM卡编写小程序可能比普通智能卡复杂得多。我建议你阅读this paper - 这是某人的学士论文,但这是我在互联网上找到的初学者的最佳概述。我还建议this video from the DefConn conference

加载在SIM卡上的applet的角色是不同的:applet不再是被动实体。手机会定期询问您的小程序:"我能为您做些什么新事吗?"并且您的小程序可以回复:"是的,发送此短信,请"或者"告诉我现在几点了#34;此外,您的applet可以成为某些事件的监听者:来电,收到短信,时间间隔等等。是的,SIM卡从技术角度来看似乎是被动的,但它的作用实际上是一个活跃的:是SIM卡向手机发送命令。

这些命令被称为"主动命令"或SIM应用程序工具包命令。结构相同--CLA INS P1 P2 LC数据LE;意思不同。

您可以使用名为sim.toolkit的特殊JavaCard包中的类从您的applet发送它们。

(SIM Application Toolkit是一种标准,它以与Global Platform指定applet生命周期相同的方式指定主动命令。)

SIM Toolkit applet示例:

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库。您的问题非常广泛,如果您愿意,请向我询问任何细节。

答案 1 :(得分:5)

从API级别22(Android 5.1)开始,还有另一个名为“运营商权限”的选项。它允许非系统应用程序使用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