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 | Описание |
|---|---|---|
| SELECT | A4 | Выбор EF/DF по FID, пути, DF name или цепочке |
| UPDATE RECORD | DC | Обновление записи |
| UPDATE BINARY | D6 | Обновление бинарных данных |
| READ RECORD | B2 | Чтение записи |
| READ BINARY | B0 | Чтение бинарных данных |
| ERASE BINARY | 0E | Стирание бинарных данных |
| ACTIVATE FILE | 44 | Активация файла |
| DEACTIVATE FILE | 04 | Деактивация файла |
| VERIFY PIN | 20 | Проверка PIN1 или PIN2 |
| CHANGE PIN | 24 | Смена PIN1 или PIN2 |
Методы SELECT
| Метод | P1 | P2 | Ввод |
|---|---|---|---|
| По FID | 00 | 00 | FID (4 hex) |
| По полному пути от MF | 08 | 00 | Полный путь от MF |
| По DF name / AID | 04 | 00 | AID |
| Цепочка ADF RFM | 00 | 00 | FID через запятую |
Опции
- 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 Script
Построение формата 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-APDU | 22 | APDU |
| Immediate Action | 81 | Проактивная команда или action indicator |
| Error Action | 82 | Условное восстановление при ошибках с action indicator или проактивной командой |
| Script Chaining | 83 | Многопакетное выполнение скрипта с флагами First/Intermediary/Last |
| Response Type | - | Индикатор типа ответа: expanded/compact/none |
Сборщик Immediate Action предлагает action indicator (81/82), структурированный сборщик проактивных команд (REFRESH, DISPLAY TEXT, PLAY TONE с авто-генерацией COMPREHENSION-TLV), или ручной hex-ввод.
Error Action TLV (Tag 82)
Восстановление при ошибках по TS 102 226 §5.2.1.3 — одна из трёх форм:
- Проактивная команда: набор COMPREHENSION-TLV с DISPLAY TEXT или PLAY TONE (в Error Action допустимы только эти две, TS 102 226 Table 5.9)
- Без действия:
82 00 - Ссылка на запись EFRMA:
82 01 <ref>с номером записи01–7F - Произвольный hex: произвольное значение TLV
Script Chaining TLV (Tag 83)
Многопакетное выполнение скрипта с сохранением контекста:
- Флаги цепочки:
01первый скрипт (удалять инфо о цепочке при сбросе),11первый скрипт (сохранять инфо о цепочке при сбросе, только RFM),02последующий скрипт (будут ещё),03последующий скрипт (последний) - Идентификатор скрипта: Корреляционный идентификатор между пакетами (1-4 байта hex, авто-инкремент подсказки)
- Дополнительные данные: Расширенная информация цепочки (опционально hex)
- Сохранение контекста: UICC сохраняет состояние безопасности/транзакции между пакетами
Expanded Remote Response (TS 102 226 §5.2.2)
Результаты по каждой команде с деталями ошибок и контекстом цепочки:
- Номер команды, статус слова, данные ответа для каждой команды
- Код ошибки и информация о ней для неудачных команд (подсвечено красным)
- Идентификатор скрипта и позиция для корреляции цепочки (ID, FIRST, LAST)
- Индикатор типа ответа: 'expanded' vs 'compact' vs 'none'
2.4 RAM/GP
CLA = 80 (GlobalPlatform Card Specification v2.3.1). Команды удалённого управления приложениями.
| Команда | INS | P1 | Описание |
|---|---|---|---|
| INSTALL [for load] | E6 | 02 | Регистрация загружаемого файла |
| INSTALL [for install] | E6 | 0C | Установка приложения или SD |
| INSTALL [make selectable] | E6 | 10 | Сделать приложение выбираемым |
| INSTALL [registry update] | E6 | 01 | Обновление реестра |
| INSTALL [extradition] | E6 | 04 | Перемещение между SD |
| LOAD | E8 | 00 | Загрузка кода |
| DELETE | E4 | 00/80 | Удаление приложения или SD |
| GET STATUS | F2 | 80/40/20/10 | Статус карты |
| GET DATA | CA | tag | Чтение объектов данных |
| STORE DATA | E2 | 00/40/80/C0 | Запись данных |
| SET STATUS | F0 | 80/40/60 | Управление жизненным циклом |
| EXTERNAL AUTHENTICATE | 82 | 00 | Аутентификация SCP |
| INTERNAL AUTHENTICATE | 88 | 00 | Challenge-response |
Привилегии (INSTALL [for install])
Тег C7 в поле данных INSTALL, три байта привилегий (таблицы 11-7/8/9 спецификации GP):
| Бит | Байт 1 | Байт 2 | Байт 3 |
|---|---|---|---|
| b8 | Security Domain | Trusted Path | Receipt Generation |
| b7 | DAP Verification | Authorized Management | |
| b6 | Delegated Management | Token Verification | |
| b5 | Card Lock | Global Delete | |
| b4 | Card Terminate | Global Lock | |
| b3 | Card Reset | Global Registry | |
| b2 | CVM Management | Final Application | |
| b1 | Mandated DAP Verification |
MSL (Minimum Security Level) — байт SPI1 по TS 102 225
| Значение | Описание |
|---|---|
| 00 | Нет проверки |
| 11 | RC/CC/DS |
| 12 | RC/DS/CC |
| 15 | RC/DS/CC + MAC |
| 16 | RC/DS/CC + MAC + Cipher |
| 19 | RC/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.
Структура пакета
| Поле | Размер | Описание |
|---|---|---|
| CPI | 1 | Command Packet Identifier (02) |
| CPL | 1 | Command Packet Length |
| CHI | 1 | Command Header Identifier (01) |
| CHL | 1 | Command Header Length |
| SPI | 2 | Security Parameter Indicator |
| KIc | 1 | Key Identifier для шифрования |
| KID | 1 | Key Identifier для MAC |
| TAR | 3 | Toolkit Application Reference |
| CNTR | 5 | Счётчик повторов |
| PCNTR | 1 | Padding counter |
| RC/CC/DS | 8 | Контрольная сумма / 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 / SPI2 | Security Parameter Indicators |
| TAR | Toolkit Application Reference |
| Counter | Счётчик повторов (5 байт) |
| KIc key / KID key | 16/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)
- Получите FID целевого файла (документация вендора или анализ ATR/файловой системы; такие файлы часто отсутствуют в открытых спецификациях).
- Откройте вкладку Card reader → подвкладку Custom files.
- Введите полный путь (например,
3F00/7F20/6F46) и псевдоним (например,EF.SPN). - Нажмите Add — файл появится в дереве курсивом (непроверенный).
- Кликните по файлу для проверки существования; при успехе (
9000) он работает как обычный файл. - Читайте, редактируйте и сохраняйте hex-данные; переключайте Raw/Decoded.
- Экспортируйте список пользовательских файлов в JSON для переноса на другие машины.
Сценарий B — Симуляция реальной сетевой среды для тестирования SIM
B.1 Ответы на PROVIDE LOCAL INFORMATION (PLI)
- Откройте Proactive UICC → PROVIDE LOCAL INFORMATION response data.
- Используйте формы декодирования/кодирования для IMEI (
01), Location Info (00), Access Technology (06) и т.д. - Нажмите Save — значения сохранятся на сервере.
- Включите Polling (интервал 30 с), чтобы карта периодически выдавала PLI.
- Сервер вставляет значения словаря в каждый TERMINAL RESPONSE.
- Проверьте в журнале проактивных команд: запись PLI покажет декодированный ответ.
B.2 Симуляция сетевых действий через ENVELOPE (event download)
- Проверьте список подписанных событий (из SET UP EVENT LIST).
- Нажмите Send на событии (например, Location Status) и заполните форму; будет отправлен
ENVELOPE(Event Download). - Для Network Rejection выберите тип регистрации → поля местоположения → технологию доступа → причину отклонения.
- Карта может ответить проактивной командой, которую обработчик цепочки зарегистрирует и обработает автоматически.
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.x | 1.x.x | ✅ Совместимы |
| 1.x.x | 0.x.x | ❌ Устарел — обновите сервер |
| 1.x.x | 2.x.x+ | ⚠️ Сервер новее — обновите PWA |
PWA проверяет версию сервера при подключении через GET /api/version и предупреждает о несовместимости.