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 и переключатель тёмной/светлой темы. Рядом с заголовком небольшой индикатор показывает состояние сервера/карты (серая точка = подключение, красная = нет сервера, значки карты = нет карты / инициализация / карта готова) и компактный значок ADM ✓ (зелёный, администраторский PIN подтверждён) или ADM ✗ (красный, не подтверждён) для текущей сессии карты.
- Выбор языка и темы хранится в
localStorageи сохраняется между перезагрузками. - Вкладки верхнего уровня: Remote APDU (SIM RFM, USIM RFM, Expanded Script, RAM/GP, HTTP OTA, Разбор C-APDU, «Парсер ответов»), SCP80 (Secured Packet, RAM), SCP81 («Слушатель», «Скрипты»), «Карты», «Профайлер» (вкладки «Профили», «Снимки карт», «Пользовательские файлы»), «Картридер» (Файловый менеджер, Командная строка 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 могло автоматически подставлять ключи и параметры, а слушатель SCP81 HTTP OTA — находить PSK-ключи. Вкладка «Карты» — верхнеуровневая.
| Поле | Описание |
|---|---|
| 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) |
| PSK identity | SCP81 HTTP OTA: идентификатор, который карта присылает в TLS-рукопожатии (например, 89390100000129506903) |
| PSK key | SCP81 HTTP OTA: 32 hex-символа (16 байт). Слушатель выбирает этот ключ, когда карта предъявляет совпадающий идентификатор; предустановка с ключом без идентификатора игнорируется (и помечается в таблице) |
Столбец SCP81 показывает, задана ли в предустановке рабочая пара PSK. Кнопка Изменить загружает предустановку в форму (кнопка становится Сохранить; Отмена очищает форму), поэтому поля можно менять без повторного ввода карты. Обмен предустановками: Экспорт в JSON и Экспорт в файл для выгрузки, Импорт из файла, Вставить и импортировать или Импорт JSON из буфера для загрузки. Выбранная предустановка автоматически заполняет форму Secured Packet; изменения сразу передаются работающему слушателю SCP81.
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)]. Load-файл делится на LOAD APDU, каждый из которых помещается в один SMS SCP80; поле размер блока LOAD переопределяет авто-подобранный размер (пусто = максимальный размер, чей secured-пакет укладывается в 140 октетов), так что большой .cap просто занимает несколько SMS. |
Обзор карты (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). При выборе файла над содержимым также показываются FID, тип файла, размер / структура записей и декодированный FCI.
- Прочитать — чтение файла (автоопределение transparent/record)
- Редактировать — изменение hex-данных, Сохранить для записи (или Отмена)
- Данные как на карте / Декодированные данные — переключение между hex-дампом и декодированным JSON
- Проверить все файлы — обход всего дерева (включая пользовательские файлы) с пометкой каждого элемента: есть (обычный вид) или нет (красный ✗, без стрелки разворачивания); существующие пустые DF показывают
(пусто). Отображается прогресс N / всего, обход можно остановить; в конце — сводка «есть/нет». Файлы проверяются только при разворачивании или проверке — просмотр остаётся ленивым.
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) и Удалить. Клонировать создаёт копию профиля с именем Копия <профиль> (с суффиксом
(2),(3)…, если такое имя уже занято) и открывает копию в редакторе, чтобы изменить имя и содержимое перед сохранением.
Правила файловой системы
Правила выполняются последовательно. Редактор показывает символьное имя файла 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 со списком записей, которые совпали. В отчёте поля расхождений и колонки сравнения FCI подписаны ожидалось (имя профиля) и фактически (ICCID карты), а в заголовке отчёта выводится Результаты проверки профиля: <профиль> → <ICCID карты>. Опция «Только расхождения» в заголовке отчёта скрывает все совпавшие файлы и оставляет только несовпадения и ошибки.
Опции сканирования «Профиль с карты»
Диалог сканирования запрашивает имя профиля и предлагает селектор «Проверка 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, содержимое); редактируется только имя снимка.
- Проверить снимок карты в строке профиля выполняет правила профиля на выбранном из списка снимке, без картридера. Отчёт такой же, как при проверке карты: фактическая сторона подписана именем снимка (фактически (имя снимка)), а в заголовке — Результаты проверки профиля: <профиль> → <имя снимка>; файлы, содержимое которых не было захвачено при сканировании, помечаются как непроверяемые ошибки.
- Сравнить снимки сравнивает два снимка без картридера так же, как проверка профиля, но всегда точно (маскирование содержимого не применяется): выберите эталонный снимок и снимок для проверки и получите такой же отчёт; в этом отчёте заголовок — Результаты сравнения снимков: <эталон> → <проверяемый>, а поля расхождений и колонки сравнения 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 Журнал проактивных команд
Хронологический список извлечённых проактивных команд. Каждая строка показывает время, код типа, имя и декодированный квалификатор (для команд, у которых он есть). Раскрытие строки показывает декодированную команду: текст и пункты DISPLAY TEXT / SELECT ITEM / SET UP MENU, параметры BIP-каналов, действия TIMER MANAGEMENT, названия квалификаторов PROVIDE LOCAL INFORMATION (все стандартные, включая ESN 07, MEID 0B и Supported RATs 1A) и SEND SHORT MESSAGE — разбирается SMS TPDU (тип, TP-MR, TP-DA, TP-PID, TP-DCS, срок действия, TP-UDL), а пользовательские данные показываются как текст для текстовых кодировок (GSM 7-бит, UCS2, 8-бит) или как secured-пакет (TS 31.115) при TP-PID = 7F (SIM data download); заголовки конкатенации UDH декодируются. Для команд с данными ответа показывается строка Ответ: с байтами 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 и предупреждает о несовместимости.