Отправить команды 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