OTAMan Документация

1. Обзор

OTAMan — Progressive Web App (PWA) для построения APDU-команд, сборки защищённых пакетов SCP80, просмотра меню SIM Toolkit (STK) и симуляции реальной сетевой среды для тестирования SIM/USIM/UICC-карт через PC/SC-ридер.

Приложение — один статический файл index.html. Все вычисления выполняются в браузере; доступ к карте — через локальный HTTP-сервер (pysim-otaman-server), оборачивающий библиотеку pySim.

Браузер (OTAMan PWA) → HTTP :8080 → pysim-otaman-server → pySim → PC/SC → ридер → UICC/SIM

Стандарты, на которые опирается приложение:

  • ETSI TS 102 221 — интерфейс UICC-терминал (CLA 00, файлы USIM)
  • ETSI TS 102 222 — административные команды
  • ETSI TS 102 223 — Card Application Toolkit (CAT, проактивные команды)
  • ETSI TS 102 225 — структура защищённых пакетов для (U)SIM toolkit
  • ETSI TS 102 226 — структура удалённых APDU для UICC-приложений
  • ETSI TS 151 011 — интерфейс SIM-ME (CLA A0)
  • 3GPP TS 131 111 — USIM Application Toolkit (USAT)
  • 3GPP TS 31.102 — характеристики приложения USIM
  • 3GPP TS 23.038 — алфавит GSM 7-bit и DCS
  • 3GPP TS 24.008 / 24.301 / 24.501 — коды причин NAS
  • GlobalPlatform Card Specification v2.3.1
  • ISO/IEC 7816-4 — команды обмена
  • ISO/IEC 9797-1 — алгоритмы MAC

2. Вкладка C-APDU

Построение командных APDU (C-APDU). Четыре подвкладки охватывают разные поколения карт и наборы команд.

2.1 SIM RFM

CLA = A0 (GSM 11.11 / TS 151 011, ISO 7816-4). Удалённое управление файлами классических SIM-карт.

КомандаINSОписание
SELECTA4Выбор EF/DF по FID, пути, DF name или цепочке
UPDATE RECORDDCОбновление записи
UPDATE BINARYD6Обновление бинарных данных
READ RECORDB2Чтение записи
READ BINARYB0Чтение бинарных данных
ERASE BINARY0EСтирание бинарных данных
ACTIVATE FILE44Активация файла
DEACTIVATE FILE04Деактивация файла
VERIFY PIN20Проверка PIN1 или PIN2
CHANGE PIN24Смена PIN1 или PIN2

Методы SELECT

МетодP1P2Ввод
По FID0000FID (4 hex)
По полному пути от MF0800Полный путь от MF
По DF name / AID0400AID
Цепочка ADF RFM0000FID через запятую

Опции

  • Start with SELECT — добавить SELECT перед операцией.
  • Selection mode (P2) — для record-команд: Absolute (04), Next (06), Previous (02).
  • Record size — дополнить/обрезать данные до указанного размера.
  • Allow P1/P2 editing — ручное редактирование P1/P2.

В правой колонке — панель конвертации (IMSI, MSISDN, ICCID, SPN, PLMN, nibble swap). См. §2.5.

2.2 USIM RFM

CLA = 00 (ETSI TS 102 221). Те же команды, что и SIM, но SELECT использует P1=09, P2=0C (выбор по FID из текущего каталога).

2.3 Expanded BER-TLV

Построение формата Expanded Remote Application data по ETSI TS 102 226 §5.2.1.

Формат

  • Definite (AA): AA + длина + Command TLV
  • Indefinite (AE): AE + 80 + Command TLV + 00 00

Command TLV

ТипТегОписание
C-APDU22APDU
Immediate Action81Проактивная команда или action indicator
Error Action82Проактивная команда при ошибке
Script Chaining83Данные для многопакетных скриптов

Сборщик Immediate Action предлагает action indicator (81/82), структурированный сборщик проактивных команд (REFRESH, DISPLAY TEXT, PLAY TONE с авто-генерацией COMPREHENSION-TLV), или ручной hex-ввод.

2.4 RAM/GP

CLA = 80 (GlobalPlatform Card Specification v2.3.1). Команды удалённого управления приложениями.

КомандаINSP1Описание
INSTALL [for load]E602Регистрация загружаемого файла
INSTALL [for install]E60CУстановка приложения или SD
INSTALL [make selectable]E610Сделать приложение выбираемым
INSTALL [registry update]E601Обновление реестра
INSTALL [extradition]E604Перемещение между SD
LOADE800Загрузка кода
DELETEE400/80Удаление приложения или SD
GET STATUSF280/40/20/10Статус карты
GET DATACAtagЧтение объектов данных
STORE DATAE200/40/80/C0Запись данных
SET STATUSF080/40/60Управление жизненным циклом
EXTERNAL AUTHENTICATE8200Аутентификация SCP
INTERNAL AUTHENTICATE8800Challenge-response

Привилегии (INSTALL [for install])

Тег C7 в поле данных INSTALL, три байта привилегий (таблицы 11-7/8/9 спецификации GP):

БитБайт 1Байт 2Байт 3
b8Security DomainTrusted PathReceipt Generation
b7DAP VerificationAuthorized Management
b6Delegated ManagementToken Verification
b5Card LockGlobal Delete
b4Card TerminateGlobal Lock
b3Card ResetGlobal Registry
b2CVM ManagementFinal Application
b1Mandated DAP Verification

MSL (Minimum Security Level) — байт SPI1 по TS 102 225

ЗначениеОписание
00Нет проверки
11RC/CC/DS
12RC/DS/CC
15RC/DS/CC + MAC
16RC/DS/CC + MAC + Cipher
19RC/DS/CC + MAC + Cipher + DS

Полные таблицы GET STATUS P1/P2, тегов GET DATA, DELETE P1, STORE DATA P1 и SET STATUS см. в GlobalPlatform v2.3.1 и ETSI TS 102 226 §8.2.1.3.2.

2.5 Конвертация (боковые панели SIM/USIM)

  • IMSI → EF.IMSI — 15-значный IMSI в 9-байтный формат (TS 31.102 §4.2.3).
  • MSISDN → BCD — удалить +, дополнить нечётную длину символом f, поменять полубайты.
  • ICCID → hex — поменять полубайты строки ICCID.
  • Provider Name → SPN — GSM 7-bit packed, UCS2 non-BMP или UCS2 BMP (TS 31.102 §4.2.5, TS 23.038).
  • PLMN → EF_PLMNsel / PLMNwAcT — 3-байтный BCD + опциональный селектор технологии доступа.
  • Nibble swap — поменять пары полубайтов hex-строки чётной длины.

3. Вкладка Secured Packet

Сборка защищённых пакетов SCP80 по ETSI TS 102 225.

Структура пакета

ПолеРазмерОписание
CPI1Command Packet Identifier (02)
CPL1Command Packet Length
CHI1Command Header Identifier (01)
CHL1Command Header Length
SPI2Security Parameter Indicator
KIc1Key Identifier для шифрования
KID1Key Identifier для MAC
TAR3Toolkit Application Reference
CNTR5Счётчик повторов
PCNTR1Padding counter
RC/CC/DS8Контрольная сумма / MAC
Secured Dataпер.APDU (с шифрованием при необходимости)

Крипто

  • 3DES-CBC шифрование (нулевой ICV), ключи 8/16/24 байта — устарело с Rel-18, но поддерживается для обратной совместимости
  • AES-CBC шифрование (нулевой ICV, дополнение нулями до 16), ключи 16/24/32 байта (TS 102 225 §5.1.2, KIc x2)
  • Retail MAC (ISO 9797-1, MAC algorithm 3) для контрольной суммы DES/3DES
  • AES-CMAC (NIST SP 800-38B, усечённый до 8 октетов) для контрольной суммы AES (TS 102 225 §5.1.3.1, KID x2)
  • AES требует счётчик с защитой от повтора: биты SPI1 b5 b4 должны быть 10 (счётчик больше) или 11 (счётчик +1) согласно TS 102 225 §5.1.2/§5.1.3.1
  • Байт паддинга настраивается (00 по умолчанию или FF)

Кнопка «Verify vs pySim» сверяет собранный пакет с эталонной реализацией OtaDialectSms.encode_cmd. Кнопка «Send to Card» доставляет пакет через ENVELOPE SMS-PP-DOWNLOAD (при подключении к серверу).

4. Вкладка Response parser

Декодирование ответа команды: выберите отправленную команду, введите SW (например, 9000) и данные ответа в hex, затем нажмите Decode.

  • Команда — группа SIM/USIM (SELECT, STATUS, READ/UPDATE, операции с PIN, CAT-команды TERMINAL PROFILE/ENVELOPE/FETCH/TERMINAL RESPONSE, MANAGE CHANNEL, …) или группа RAM/GP (INSTALL, LOAD, DELETE, GET/STORE DATA, аутентификация, команды SCP).
  • Декодирование SW — статусные слова по картам generic, UICC (TS 102 221) и GlobalPlatform с автоопределением контекста.
  • Декодирование привилегий — байты привилегий из ответов GET DATA / INSTALL в читаемые флаги.
  • Данные ответа — hex с интерпретацией по команде (например, шаблоны FCP из SELECT).

5. Вкладка Cards

Хранит предустановки карт локально в браузере (localStorage), чтобы вкладка Secured Packet могла автоматически подставлять ключи и параметры.

ПолеОписание
NameПонятная метка
ICCIDОпциональный идентификатор карты
KIc / KIDИндикаторы ключа и алгоритма (например, 15 = индекс 1, 3DES-CBC2; x2 = AES)
SPI1 / SPI2Security Parameter Indicators
TARToolkit Application Reference
CounterСчётчик повторов (5 байт)
KIc key / KID key16/24/32 hex-символа (ключи 8/16/24 байта 3DES) или 32/48/64 hex-символа (ключи 16/24/32 байта AES)

Export as JSON / Import JSON from clipboard для обмена предустановками. Выбранная предустановка автоматически заполняет форму Secured Packet.

6. Вкладка Card reader (pySim)

Подключение к локальному pysim-otaman-server для работы с картой. Подвкладки: File manager, Custom files, pySim command line, Raw APDU и Proactive UICC.

6.1 File manager

  • Read — чтение файла (автоопределение transparent/record)
  • Edit — изменить hex-данные, Save для записи
  • Raw / Decoded — переключение между hex-дампом и декодированным JSON

6.2 Custom files

Добавление файлов, не покрытых моделью pySim. Сохраняется в localStorage; экспорт/импорт JSON.

6.3 pySim command line

Выполнение любых команд pySim-shell с подсказками (300 мс) и автодополнением.

6.4 Raw APDU

Отправка произвольного APDU и просмотр ответа.

6.5 Proactive UICC

Работа с сессией Card Application Toolkit: подписанные события, журнал проактивных команд, словарь данных PROVIDE LOCAL INFORMATION и опрос STATUS.

6.5.1 Подписанные события (SET UP EVENT LIST)

События, которые отслеживает карта. У каждого события есть кнопка Send, открывающая форму, специфичную для типа события:

  • События без данных (User Activity, Idle Screen, Data Available, …) — уведомление в один клик
  • Location Status — выпадающий список: Normal / Limited / No service (тег 9B)
  • Access Technology Change — 13 типов RAT (тег BF)
  • Network Rejection — полная адаптивная форма: тип регистрации (LU / GPRS / EPS / 5GS), поля местоположения (MCC, MNC, LAC, RAC, TAC), технология доступа и единый выпадающий список из 53 кодов причин (EMM, GMM, 5GMM и LU)

Отправка события использует ENVELOPE(Event Download) по TS 102 223 / TS 131 111.

6.5.2 Журнал проактивных команд

Хронологический список извлечённых проактивных команд. Каждая строка показывает время, код типа, имя и декодированный квалификатор (для команд, у которых он есть). Для команд с данными ответа показывается строка Response: с байтами TERMINAL RESPONSE (без служебных TLV); ответы PROVIDE LOCAL INFORMATION декодируются через словарь данных PLI.

6.5.3 Словарь данных PROVIDE LOCAL INFORMATION

Редактируемые hex-значения для всех 22 квалификаторов PLI (TS 102 223 §8.6 + TS 131 111). У десяти квалификаторов есть встроенные формы декодирования/кодирования:

  • 00 Location Info (MCC, MNC, LAC/TAC, Cell ID)
  • 01 IMEI · 03 Дата/время/TZ · 04 Язык · 05 Timing Advance
  • 06 Access Technology · 08 IMEISV · 09 Search Mode
  • 0A Battery · 0E Multiple Access Technologies

Значения хранятся на сервере до перезапуска. Когда карта выдаёт PLI, сервер вставляет значения словаря в TERMINAL RESPONSE.

6.5.4 Опрос STATUS

Кнопка Send STATUS отправляет STATUS (F2) вручную. Переключатель Polling включает фоновый опрос: после настраиваемого интервала бездействия (аргумент сервера --poll-interval, 1–255 с, по умолчанию 30 с) сервер отправляет STATUS и обрабатывает любую ожидающую проактивную команду. При извлечении карты опрос останавливается, а состояние карты сбрасывается.

6.6 Сценарии использования

Сценарий A — Работа с файлами, не входящими в модель pySim (Custom files)

  1. Получите FID целевого файла (документация вендора или анализ ATR/файловой системы; такие файлы часто отсутствуют в открытых спецификациях).
  2. Откройте вкладку Card reader → подвкладку Custom files.
  3. Введите полный путь (например, 3F00/7F20/6F46) и псевдоним (например, EF.SPN).
  4. Нажмите Add — файл появится в дереве курсивом (непроверенный).
  5. Кликните по файлу для проверки существования; при успехе (9000) он работает как обычный файл.
  6. Читайте, редактируйте и сохраняйте hex-данные; переключайте Raw/Decoded.
  7. Экспортируйте список пользовательских файлов в JSON для переноса на другие машины.

Сценарий B — Симуляция реальной сетевой среды для тестирования SIM

B.1 Ответы на PROVIDE LOCAL INFORMATION (PLI)

  1. Откройте Proactive UICCPROVIDE LOCAL INFORMATION response data.
  2. Используйте формы декодирования/кодирования для IMEI (01), Location Info (00), Access Technology (06) и т.д.
  3. Нажмите Save — значения сохранятся на сервере.
  4. Включите Polling (интервал 30 с), чтобы карта периодически выдавала PLI.
  5. Сервер вставляет значения словаря в каждый TERMINAL RESPONSE.
  6. Проверьте в журнале проактивных команд: запись PLI покажет декодированный ответ.

B.2 Симуляция сетевых действий через ENVELOPE (event download)

  1. Проверьте список подписанных событий (из SET UP EVENT LIST).
  2. Нажмите Send на событии (например, Location Status) и заполните форму; будет отправлен ENVELOPE(Event Download).
  3. Для Network Rejection выберите тип регистрации → поля местоположения → технологию доступа → причину отклонения.
  4. Карта может ответить проактивной командой, которую обработчик цепочки зарегистрирует и обработает автоматически.

B.3 Проверка симулированной среды

  • Журнал проактивных команд показывает полный цикл (команда + байты TERMINAL RESPONSE).
  • Кнопка STATUS / автопросмотр поддерживают сессию CAT (цикл дренажа).

7. Установка сервера

Для работы с картой (вкладка Card reader, Proactive UICC, доставка OTA) нужен локальный pysim-otaman-server — встроенный в OTAMan HTTP-сервер, оборачивающий pySim, работающий с ридером через PC/SC или serial и раздающий сам PWA (откройте http://127.0.0.1:8080).

7.1 Требования

  • Python 3.8+ с pip
  • Git
  • Смарт-картридер (PC/SC или serial/FTDI). Предпочтителен PC/SC; на Linux требуются pcsc-lite + ccid
  • Только Windows — используйте Python 3.10–3.13 (рекомендуется 3.13): pyscard (обёртка драйвера PC/SC) поставляет готовые wheels для этих версий. На Python 3.9 / 3.14 pip собирает pyscard из исходников, для чего требуются Microsoft C++ Build Tools («Desktop development with C++»). Мост SMPP (smpp.twisted3) на Windows намеренно не устанавливается, поэтому для Python 3.10–3.13 C++ Build Tools не нужны.

7.2 Быстрый старт — Linux / macOS

git clone https://github.com/anttro/otaman.git
cd otaman
chmod +x setup.sh start.sh
./setup.sh          # создаёт .venv, устанавливает pysim + сервер (однократно)
./start.sh          # запускает сервер (PWA + API, автоопределение ридера)

7.3 Быстрый старт — Windows

git clone https://github.com/anttro/otaman.git
cd otaman
setup.bat           # создаёт .venv, устанавливает pysim + сервер (однократно)
start.bat           # запускает сервер (PWA + API)

7.4 Вспомогательные скрипты

СкриптНазначение
setup.sh / setup.batСоздаёт .venv/, устанавливает pySim и сервер. Запускается один раз после клонирования.
start.sh / start.batЗапускает сервер из venv (при отсутствии — из глобальной установки).

7.5 Автоопределение ридера (start.sh)

  • PC/SC (Linux) — если запущен демон pcscd, передаёт -p 0
  • Serial (Linux) — если существует /dev/ttyUSB0, передаёт -d /dev/ttyUSB0
  • PC/SC (Windows) — всегда использует -p 0 (PC/SC встроен в Windows)

Если ридер не обнаружен, сервер запускается без аргументов и показывает «Reader: none». Карту можно инициализировать позже кнопкой Equip на вкладке Card reader.

7.6 Ручная установка

# Создать и активировать venv
python3 -m venv .venv
source .venv/bin/activate   # Linux/macOS
# .venv\Scripts\activate    # Windows

# Установить pysim
pip install git+https://github.com/osmocom/pysim.git

# Установить pysim-otaman-server (editable — раздаёт встроенный PWA)
pip install -e .

# Запустить сервер (PWA + API)
pysim-otaman-server --http-port 8080

Подключите PC/SC-ридер с SIM-картой и откройте http://127.0.0.1:8080 — PWA и API на одном origin, поэтому CORS не требуется.

Если PWA раздаётся с публичного HTTPS-хоста (например, https://otaman.example.com), для доступа к локальному серверу карт нужны два условия: (1) сервер отвечает на preflight заголовком Access-Control-Allow-Private-Network: true (pysim-otaman-server ≥ 1.6.1 делает это автоматически), и (2) браузеру должно быть разрешено обращаться к локальной сети — в Chrome/Edge/Vivaldi: Настройки сайта → Доступ к локальной сети → разрешить сайт (или подтвердить запрос). Без разрешения браузера запрос к 127.0.0.1 блокируется ещё до отправки preflight.

8. Совместимость версий

PWA (OTAMan)СерверСтатус
1.x.x1.x.x✅ Совместимы
1.x.x0.x.x❌ Устарел — обновите сервер
1.x.x2.x.x+⚠️ Сервер новее — обновите PWA

PWA проверяет версию сервера при подключении через GET /api/version и предупреждает о несовместимости.