Отправка команд APDU на USIM / SIM-карту в android

Я уже работал со смарт-картами, и я знаком с командами APDU (которые определены в ISO / IEC 7816 и Глобальная Платформа спецификации).

теперь я хочу знать, есть ли способ отправить команду APDU на мою USIM/SIM-карту, которая вставлена в мой мобильный телефон? (Samsung A3 с Android версии 4.4.4 KitKat с установленной.)

Я уже искал в Google, и я нашел некоторые связанные темы и инструменты имени набор инструментов SIM Применение и искать Android. Но я не совсем понимаю, что это такое? Являются ли эти элементы двумя приложениями, которые я должен установить на свой мобильный телефон? или эти два инструмента, которые уже были установлены на USIM / SIM-карте и получают команды с мобильного телефона?

в чем разница между активные команды , команды APDU и AT команды?

должен ли я научиться android разрабатывать SIM карточные приложения или мне просто нужны спецификации Java-карт и стандарты ETSI?

спасибо заранее.

2 ответов


на вашей SIM-карте могут присутствовать два разных типа апплетов.

общие апплеты

общие апплеты, написанные на обычном JavaCard. Это тип апплета, к которому вы привыкли из мира обычных смарт-карт. У него есть process метод и смарт-карта является пассивным субъектом в общении: ваше приложение отправляет команды APDU и ответы карты.

вы можете общаться с этими апплетами, используя специальный набор Android библиотеки под названием SEEK для Android. Взгляните на это учебник чтобы узнать, как создать такое приложение телефона.

начиная с уровня API 21 существует также способ связи с SIM с помощью Диспетчер Телефония. Тем не менее, есть одно огромное препятствие: ваше приложение нуждается MODIFY_PHONE_STATE разрешение, которое может быть предоставлено только системным приложениям. Reqular, несистемное приложение не разрешено использовать его.

апплеты SIM Toolkit

A SIM-карта-это гораздо больше, чем просто обычная смарт-карта, и написание апплета для SIM-карты может быть намного сложнее, чем для общей смарт-карты, если вы хотите использовать все возможности SIM-карты. Я рекомендую вам прочитать этой статье - это чья-то дипломная работа, но это лучший обзор для новичка, я нашел по всему интернету. Я также рекомендую это видео с конференции DefConn.

роль загруженного апплета на SIM-карте все иначе: апплет больше не является пассивной сущностью. Телефон регулярно спрашивает ваш апплет: "есть ли что-то новое, что я могу для вас сделать?"и ваш апплет может ответить:" Да, отправьте это SMS, пожалуйста"или" скажите мне, Который час " и т. д. Кроме того, ваш апплет может стать слушателем некоторых событий: входящего звонка, получении SMS, интервал времени и т. д. Да, SIM-карта кажется пассивной с технической точки зрения, но ее роль на самом деле активная: это SIM-карта, которая отправляет команды к телефону.

эти команды называются "проактивными командами" или командами SIM Application Toolkit. Структура одинакова-CLA INS P1 P2 LC data LE; значение другое.

вы можете отправить их из своего апплета, используя классы в специальном пакете JavaCard под названием sim.toolkit.

(SIM Application Toolkit-это стандарт, который определяет проактивные команды точно так же, как глобальная платформа определяет жизненный цикл апплета.)

пример апплета SIM Toolkit:

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 - вам нужно будет использовать библиотеку поиска. Ваш вопрос очень широк, пожалуйста, спросите меня о любых деталях, если хотите.


начиная с уровня API 22 (Android 5.1) есть еще один вариант под названием "привилегии перевозчика". Он позволяет несистемным приложениям отправлять APDUs на SIM-карту с помощью Android TelephonyManager. Видеть: https://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()

например, приложения оператора мобильной связи (MNO), распространяемые в Google Play, могут использовать это. Но опять же это не для всех. В этом случае вам нужно быть доступ предоставлен SIM-картой. Правила доступа на SIM управляются MNO, который его выдал. Смотреть также: http://source.android.com/devices/tech/config/uicc.html