OTAMan Документация
1. Обзор
OTAMan — Progressive Web App (PWA) для построения APDU-команд, сборки защищённых пакетов SCP80, просмотра меню SIM Toolkit (STK) и симуляции реальной сетевой среды для тестирования SIM/USIM/UICC-карт через PC/SC-ридер.
Приложение — один статический файл index.html. Все вычисления выполняются в браузере; доступ к карте — через локальный HTTP-сервер (pysim-otaman-server), оборачивающий библиотеку pySim.
Браузер (OTAMan PWA) → HTTP :8080 → pysim-otaman-server → pySim → PC/SC → ридер → UICC/SIM
Стандарты, на которые опирается приложение:
- ETSI TS 102 221 — интерфейс UICC-терминал (CLA 00, файлы USIM)
- ETSI TS 102 222 — административные команды
- ETSI TS 102 223 — Card Application Toolkit (CAT, проактивные команды)
- ETSI TS 102 225 — структура защищённых пакетов для (U)SIM toolkit
- ETSI TS 102 226 — структура удалённых APDU для UICC-приложений
- ETSI TS 151 011 — интерфейс SIM-ME (CLA A0)
- 3GPP TS 131 111 — USIM Application Toolkit (USAT)
- 3GPP TS 31.102 — характеристики приложения USIM
- 3GPP TS 23.038 — алфавит GSM 7-bit и DCS
- 3GPP TS 24.008 / 24.301 / 24.501 — коды причин NAS
- GlobalPlatform Card Specification v2.3.1
- ISO/IEC 7816-4 — команды обмена
- ISO/IEC 9797-1 — алгоритмы MAC
2. Вкладка C-APDU
Построение командных APDU (C-APDU). Пять подвкладок охватывают разные поколения карт и наборы команд: SIM RFM, USIM RFM, Expanded Script, RAM/GP и C-APDU Parser.
2.1 SIM RFM
CLA = A0 (GSM 11.11 / TS 151 011, ISO 7816-4). Удалённое управление файлами классических SIM-карт.
Команды собираются в виде цепочки: нажмите кнопку + Command, чтобы добавить строку, заполните её поля — предпросмотр цепочки (над кнопкой упаковки) обновится автоматически. Добавьте строку GET RESPONSE, чтобы получить данные после SELECT. Кнопка Pack into 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 |
| Response Type | - | Индикатор типа ответа: expanded/compact/none |
Сборщик Immediate Action предлагает action indicator (81/82), структурированный сборщик проактивных команд (REFRESH, DISPLAY TEXT, PLAY TONE с авто-генерацией COMPREHENSION-TLV), или ручной hex-ввод.
Error Action TLV (Tag 82)
Восстановление при ошибках по TS 102 226 §5.2.1.3 — одна из трёх форм:
- Проактивная команда: набор COMPREHENSION-TLV с DISPLAY TEXT или PLAY TONE (в Error Action допустимы только эти две, TS 102 226 Table 5.9)
- Без действия:
82 00 - Ссылка на запись EFRMA:
82 01 <ref>с номером записи01–7F - Произвольный hex: произвольное значение TLV
Script Chaining TLV (Tag 83)
Многопакетное выполнение скрипта с сохранением контекста:
- Флаги цепочки:
01первый скрипт (удалять инфо о цепочке при сбросе),11первый скрипт (сохранять инфо о цепочке при сбросе, только RFM),02последующий скрипт (будут ещё),03последующий скрипт (последний) - Идентификатор скрипта: Корреляционный идентификатор между пакетами (1-4 байта hex, авто-инкремент подсказки)
- Дополнительные данные: Расширенная информация цепочки (опционально hex)
- Сохранение контекста: UICC сохраняет состояние безопасности/транзакции между пакетами
Expanded Remote Response (TS 102 226 §5.2.2)
Результаты по каждой команде с деталями ошибок и контекстом цепочки:
- Номер команды, статус слова, данные ответа для каждой команды
- Код ошибки и информация о ней для неудачных команд (подсвечено красным)
- Идентификатор скрипта и позиция для корреляции цепочки (ID, FIRST, LAST)
- Индикатор типа ответа: 'expanded' vs 'compact' vs 'none'
2.4 RAM/GP
CLA = 80 (GlobalPlatform Card Specification v2.3.1). Команды удалённого управления приложениями. Строятся тем же сборщиком цепочки, что и 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 Parser
Вставка raw APDU hex и отображение сворачиваемого дерева. Автоматически определяет контейнер: Expanded Script (начало Верхнеуровневая вкладка SCP80 объединяет разделы, связанные с SCP80. Переключение — тремя переключателями: Secured Packet, Cards и RAM. Собирает защищённые пакеты SCP80 по ETSI TS 102 225. Собирает защищённые пакеты SCP80 по ETSI TS 102 225. Кнопка «Verify vs pySim» сверяет собранный пакет с эталонной реализацией Хранит предустановки карт локально в браузере ( Export as JSON / Import JSON from clipboard для обмена предустановками. Выбранная предустановка автоматически заполняет форму Secured Packet. Выполняет операции удалённого управления приложениями (Remote Application Management) как защищённые пакеты SCP80 через SMS-PP-DOWNLOAD ENVELOPE. Карта должна поддерживать SCP03 (AES или 3DES). Предустановка карты из подвкладки Cards обеспечивает SPI, ключи, TAR и счётчик. После выполнения «Explore Card» отображается: Удаление подтверждается через диалог браузера перед отправкой команды GP Декодирует raw-ответ команды: выберите отправленную команду, введите SW (например, Подключение к локальному pysim-otaman-server для работы с картой. Подвкладки: File manager, Custom files, Profiler, pySim command line, Raw APDU и Proactive UICC. Добавление файлов, не покрытых моделью pySim. Сохраняется в Выполнение любых команд pySim-shell с подсказками (300 мс) и автодополнением. Отправка произвольного APDU и просмотр ответа. Работа с сессией Card Application Toolkit: меню STK, подписанные события, журнал проактивных команд, словарь данных PROVIDE LOCAL INFORMATION и опрос STATUS. Если карта выдала команду SET UP MENU, вверху этого представления появляется блок «STK menu» с изумрудной кнопкой STK: <название>, открывающей оверлей меню (браузер STK-меню карты). Если карта не задала меню, вместо кнопки показывается «No menu set by the card». Состояние меню обновляется при каждом открытии представления. События, которые отслеживает карта. У каждого события есть кнопка Send, открывающая форму, специфичную для типа события: Отправка события использует Хронологический список извлечённых проактивных команд. Каждая строка показывает время, код типа, имя и декодированный квалификатор (для команд, у которых он есть). Для команд с данными ответа показывается строка Редактируемые hex-значения для всех 22 квалификаторов PLI (TS 102 223 §8.6 + TS 131 111). У десяти квалификаторов есть встроенные формы декодирования/кодирования: Значения хранятся на сервере до перезапуска. Когда карта выдаёт PLI, сервер вставляет значения словаря в TERMINAL RESPONSE. Кнопка Send STATUS отправляет STATUS (F2) вручную. Переключатель Polling включает фоновый опрос: после настраиваемого интервала бездействия (аргумент сервера Проверяет соответствие карты именованному профилю — упорядоченному набору правил, описывающих ожидаемую файловую систему и (опционально) содержимое файлов. Профили хранятся в Правила выполняются последовательно. Правило файловой системы задаётся: Check выполняет каждое правило на подключённой карте и показывает строку прогресса и отчёт прохождения (существование, каждый атрибут FCI и совпадение содержимого). Диалог сканирования запрашивает имя профиля и предлагает список «Ignore contents of» (все отмечены по умолчанию) часто перезаписываемых файлов, содержимое которых пропускается: B.1 Ответы на PROVIDE LOCAL INFORMATION (PLI) B.2 Симуляция сетевых действий через ENVELOPE (event download) B.3 Проверка симулированной среды Для работы с картой (вкладка Card reader, Proactive UICC, доставка OTA) нужен локальный pysim-otaman-server — встроенный в OTAMan HTTP-сервер, оборачивающий pySim, работающий с ридером через PC/SC или serial и раздающий сам PWA (откройте Если ридер не обнаружен, сервер запускается без аргументов и показывает «Reader: none». Карту можно инициализировать позже кнопкой Equip на вкладке Card reader. Подключите PC/SC-ридер с SIM-картой и откройте Если PWA раздаётся с публичного HTTPS-хоста (например, PWA проверяет версию сервера при подключении через AA или AE80, декодируется по ETSI TS 102 226 §5.2.1) или Compact C-APDU chain (последовательность C-APDU ISO 7816). Каждый узел показывает метку, hex и краткое описание; родительские узлы раскрываются в подэлементы.
3. Вкладка SCP80
3.1 Secured Packet
Структура пакета
Поле Размер Описание 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 (с шифрованием при необходимости) Крипто
x2)x2)10 (счётчик больше) или 11 (счётчик +1) согласно TS 102 225 §5.1.2/§5.1.3.100 по умолчанию или FF)OtaDialectSms.encode_cmd. Кнопка «Send to Card» доставляет пакет через ENVELOPE SMS-PP-DOWNLOAD (при подключении к серверу).3.2 Cards
localStorage), чтобы представление Secured Packet могло автоматически подставлять ключи и параметры.
Поле Описание Name Понятная метка ICCID Опциональный идентификатор карты KIc / KID Индикаторы ключа и алгоритма (например, 15 = индекс 1, 3DES-CBC2; x2 = AES) SPI1 / SPI2 Security Parameter Indicators TAR Toolkit Application Reference Counter Счётчик повторов (5 байт) KIc key / KID key 16/24/32 hex-символа (ключи 8/16/24 байта 3DES) или 32/48/64 hex-символа (ключи 16/24/32 байта AES) 3.3 RAM
Операции
Операция Описание Explore Card (all GP data) Запрос GET STATUS для ISD, приложений, ELF и модулей ELF, а также GET DATA FF21 для информации о памяти. Результаты отображаются в обзоре с кнопками Delete для каждого элемента. Install Package (.cap file) Отправка .cap файла на карту через сервер: INSTALL[for load] → LOAD ×N → INSTALL[for install (+make selectable)].Обзор карты (Explorer View)
DELETE по AID).0x80).DELETE через SCP80. Обзор автоматически обновляется после успешного удаления.4. Вкладка Response parser
9000) и hex данных ответа, затем нажмите Decode.
5. Вкладка Card reader (pySim)
5.1 File manager
5.2 Custom files
localStorage; экспорт/импорт JSON.5.3 pySim command line
5.4 Raw APDU
5.5 Proactive UICC
5.5.1 Меню STK
5.5.2 Подписанные события (SET UP EVENT LIST)
9B)BF)ENVELOPE(Event Download) по TS 102 223 / TS 131 111.5.5.3 Журнал проактивных команд
Response: с байтами TERMINAL RESPONSE (без служебных TLV); ответы PROVIDE LOCAL INFORMATION декодируются через словарь данных PLI.5.5.4 Словарь данных PROVIDE LOCAL INFORMATION
5.5.5 Опрос STATUS
--poll-interval, 1–255 с, по умолчанию 30 с) сервер отправляет STATUS и обрабатывает любую ожидающую проактивную команду. При извлечении карты опрос останавливается, а состояние карты сбрасывается.5.6 Profiler
localStorage.Список профилей
Правила файловой системы
MF (например, MF/7F10/6F3A) или с AID ADF (например, A0000000871002/6F07).? — шаблон на один полубайт (маска без ? — совпадение префикса, например 0891 для MCC/MNC из IMSI). Для record-файлов хранится список по записям.Опции сканирования «Profile from card»
EF.LOCI, EF.PSLOCI, EF.EPSLOCI, EF.5GS3GPPLOCI, EF.Keys, EF.KeysPS, EF.SMS, EF.Kc, EF.KcGPRS, EF.LOCIGPRS, EF.CBMID, EF.SMSS. Правила создаются только для файлов, которые реально существуют на карте (возвращён FCI-шаблон); отсутствующие файлы пропускаются. Пользовательские файлы из подвкладки Custom files включаются с той же проверкой существования.5.7 Сценарии использования
Сценарий A — Работа с файлами, не входящими в модель pySim (Custom files)
3F00/7F20/6F46) и псевдоним (например, EF.SPN).9000) он работает как обычный файл.Сценарий B — Симуляция реальной сетевой среды для тестирования SIM
01), Location Info (00), Access Technology (06) и т.д.
ENVELOPE(Event Download).
6. Установка сервера
http://127.0.0.1:8080).6.1 Требования
pippcsc-lite + ccidpyscard (обёртка драйвера 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 не нужны.6.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, автоопределение ридера)
6.3 Быстрый старт — Windows
git clone https://github.com/anttro/otaman.git
cd otaman
setup.bat # создаёт .venv, устанавливает pysim + сервер (однократно)
start.bat # запускает сервер (PWA + API)
6.4 Вспомогательные скрипты
Скрипт Назначение setup.sh / setup.bat Создаёт .venv/, устанавливает pySim и сервер. Запускается один раз после клонирования.start.sh / start.bat Запускает сервер из venv (при отсутствии — из глобальной установки). 6.5 Автоопределение ридера (
start.sh)
pcscd, передаёт -p 0/dev/ttyUSB0, передаёт -d /dev/ttyUSB0-p 0 (PC/SC встроен в Windows)6.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
http://127.0.0.1:8080 — PWA и API на одном origin, поэтому CORS не требуется.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.7. Совместимость версий
PWA (OTAMan) Сервер Статус 1.x.x 1.x.x ✅ Совместимы 1.x.x 0.x.x ❌ Устарел — обновите сервер 1.x.x 2.x.x+ ⚠️ Сервер новее — обновите PWA GET /api/version и предупреждает о несовместимости.