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
- GlobalPlatform GPC v2.2 Amendment B v1.1 — Remote Application Management over HTTP
- ISO/IEC 7816-4 — команды обмена
- ISO/IEC 9797-1 — алгоритмы MAC
1.1 Интерфейс
- Шапка — версия приложения, кнопка INSTALL PWA (появляется, когда браузер предлагает установку, для офлайн-работы), ссылки на проект на GitHub и на эту справку, переключатель языка EN/RU и переключатель тёмной/светлой темы.
- Выбор языка и темы хранится в
localStorageи сохраняется между перезагрузками. - Вкладки верхнего уровня: Remote APDU (SIM RFM, USIM RFM, Expanded Script, RAM/GP, HTTP OTA, Разбор C-APDU, «Парсер ответов»), SCP80 (Secured Packet, Карты, RAM), «Картридер» (Файловый менеджер, Командная строка pySim, Отправка APDU), «Профайлер» (вкладки «Профили», «Снимки карт», «Пользовательские файлы») и «Симулятор телефона».
- Ссылка справка открывает эту документацию на разделе, соответствующем текущему представлению (например, вкладка «Профайлер» открывает §5).
2. Вкладка Remote APDU
Построение командных APDU (C-APDU). Семь подвкладок охватывают разные поколения карт, наборы команд и инструменты разбора: SIM RFM, USIM RFM, Expanded Script, RAM/GP, HTTP OTA, Разбор C-APDU и «Парсер ответов».
2.1 SIM RFM
CLA = A0 (GSM 11.11 / TS 151 011, ISO 7816-4). Удалённое управление файлами классических SIM-карт.
Команды собираются в виде цепочки: нажмите кнопку + SELECT (или другую командную кнопку), чтобы добавить строку, заполните её поля — предпросмотр цепочки (над кнопкой упаковки) обновится автоматически. Добавьте строку GET RESPONSE, чтобы получить данные после SELECT. Кнопка Упаковать в Secured packet упаковывает всю цепочку в пакет SCP80.
| Команда | INS | Описание |
|---|---|---|
| SELECT | A4 | Выбор EF/DF по FID, пути, AID или цепочке |
| 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 |
| DISABLE PIN | 26 | Отключение PIN |
| ENABLE PIN | 28 | Включение PIN |
| UNBLOCK PIN | 2C | Разблокировка PIN с помощью PUK |
| GET RESPONSE | C0 | Получение данных, на которые указывает предшествующий 61XX/9FXX |
Методы SELECT
| Метод | P1 | P2 | Ввод |
|---|---|---|---|
| По FID | 00 | 00 | FID (4 hex) |
| По полному пути от MF | 08 | 00 | Полный путь от MF |
| По DF name / AID | 04 | 00 | AID |
| Цепочка | 00 | 00 | FID через запятую; токен C0 (или C0:NN) вставляет GET RESPONSE |
Для record-команд режим P2: Absolute (04), Next (02) или Previous (03). Если за Case 4 командой сразу следует строка GET RESPONSE, сборщик цепочки автоматически убирает её байт Le (ETSI TS 102 226 §5.1.1). В правой колонке — панель конвертации (IMSI, MSISDN, ICCID, SPN, PLMN, nibble swap). См. §2.5.
2.2 USIM RFM
CLA = 00 (ETSI TS 102 221). Тот же сборщик цепочки и набор команд, что и SIM. Отличия:
- SELECT по умолчанию запрашивает FCP (P2=
04) и добавляет Le=00; флажок Silent (P2=0C) выбирает файл без запроса FCP (без Le, без данных ответа). - По пути предлагает выбор from MF (P1=
08) или from current DF (P1=09). - Каждый переход SELECT в цепочке запрашивает FCP, если не отмечен как silent.
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 |
Сборщик 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 сохраняет состояние безопасности/транзакции между пакетами
Декодирование ответов (TS 102 226 §5.2.2)
Входящие ответы Proof of Receipt декодируются сервером — формат expanded Remote Application response data (TS 102 226 §5.2.2) или компактный формат. Представление Secured Packet показывает результат после Отправить на карту (см. §3.1): статус PoR (TAR, счётчик, сырой PoR), а статусное слово и данные ответа последней команды подставляются в подвкладку «Парсер ответов» (Remote APDU).
2.4 RAM/GP
CLA = 80 (GlobalPlatform Card Specification v2.3.1). Команды удалённого управления приложениями. Строятся тем же сборщиком цепочки, что и SIM/USIM.
| Команда | INS | P1 | Описание |
|---|---|---|---|
| INSTALL [for load] | E6 | 02 | Регистрация загружаемого файла |
| INSTALL [for install] | E6 | 0C | Установка приложения или SD |
| INSTALL [make selectable] | E6 | 08 | Сделать приложение выбираемым |
| INSTALL [registry update] | E6 | 40 | Обновление реестра |
| INSTALL [extradition] | E6 | 10 | Перемещение между SD |
| LOAD | E8 | 80 | Загрузка блока кода (P1=80 последний блок, номер блока в P2) |
| DELETE | E4 | 00 | Удаление приложения или SD (P2=00 только AID / 80 AID + связанные объекты) |
| GET STATUS | F2 | 80/40/20/10 | Статус карты |
| GET DATA | CA | tag | Чтение объектов данных |
| STORE DATA | E2 | 00/40/80/C0/E0 | Запись данных |
| SET STATUS | F0 | 80/40/60 | Управление жизненным циклом |
| EXTERNAL AUTHENTICATE | 82 | 00 | Аутентификация SCP |
| INTERNAL AUTHENTICATE | 88 | 00 | Challenge-response |
| GET RESPONSE | C0 | 00 | Получение данных после 61XX (Le настраивается) |
Привилегии (INSTALL [for install])
Три байта привилегий (таблицы 11-7/8/9 спецификации GP), кодируются как length-value поле внутри данных INSTALL:
| Бит | Байт 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-строки чётной длины.
2.6 Разбор C-APDU
Вставка raw APDU hex и отображение сворачиваемого дерева. Автоматически определяет контейнер: Expanded Script (начало AA или AE80, декодируется по ETSI TS 102 226 §5.2.1) или Compact C-APDU chain (последовательность C-APDU ISO 7816). Каждый узел показывает метку, hex и краткое описание; родительские узлы раскрываются в подэлементы.
2.7 HTTP OTA
Сборка payload’ов Remote Application Management over HTTP по GlobalPlatform GPC v2.2 Amendment B v1.1 (§4.7). Два режима:
- Триггер (Push SMS) — параметры запуска административной сессии (
81 > 83 > 84/[85]/[86]/89, таблица 4-3). Сообщение, которое просит Security Domain карты исходящим запросом начать HTTP-сессию. - Store (параметры SD) — записывает те же параметры как данные карты (параметры Security Domain) командой STORE DATA в TLV-режиме (
80 E2 90 00, P1=90 = последний блок + BER-TLV по GP v2.2 Amendment B v1.1.3), обёрнутые в тег85(илиA5) по таблице 4-4.
Разделы соответствуют таблицам спецификации:
| Раздел | Tag | Содержимое |
|---|---|---|
| Параметры соединения | 84 | Любые COMPREHENSION-TLV для открытия TCP-соединения (OPEN CHANNEL по TS 102 223): Device Identities 02, Alpha 80, Bearer 01, вендорские TLV. Редактор строк + пресеты, редактируемый hex. |
| Параметры безопасности | 85 | Таблица 4-6: LV PSK Identity (текст), LV Key version/KID. Идентифицирует ключ PSK TLS (RFC 4279). |
| Политика повтора | 86 | Таблица 4-7: счётчик повторов (2 байта, напр. B000), задержка повторной попытки как timer TLV из TS 102 223 (25 03 HH MM SS), опциональный вендорский TLV отчёта о сбое. |
| HTTP POST | 89 | Таблицы 4-8/9/10: Host-заголовок (8A), X-Admin-From agent ID (8B), URI (8C) — текст преобразуется в октеты. |
Флажок Обёртка в Command Scripting template ('AA') оборачивает всю команду 81 в формат Expanded Remote Application data с определённой длиной (AA, ETSI TS 102 226 §5.2.1) для TAR-ов, обрабатывающих расширенный формат (RAM-over-HTTP §4.7).
Упаковать в Secured packet отправляет готовый payload на вкладку SCP80 для заполнения SPI/счётчика — там укажите TAR, который слушает SD (обычно TAR OTASD).
2.8 «Парсер ответов»
Декодирует raw-ответ команды: выберите отправленную команду, введите SW (например, 9000) и hex данных ответа, затем нажмите Декодировать. Поля также автоматически заполняются статусным словом и данными ответа последней команды после успешного нажатия Отправить на карту (см. §3.1).
- Команда — группа SIM/USIM (SELECT, STATUS, READ/UPDATE, PIN-операции, CAT-команды типа TERMINAL PROFILE/ENVELOPE/FETCH/TERMINAL RESPONSE, MANAGE CHANNEL, …) или группа RAM/GP (INSTALL, LOAD, DELETE, GET/STORE DATA, auth, SCP-команды).
- Декодирование SW — статусные слова разрешаются по generic-, UICC- (TS 102 221) и GlobalPlatform-таблицам, контекст определяется автоматически.
- Декодирование привилегий — ответы GET DATA / INSTALL декодируют байты привилегий в читаемые флаги.
- Данные ответа — raw hex отображается и интерпретируется согласно команде (например, FCP-шаблоны SELECT).
3. Вкладка SCP80
Верхнеуровневая вкладка SCP80 объединяет разделы, связанные с SCP80. Переключение — тремя переключателями: Secured Packet, Карты и RAM. Собирает защищённые пакеты SCP80 по ETSI TS 102 225.
3.1 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)
Кнопка Проверить в pySim сверяет собранный пакет с эталонной реализацией OtaDialectSms.encode_cmd. Кнопка Отправить на карту доставляет пакет через ENVELOPE SMS-PP-DOWNLOAD (при подключении к серверу). Полученный Proof of Receipt декодируется и показывается строкой статуса PoR (статус, TAR, счётчик, сырой PoR); статусное слово и данные ответа последней команды подставляются в подвкладку «Парсер ответов» (Remote APDU), а успешный PoR увеличивает счётчик повторов и очищает пакет.
3.2 Карты
Хранит предустановки карт локально в браузере (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) |
Обмен предустановками: Экспорт в JSON и Экспорт в файл для выгрузки, Импорт из файла, Вставить и импортировать или Импорт JSON из буфера для загрузки. Выбранная предустановка автоматически заполняет форму Secured Packet.
3.3 RAM
Выполняет операции удалённого управления приложениями (Remote Application Management) как защищённые пакеты SCP80 через SMS-PP-DOWNLOAD ENVELOPE. Карта должна поддерживать SCP03 (AES или 3DES). Предустановка карты из подвкладки Карты обеспечивает SPI, ключи, TAR и счётчик.
Операции
| Операция | Описание |
|---|---|
| Обзор карты (все данные GP) | Запрос GET STATUS для ISD, приложений, ELF и модулей ELF, а также GET DATA FF21 для информации о памяти. Результаты отображаются в обзоре с кнопками Удалить для каждого элемента. |
| Установка пакета (.cap файл) | Отправка .cap файла на карту через сервер: INSTALL[for load] → LOAD ×N → INSTALL[for install (+make selectable)]. |
Обзор карты (Explorer View)
После выполнения «Обзор карты» отображается:
- ISD — AID, жизненный цикл, привилегии (без удаления; ISD нельзя удалить)
- Приложения — AID, жизненный цикл, привилегии, связанный ELF/SD. Каждое имеет кнопку Удалить (GP
DELETEпо AID). - Исполняемые файлы загрузки (ELF) / пакеты — AID, жизненный цикл, версии, AID модулей. Каждый имеет Удалить (только ELF) и Удалить все (каскадное: ELF + модули + установленные приложения, P2=
0x80).
Удаление подтверждается через диалог браузера перед отправкой команды GP DELETE через SCP80. Обзор автоматически обновляется после успешного удаления.
4. Вкладка «Картридер» (pySim)
Подключение к локальному pysim-otaman-server для работы с картой: введите URL сервера (по умолчанию http://127.0.0.1:8080) и нажмите Подключиться. Область статуса показывает состояние ридера/карты, а Подключить карту (пере)инициализирует карту после вставки. Подвкладки: Файловый менеджер, Командная строка pySim и Отправка APDU. «Профайлер» и «Симулятор телефона» — отдельные вкладки верхнего уровня.
4.1 Файловый менеджер
Дерево файловой системы отображается слева; выбор файла открывает панель деталей справа. Элементы сгруппированы: DF выше EF, сортировка по FID или символьному имени (пиллы над деревом; выбор сохраняется в localStorage).
- Прочитать — чтение файла (автоопределение transparent/record)
- Редактировать — изменение hex-данных, Сохранить для записи (или Отмена)
- Данные как на карте / Декодированные данные — переключение между hex-дампом и декодированным JSON
4.2 Командная строка pySim
Выполнение любых команд pySim-shell с подсказками (300 мс) и автодополнением.
4.3 Отправка APDU
Отправка произвольного APDU и просмотр ответа.
4.4 Сценарии использования
Сценарий A — Работа с файлами, не входящими в модель pySim («Пользовательские файлы»)
- Получите FID целевого файла (документация вендора или анализ ATR/файловой системы; такие файлы часто отсутствуют в открытых спецификациях).
- Откройте вкладку «Картридер» → подвкладку «Пользовательские файлы».
- Введите полный путь (например,
3F00/7F20/6F46) и псевдоним (например,EF.SPN). - Нажмите Добавить — файл появится в дереве курсивом (непроверенный).
- Кликните по файлу для проверки существования; при успехе (
9000) он работает как обычный файл. - Читайте, редактируйте и сохраняйте hex-данные; переключайте Данные как на карте / Декодированные данные.
- Экспортируйте список пользовательских файлов в JSON для переноса на другие машины.
Сценарий B — Симуляция реальной сетевой среды для тестирования SIM
B.1 Ответы на PROVIDE LOCAL INFORMATION (PLI)
- Откройте Симулятор телефона → Данные для PROVIDE LOCAL INFORMATION.
- Используйте формы декодирования/кодирования для IMEI (
01), Location Info (00), Access Technology (06) и т.д. - Нажмите Сохранить — значения сохранятся на сервере.
- Включите Опрос (интервал 30 с), чтобы карта периодически выдавала PLI.
- Сервер вставляет значения словаря в каждый TERMINAL RESPONSE.
- Проверьте в журнале проактивных команд: запись PLI покажет декодированный ответ.
B.2 Симуляция сетевых действий через ENVELOPE (event download)
- Проверьте список подписанных событий (из SET UP EVENT LIST).
- Нажмите Отправить на событии (например, Location Status) и заполните форму; будет отправлен
ENVELOPE(Event Download). - Для Network Rejection выберите тип регистрации → поля местоположения → технологию доступа → причину отклонения.
- Карта может ответить проактивной командой, которую обработчик цепочки зарегистрирует и обработает автоматически.
B.3 Проверка симулированной среды
- Журнал проактивных команд показывает полный цикл (команда + байты TERMINAL RESPONSE).
- Кнопка Отправить STATUS / автопросмотр поддерживают сессию CAT (цикл дренажа).
5. Профайлер
Проверяет соответствие карты именованному профилю — упорядоченному набору правил, описывающих ожидаемую файловую систему и (опционально) содержимое файлов. Профили хранятся в localStorage.
Список профилей
- Новый профиль — создаёт пустой набор правил, запросив имя.
- Профиль с карты — сканирует подключённую карту и создаёт по одному правилу на каждый существующий файл (см. ниже), затем открывает редактор.
- Импорт профиля — загружает набор правил из JSON-файла (имя хранится внутри JSON).
- В каждой строке профиля показаны имя и время создания, а также действия Проверить карту ▶, Проверить снимок карты, Редактировать, Экспорт (скачать JSON) и Удалить.
Правила файловой системы
Правила выполняются последовательно. Редактор показывает символьное имя файла pySim (если известно) рядом с путём правила; Добавить правило добавляет правило, Сохранить сохраняет изменения. Правило файловой системы задаётся:
- Путь — начинается с
MF(например,MF/7F10/6F3A) или с AID ADF (например,A0000000871002/6F07). - Проверка FCP/FCI — какая часть информации об управлении файлом проверяется: Только тип файла (FCP) (существование + тип файла), Тип файла + размер (FCP) (добавляются размер файла либо длина/число записей для record-файлов) или Полный FCI (добавляется побайтовое сравнение сырого ответа SELECT — шаблона FCP
'62'— выявляет изменения FID/AID, жизненного цикла, атрибутов безопасности и проприетарных параметров). - Атрибуты файла — тип файла, размер, длина записи и число записей из FCP-шаблона (любой можно оставить незаданным).
- Проверить содержимое (опционально) — Точное (точное совпадение hex) или Маска, где
?— шаблон на один полубайт (маска без?— совпадение префикса, например0891для MCC/MNC из IMSI). Для record-файлов хранится список по записям.
Проверить карту выполняет каждое правило на подключённой карте и показывает строку прогресса и отчёт прохождения. Рядом с путём файла указывается, что именно проверялось (например, тип файла и размер, содержимое или полный FCI); если часть проверок прошла, а часть нет — каждый аспект помечается (тип файла ✓, размер ✗, содержимое ✓), а расхождения расписываются ниже. Несовпавшие сырые данные (FCI, содержимое, данные записей) показываются как поля только для чтения с моноширинным шрифтом — ожидаемое над фактическим, в одной и той же колонке — для удобного сравнения; для расхождений FCI дополнительно показывается декодированное сравнение по параметрам (размер файла, дескриптор/структура, жизненный цикл, FID, SFI, проприетарные параметры…). Декодированный просмотр FCI также отображается рядом с полем FCI hex при редактировании правила. Если данные FCI повреждены, показывается всё, что удалось декодировать до места ошибки, вместе с явным сообщением об ошибке декодирования. Для record-файлов при расхождении содержимого добавляется пометка совпадающие записи: 1-5, 7-10 со списком записей, которые совпали. Опция «Только расхождения» в заголовке отчёта скрывает все совпавшие файлы и оставляет только несовпадения и ошибки.
Опции сканирования «Профиль с карты»
Диалог сканирования запрашивает имя профиля и предлагает селектор «Проверка FCP/FCI» (те же три режима, по умолчанию Тип файла + размер (FCP)), применяемый ко всем создаваемым правилам, а также список «Игнорировать содержимое файлов» (все отмечены по умолчанию, кроме EF.ARR; флажок в заголовке отмечает или снимает весь список) часто перезаписываемых файлов, содержимое которых пропускается: EF.LOCI, EF.PSLOCI, EF.EPSLOCI, EF.5GS3GPPLOCI, EF.Keys, EF.KeysPS, EF.SMS, EF.Kc, EF.KcGPRS, EF.LOCIGPRS, EF.CBMID, EF.SMSS, EF.ACC, EF.EPSNSC, EF.START-HFN, EF.ARR. Ещё две отмеченные по умолчанию опции «Сравнивать первые 4 байта для» EF.IMSI и EF.ICCID захватывают содержимое этих файлов как маску только первых 4 байт (снимите для точного сравнения). Строка прогресса показывает N / всего файлов с текущим путём файла во время сканирования; при сканировании опции скрываются, а кнопки блокируются. Правила создаются только для файлов, которые реально существуют на карте (возвращён FCP-шаблон); отсутствующие файлы пропускаются. Пользовательские файлы из подвкладки «Пользовательские файлы» включаются с той же проверкой существования.
Снимки карт
Представление списка имеет две вкладки — «Профили» и «Снимки карт». Снимок карты — неизменяемая фиксация файловой системы карты: для каждого существующего файла сохраняются путь, символьное имя, тип, размер (или длина/число записей), сырой FCI из ответа SELECT и содержимое, если файл читается (без списка игнорирования и без масок). ICCID декодируется из EF.ICCID и показывается рядом с именем снимка. При сканировании измеряется время каждой команды карты (SELECT, READ BINARY, READ RECORD) от отправки до ответа; снимок хранит min/сред/max по каждому типу команд и общее время сканирования, а в представлении эти значения показываются в сводке под заголовком, время select/read — для каждого файла и время чтения — для каждой записи. Время носит информационный характер и не используется при проверках и сравнении.
- Новый снимок — запрашивает имя и сканирует карту, затем возвращает к списку.
- Импорт снимка — загружает снимок из JSON-файла.
- В каждой строке снимка — Открыть, Экспорт и Удалить. Открыть показывает все захваченные данные только для чтения (сырой FCI с декодированным FCI, содержимое); редактируется только имя снимка.
- Проверить снимок карты в строке профиля выполняет правила профиля на выбранном из списка снимке, без картридера. Отчёт такой же, как при проверке карты; файлы, содержимое которых не было захвачено при сканировании, помечаются как непроверяемые ошибки.
- Сравнить снимки сравнивает два снимка без картридера так же, как проверка профиля: выберите эталонный снимок и снимок для проверки, при необходимости включите маску первых 4 байт EF.IMSI/EF.ICCID (включена по умолчанию) и получите такой же отчёт; в этом отчёте поля расхождений и колонки сравнения FCI подписаны именами эталонного и проверяемого снимков вместо expected/actual. Файлы, которые есть только в проверяемом снимке, помечаются как лишние. «К списку» возвращает на вкладку «Снимки карт».
Пользовательские файлы
Добавление файлов, не покрытых моделью pySim: введите полный путь (например, 3F00/7F20/6F46) и псевдоним (например, EF.SPN), затем нажмите Добавить; добавленные файлы появляются в дереве «Файловый менеджер». Список сохраняется в localStorage; обмен — Экспорт в JSON / Экспорт в файл и Импорт из файла / Вставить и импортировать / Импорт JSON из буфера.
6. Симулятор телефона
Работа с сессией Card Application Toolkit. Две подвкладки: «Телефон» (меню STK, STATUS и опрос, подписанные события, журнал проактивных команд) и «Конфигурация TR» (данные ответов, подставляемые в TERMINAL RESPONSE для проактивных команд).
6.1 Меню STK
Если карта выдала команду SET UP MENU, вверху этого представления появляется блок «Меню STK» с изумрудной кнопкой STK: <название>, открывающей оверлей меню (браузер STK-меню карты). Если карта не задала меню, вместо кнопки показывается «Меню не задано картой». Состояние меню обновляется при каждом открытии представления. Интерактивные проактивные команды всегда получают TERMINAL RESPONSE: оверлей ждёт вашего выбора, и если вы не ответили и не нажали Timeout, сервер сам отвечает результатом timeout через --menu-timeout секунд (по умолчанию 60, 0 отключает). Назад и Timeout продолжают диалог с картой: если карта в ответ выдаёт следующую проактивную команду (SELECT ITEM или DISPLAY TEXT), панель показывает её; кэшированное верхнее меню появляется только когда карте больше нечего выполнять.
6.2 Подписанные события (SET UP EVENT LIST)
События, которые отслеживает карта. У каждого события есть кнопка Отправить, открывающая форму, специфичную для типа события:
- События без данных (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.3 Журнал проактивных команд
Хронологический список извлечённых проактивных команд. Каждая строка показывает время, код типа, имя и декодированный квалификатор (для команд, у которых он есть). Для команд с данными ответа показывается строка Ответ: с байтами TERMINAL RESPONSE (без служебных TLV); ответы PROVIDE LOCAL INFORMATION декодируются через словарь данных PLI.
6.4 Опрос STATUS
Кнопка Отправить STATUS отправляет STATUS (F2) вручную. Переключатель Опрос включает фоновый опрос: после настраиваемого интервала бездействия (аргумент сервера --poll-interval, 1–255 с, по умолчанию 30 с, 0 отключает опрос) сервер отправляет STATUS и обрабатывает любую ожидающую проактивную команду. При извлечении карты опрос останавливается, а состояние карты сбрасывается.
6.5 «Конфигурация TR» — данные ответа 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.
7. Установка сервера
Для работы с картой (вкладка «Картридер», «Симулятор телефона», доставка 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 Автоопределение ридера
- PC/SC (Linux) —
start.shпередаёт-p 0, если запущен демонpcscd - PC/SC (Windows) —
start.batвсегда использует-p 0(PC/SC встроен в Windows) - Резерв сервера — при запуске без аргументов ридера сервер сам опрашивает PC/SC-ридер при старте (3 попытки с интервалом 2 с)
- Serial-ридеры — запустите сервер вручную с
-d /dev/ttyUSB0(Linux)
Если карта отсутствует, вкладка «Картридер» показывает «Карта не обнаружена. Вставьте карту и нажмите Подключить карту».
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 и предупреждает о несовместимости.