繁体   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