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Описание
SELECTA4Выбор EF/DF по FID, пути, AID или цепочке
UPDATE RECORDDCОбновление записи
UPDATE BINARYD6Обновление бинарных данных
READ RECORDB2Чтение записи
READ BINARYB0Чтение бинарных данных
ERASE BINARY0EСтирание бинарных данных
ACTIVATE FILE44Активация файла
DEACTIVATE FILE04Деактивация файла
VERIFY PIN20Проверка PIN1 или PIN2
CHANGE PIN24Смена PIN1 или PIN2
DISABLE PIN26Отключение PIN
ENABLE PIN28Включение PIN
UNBLOCK PIN2CРазблокировка PIN с помощью PUK
GET RESPONSEC0Получение данных, на которые указывает предшествующий 61XX/9FXX

Методы SELECT

МетодP1P2Ввод
По FID0000FID (4 hex)
По полному пути от MF0800Полный путь от MF
По DF name / AID0400AID
Цепочка0000FID через запятую; токен 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-APDU22APDU
Immediate Action81Проактивная команда или action indicator
Error Action82Условное восстановление при ошибках с action indicator или проактивной командой
Script Chaining83Многопакетное выполнение скрипта с флагами 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> с номером записи 017F
  • Произвольный 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.

КомандаINSP1Описание
INSTALL [for load]E602Регистрация загружаемого файла
INSTALL [for install]E60CУстановка приложения или SD
INSTALL [make selectable]E608Сделать приложение выбираемым
INSTALL [registry update]E640Обновление реестра
INSTALL [extradition]E610Перемещение между SD
LOADE880Загрузка блока кода (P1=80 последний блок, номер блока в P2)
DELETEE400Удаление приложения или SD (P2=00 только AID / 80 AID + связанные объекты)
GET STATUSF280/40/20/10Статус карты
GET DATACAtagЧтение объектов данных
STORE DATAE200/40/80/C0/E0Запись данных
SET STATUSF080/40/60Управление жизненным циклом
EXTERNAL AUTHENTICATE8200Аутентификация SCP
INTERNAL AUTHENTICATE8800Challenge-response
GET RESPONSEC000Получение данных после 61XX (Le настраивается)

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

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

БитБайт 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-строки чётной длины.

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 POST89Таблицы 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.

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

ПолеРазмерОписание
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)

Кнопка Проверить в 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 / 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)

Обмен предустановками: Экспорт в 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
  • Проверить все файлы — обход всего дерева (включая пользовательские файлы) с пометкой каждого элемента: есть (обычный вид) или нет (красный ✗, без стрелки разворачивания); существующие пустые DF показывают (пусто). Отображается прогресс N / всего, обход можно остановить; в конце — сводка «есть/нет». Файлы проверяются только при разворачивании или проверке — просмотр остаётся ленивым.

4.2 Командная строка pySim

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

4.3 Отправка APDU

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

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

Сценарий A — Работа с файлами, не входящими в модель pySim («Пользовательские файлы»)

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

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

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

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

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

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

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.x1.x.x✅ Совместимы
1.x.x0.x.x❌ Устарел — обновите сервер
1.x.x2.x.x+⚠️ Сервер новее — обновите PWA

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