Отправить команды APDU на USIM/SIM-карту в Android

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

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

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

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

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

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

2 ответа

Решение

На вашей SIM-карте может быть два разных типа апплетов.

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

Обычные апплеты написаны на простой JavaCard. Это тип апплета, к которому вы привыкли из мира обычных смарт-карт. Имеет process Метод и смарт-карта являются пассивным субъектом в коммуникации: ваше приложение отправляет команды APDU и ответы карты.

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

Начиная с уровня API 21, существует также способ связи с SIM-картой с помощью Telephony Manager. Однако есть одно огромное препятствие: ваше приложение нуждается MODIFY_PHONE_STATE разрешение, которое может быть предоставлено только системным приложениям. Обычное, не системное приложение не может его использовать.

SIM-инструментарий Апплеты

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

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

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

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

(SIM Application Toolkit - это стандарт, который определяет упреждающие команды таким же образом, как Global Platform определяет жизненный цикл апплета.)

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

Начиная с уровня API 22 (Android 5.1), существует еще одна опция, называемая "Права оператора". Это позволяет несистемным приложениям отправлять APDU на SIM-карту с помощью Android TelephonyManager. См.: https://developer.android.com/reference/android/telephony/TelephonyManager.html

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

Другие вопросы по тегам