Docs: - SCP80 tab is now a parent section (3) with subsections 3.1/3.2/3.3 - Renumbered sections: Response parser→4, Card reader→5, Server→6, Version compat→7 - Applied to help.html, help-ru.html, README.md, README_RUS.md C-APDU/RAM form labels (GP + JavaCard terminology): - AID → Application / Instance AID - ELF AID → Load File AID / Package AID - Module AID → Executable Module AID / Applet Class AID SCP80/RAM explorer labels (GP + JavaCard terminology): - ISD → ISD (Issuer Security Domain) - Applications → Applications / Applet Instances - Executable Load Files → Executable Load Files (ELFs) / Packages - AID → Application/Instance AID or Load File AID/Package AID (context-dependent) - Module AIDs → Executable Module AIDs / Applet Class AIDs UX fixes: - Delete All button now matches Delete button style (red) - Explorer results cleared when switching away from Explore Card operation - KIc/KID dropdowns (index + algorithm) now update when selecting saved card - Added LANG_RU translations for new labels
27 KiB
OTAMan — SIM OTA toolkit: PWA + локальный сервер карт
OTAMan — автономный offline-PWA (HTML/JS) для создания APDU-команд (SIM, USIM, GlobalPlatform RAM), сборки защищённых пакетов SCP80 по ETSI TS 102 225 и построения Expanded Remote Application data format APDU по ETSI TS 102 226. В комплекте — pysim-otaman-server — локальный HTTP-сервер поверх pySim для работы с картой: файловый менеджер, сырые APDU, меню SIM Toolkit и доставка OTA.
Демо: otaman.atroshin.ru — только PWA, для экспериментов. Для функций картридера установите сервер (ниже).
Быстрый старт
Только PWA (клиентские функции): откройте frontend/index.html в любом браузере или раздайте frontend/ любым статическим сервером. Python не нужен.
Полная установка (PWA + сервер карт):
git clone https://github.com/anttro/otaman.git
cd otaman
./setup.sh # или setup.bat в Windows — создаёт .venv, ставит pysim + сервер
./start.sh # или start.bat — запускает сервер (он же раздаёт PWA)
Затем откройте http://127.0.0.1:8080 — интерфейс и API на одном origin, поэтому CORS и разрешения браузера не нужны.
Сборка
Для стилей используется Tailwind CSS. После клонирования пересоберите CSS:
cd frontend
npm install
npm run build
Интерфейс
Четыре вкладки: C-APDU, SCP80, Response parser, Card reader. Вкладки C-APDU и SCP80 имеют подвкладки.
Вкладка C-APDU
Построение команд APDU (C-APDU). Пять подвкладок для разных поколений карт и наборов команд.
SIM RFM
CLA = A0 (GSM 11.11 / ISO 7816-4).
Команды
| Команда | INS | Описание |
|---|---|---|
| SELECT | A4 | Выбор EF/DF по FID, пути, dfname или цепочке |
| UPDATE RECORD | DC | Обновление записи |
| UPDATE BINARY | D6 | Обновление бинарных данных |
| READ RECORD | B2 | Чтение записи |
| READ BINARY | B0 | Чтение бинарных данных |
| ERASE BINARY | 0E | Стирание бинарных данных |
| ACTIVATE FILE | 44 | Активация файла |
| DEACTIVATE FILE | 04 | Деактивация файла |
| VERIFY PIN | 20 | Проверка PIN1 или PIN2 |
| CHANGE PIN | 24 | Смена PIN1 или PIN2 |
Методы SELECT
| Метод | P1 | P2 | Ввод |
|---|---|---|---|
| By FID | 00 | 00 | FID (4 hex) |
| By full path from MF | 08 | 00 | Полный путь от MF |
| By DF name / AID | 04 | 00 | AID |
| ADF RFM chain | 00 | 00 | FID через запятую |
Опции
- Start with SELECT — добавить SELECT перед командой.
- Selection mode (P2) — для record-команд: Absolute (04), Next (06), Previous (02).
- Record size — дополнить/обрезать данные до указанного размера.
- Allow P1/P2 editing — ручное редактирование P1/P2.
Ссылки
- ISO/IEC 7816-4: Organization, security and commands for interchange
- ETSI TS 102 226: Remote APDU structure for UICC based applications
- GSM 11.11: SIM-ME Interface
USIM RFM
CLA = 00 (ETSI TS 102 221). Те же команды, что и SIM, но SELECT использует P1=09, P2=0C.
Ссылки
- ETSI TS 102 221: UICC-Terminal Interface
- ETSI TS 102 226: Remote APDU structure
Expanded Script
Построение Expanded Remote Application data format по 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 | Proactive-команда или action indicator |
| Error Action | 82 | Proactive-команда при ошибке |
| Script Chaining | 83 | Данные для многопакетных скриптов |
Сборщик Immediate Action
- Action indicator:
81/82 - Proactive command: REFRESH, DISPLAY TEXT, PLAY TONE
- Custom hex: ручной ввод
Ссылки
- ETSI TS 102 226 §5.2.1
- ETSI TS 102 223: Card Application Toolkit
- ETSI TS 101 220: BER-TLV tag assignments
RAM/GP
CLA = 80 (GlobalPlatform v2.3.1). Удалённое управление содержимым карты через SCP80.
Справочник GP-команд
| Команда | INS | P1 | Описание |
|---|---|---|---|
| INSTALL [for load] | E6 | 02 | Регистрация загружаемого файла |
| INSTALL [for install] | E6 | 0C | Установка приложения или SD |
| INSTALL [for make selectable] | E6 | 10 | Сделать приложение выбираемым |
| INSTALL [for registry update] | E6 | 01 | Обновление реестра |
| INSTALL [for extradition] | E6 | 04 | Перемещение между SD |
| LOAD | E8 | 00 | Загрузка кода |
| DELETE | E4 | 00/80 | Удаление приложения или SD |
| GET STATUS | F2 | 80/40/20/10 | Статус карты |
| GET DATA | CA | tag | Чтение объектов данных |
| STORE DATA | E2 | 00/40/80/C0 | Запись данных |
| SET STATUS | F0 | 80/40/60 | Управление жизненным циклом |
| EXTERNAL AUTHENTICATE | 82 | 00 | Аутентификация SCP |
| INTERNAL AUTHENTICATE | 88 | 00 | Challenge-response |
Привилегии (INSTALL [for install])
Три байта привилегий по GP Spec Tables 11-7, 11-8, 11-9.
Байт 1:
| Бит | Привилегия |
|---|---|
| b8 | Security Domain |
| b7 | DAP Verification |
| b6 | Delegated Management |
| b5 | Card Lock |
| b4 | Card Terminate |
| b3 | Card Reset |
| b2 | CVM Management |
Байт 2:
| Бит | Привилегия |
|---|---|
| b8 | Trusted Path |
| b7 | Authorized Management |
| b6 | Token Verification |
| b5 | Global Delete |
| b4 | Global Lock |
| b3 | Global Registry |
| b2 | Final Application |
Байт 3:
| Бит | Привилегия |
|---|---|
| b8 | Receipt Generation |
Параметры SIM/UICC Toolkit
- Tag
CA(SIM Toolkit): Priority, Timers, Text Length, Menu Entries, Positions, Channels, MSL, TAR, Access Domain - Tag
80(UICC Toolkit, внутриEA): те же поля без Access Domain
MSL (Minimum Security Level):
| Значение | Описание |
|---|---|
| 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
| Значение | Описание |
|---|---|
| 80 | Issuer Security Domain (ISD) |
| 40 | Applications и SSD |
| 20 | Executable Load Files |
| 10 | ELF и модули |
GET STATUS P2
| Значение | Описание |
|---|---|
| 40 | Первые/все, GP TLV (по умолчанию) |
| 42 | Следующие, GP TLV |
| 00 | Первые/все, старый формат (deprecated) |
| 02 | Следующие, старый формат (deprecated) |
GET DATA теги
| Тег | Объект данных |
|---|---|
| 42 | Issuer Identification Number (IIN) |
| 45 | Card Image Number (CIN) |
| 66 | Card Data / SD Management Data |
| 67 | Card Capability Information |
| E0 | Key Information Template |
| D3 | Current Security Level |
| 2F00 | List of Applications |
| FF21 | Extended Card Resources Info |
| 5F50 | SD Manager URL |
| C1 | Sequence Counter (SCP02/03) |
| C2 | Confirmation Counter |
| 7F21 | Certificate (SD public key) |
| 5031 | Certificate info (EF.OD) |
DELETE P1
| Значение | Описание |
|---|---|
| 00 | Только AID |
| 80 | AID и связанные объекты |
STORE DATA P1
| Значение | Описание |
|---|---|
| 00 | Последний блок, без шифрования |
| 40 | Ещё блоки, без шифрования |
| 80 | Последний блок, с шифрованием |
| C0 | Ещё блоки, с шифрованием |
SET STATUS
P1: 80 = ISD, 40 = Приложение или SSD, 60 = SD и его приложения
P2: 00 = Разблокировать, 80 = Заблокировать (LOCKED)
Ссылки
- GlobalPlatform Card Specification v2.3.1
- ETSI TS 102 226 §8.2.1.3.2: Параметры SIM/UICC Toolkit
Конвертация (боковые панели SIM/USIM)
IMSI → EF.IMSI
15-значный IMSI → 9 байт EF.IMSI.
MSISDN → BCD
Удаление +, добавление f, обмен полубайтов.
ICCID → hex
Обмен полубайтов строки ICCID.
Provider Name → SPN
По 3GPP TS 31.102 §4.2.5. Три варианта кодирования:
- GSM 7-bit packed
- UCS2 non-BMP
- UCS2 BMP non-GSM7
PLMN → EF_PLMNsel / PLMNwAcT
3-байтное BCD-кодирование + опциональный Access Technology.
Nibble swap
Обмен полубайтов hex-строки.
Ссылки
- 3GPP TS 31.102
- 3GPP TS 23.038
- ETSI TS 102 225
- pySim: enc_imsi()
Вкладка SCP80
Вкладка SCP80 группирует SCP80-виды, переключаемые тремя пиллами: Secured Packet, Cards и RAM. Сборка защищённых пакетов по ETSI TS 102 225.
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 (с шифрованием при необходимости) |
SPI1 (Уровень безопасности)
Битовое поле SPI1 (TS 102 225 §5.1.1): b8–b6 — паддинг, b5–b4 — счётчик, b3 — шифрование, b2–b1 — RC/CC/DS.
| Значение | Безопасность | Шифрование | Счётчик (b5 b4) |
|---|---|---|---|
| 00 | Нет | Нет | 00 нет |
| 01 | RC | Нет | 00 нет |
| 02 | CC/MAC | Нет | 00 нет |
| 06 | CC/MAC | Да | 00 нет |
| 0A | CC/MAC | Нет | 01 available |
| 0E | CC/MAC | Да | 01 available |
| 12 | CC/MAC | Нет | 10 higher |
| 16 | CC/MAC | Да | 10 higher |
| 1A | CC/MAC | Нет | 11 +1 |
| 1E | CC/MAC | Да | 11 +1 |
AES требует
b5 b4 = 10(higher) или11(+1) согласно TS 102 225 §5.1.2 и §5.1.3.1. Значения00/01/02/06(без счётчика) допустимы только для 3DES.
SPI2 (PoR)
| Значение | Режим |
|---|---|
| 00 | No PoR |
| 01 | PoR required, no security |
| 05 | PoR required, RC |
| 09 | PoR required, CC |
| 0D | PoR required, DS |
| 11 | PoR required, ciphered |
| 02 | PoR on error, no security |
| 06 | PoR on error, RC |
Крипто
- 3DES-CBC шифрование, ключи 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) - Padding byte:
00(по умолчанию) илиFF
PoR (Proof of Reception)
PoR подтверждает, что карта получила и выполнила защищённый пакет. Два режима:
| SPI2 (бит 5) | Режим | Описание |
|---|---|---|
0x00 |
Delivery PoR | PoR возвращается в ответе ENVELOPE (SW+данные) |
0x20 |
Submit PoR | PoR отправляется обратно как SMS-SUBMIT через прокоманду FETCH |
Delivery PoR (SPI2 01) проще — карта возвращает PoR напрямую в ответе ENVELOPE. Submit PoR (SPI2 21) используется, когда карта не может ответить inline (ограничено пространство ответа ENVELOPE).
Ссылки
- ETSI TS 102 225 V18.1.0
- ETSI TS 102 226
- ISO 9797-1
- NIST SP 800-38B (CMAC)
Cards
Пилл Cards управляет сохранёнными конфигурациями карт (пресеты). Каждый пресет хранит криптографические ключи, настройки TAR и счётчик повторов для SCP80-операций.
| Поле | Описание |
|---|---|
| SPI1 / SPI2 | Уровень безопасности и настройки PoR |
| Ключ KIc / KID | Hex ключи шифрования и MAC |
| Индекс KIc / KID | Номер версии ключа |
| TAR | Toolkit Application Reference (3 байта) |
| Счётчик (CNTR) | 10-значный hex счётчик повторов, автоматически увеличивается после каждой успешной отправки SCP80 |
Добавить карту: заполните имя, SPI1/SPI2, ключи KIc/KID и их индексы, TAR, нажмите Add. Карта появится в списке и станет доступна в выпаданом списке Card preset на RAM-вкладке.
Редактировать карту: выберите карту в списке, измените поля, нажмите Save.
Удалить карту: выберите карту, нажмите Delete. Удаляет пресет из localStorage.
Счётчик: 10-значный hex-счётчик (CNTR) автоматически увеличивается после каждой успешной отправки SCP80 (ручные отправки Secured Packet и RAM-операции). Обновлённый счётчик автоматически сохраняется обратно в пресет.
RAM
Все операции RAM отправляются как защищённые пакеты SCP80 (ETSI TS 102 225) через SMS-PP-DOWNLOAD ENVELOPE. Карта должна поддерживать SCP03 (AES или 3DES) для безопасной транспортировки.
Выберите сохранённую конфигурацию карты из выпадающего списка Card preset. Если пресет не выбран, RAM-вкладка предупреждает и отказывается выполнять.
В RAM-подвкладке доступны две операции через выпадающий список Operation:
| Операция | Описание |
|---|---|
| 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)
После выполнения "Explore Card" отображается:
- ISD — AID, жизненный цикл, привилегии (без удаления; ISD нельзя удалить)
- Приложения — AID, жизненный цикл, привилегии, связанный ELF/SD. Каждое имеет кнопку Delete (GP
DELETEпо AID). - Executable Load Files — AID, жизненный цикл, версии, AID модулей. Каждый имеет Delete (только ELF) и Delete All (каскадное: ELF + модули + установленные приложения, P2=0x80).
Удаление подтверждается через диалог браузера перед отправкой команды GP DELETE через SCP80. Обзор автоматически обновляется после успешного удаления.
Вкладка Response parser
Декодирование ответа команды: выберите отправленную команду, введите SW (например, 9000) и данные ответа в hex, затем нажмите Decode.
- Команда — группа SIM/USIM (SELECT, STATUS, READ/UPDATE, операции с PIN, CAT-команды TERMINAL PROFILE/ENVELOPE/FETCH/TERMINAL RESPONSE, MANAGE CHANNEL, ...) или группа RAM/GP (INSTALL, LOAD, DELETE, GET/STORE DATA, аутентификация, команды SCP).
- Декодирование SW — статусные слова по картам generic, UICC (TS 102 221) и GlobalPlatform с автоопределением контекста.
- Декодирование привилегий — байты привилегий из ответов GET DATA / INSTALL в читаемые флаги.
- Данные ответа — hex с интерпретацией по команде (например, шаблоны FCP из SELECT).
Card Reader (интеграция с pySim)
Подключение к встроенному pysim-otaman-server для работы с картой.
Ограничение браузера: если PWA раздаётся с публичного HTTPS-хоста, для доступа к локальному серверу (
http://127.0.0.1:8080) нужны два условия: сервер должен отправлятьAccess-Control-Allow-Private-Network: true(pysim-otaman-server ≥ 1.6.1 делает это автоматически), и браузеру должно быть разрешено обращаться к локальной сети — в Chrome/Edge/Vivaldi: Настройки сайта → Доступ к локальной сети → разрешить сайт (или подтвердить запрос). Без разрешения браузера запрос к127.0.0.1блокируется ещё до отправки preflight.
Файловый менеджер
Дерево файлов UICC. Отображаются имена, FID и AID (для ADF). Клик для чтения содержимого.
- Read — чтение файла (автоопределение transparent/record)
- Edit — режим редактирования, измените hex-данные и нажмите Save для записи
- Raw / Decoded — переключение между hex-дампом и декодированным JSON
Пользовательские файлы
Файлы, отсутствующие в модели pysim, можно добавить вручную:
- Перейдите на вкладку Custom files
- Введите путь (например,
3F00/6F46) и псевдоним (например,EF.SPN) - Нажмите Add — файл появится в дереве курсивом (непроверенный)
- Кликните для проверки существования — при успехе работает как обычный файл
Пользовательские файлы сохраняются в localStorage. Экспорт/импорт в JSON для обмена.
Proactive UICC
Подраздел Proactive UICC во вкладке Card Reader обеспечивает взаимодействие с CAT-сессией в реальном времени:
Subscribed Events — список событий SET UP EVENT LIST с кнопками Send. Клик открывает форму для конкретного типа события:
- События без данных (User Activity, Idle Screen и др.) — однократное уведомление
- Location Status — выпадающий список: Normal / Limited / No service
- Access Technology Change — 13 типов RAT
- Network Rejection — полная адаптивная форма: тип регистрации (LU / GPRS / EPS / 5GS), поля локации (MCC, MNC, LAC, RAC, TAC), доступные технологии, 53-позиционный выпадающий список причин отказа (EMM, GMM, 5GMM, LU)
Proactive Command Log — хронологический список проактивных команд. Каждая строка показывает время, код типа, имя и декодированный квалификатор.
PLI Data Dictionary — редактируемые hex-значения для всех 22 квалификаторов PROVIDE LOCAL INFORMATION (TS 102 223 + TS 131 111). 10 квалификаторов имеют встроенные формы декодирования/кодирования:
| Код | Декодированные поля |
|---|---|
| 00 | MCC, MNC, LAC/TAC |
| 01 | IMEI (15 цифр) |
| 03 | Дата, время, TZ |
| 04 | Язык (2-символьный код) |
| 05 | ME Status, Timing Advance |
| 06 | Access Technology (выпадающий список) |
| 08 | IMEISV (16 цифр) |
| 09 | Search Mode (Auto/Manual) |
| 0A | Battery charge (%) |
| 0E | Multiple Access Technologies (список через запятую) |
Значения сохраняются на сервере до перезапуска. Apply → hex обновляется; Save → POST на сервер.
Подсказки команд
Введите имя команды в pySim command line. Подсказки по использованию появляются через 300 мс. Автодополнение команд — над полем ввода.
PWA
OTAMan — Progressive Web App. Можно установить для offline-использования через кнопку INSTALL PWA или через браузер.
- Service worker кеширует все ресурсы при первом посещении
- Иконки 192×192 и 512×512
Тема
Тёмная тема поддерживается. Следует системной теме, переключается вручную кнопкой (🌙/☀️). Выбор сохраняется в localStorage.
Локализация
Интерфейс на английском с поддержкой русского языка. Язык определяется из navigator.language. Кнопка переключения (EN/RU) в заголовке сохраняет выбор в localStorage.
Совместимость версий
| 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.
Сервер (pysim-otaman-server)
Встроенный Python-сервер оборачивает pySim и раздаёт как PWA (из frontend/), так и JSON API по /api/*.
Требования
- Python 3.8+ с
pip, и Git - Смарт-картридер (PC/SC или serial/FTDI) — предпочтителен PC/SC (
pcsc-lite+ccidна Linux) - Windows — используйте Python 3.10–3.13 (рекомендуется 3.13): у
pyscardесть готовые wheel. На 3.9 / 3.14 он собирается из исходников (нужны MSVC C++ Build Tools). SMPP-мост (smpp.twisted3) в Windows сознательно не ставится.
Скрипты
| Скрипт | Назначение |
|---|---|
setup.sh / setup.bat |
Создаёт .venv/, ставит pysim и сервер. Запускать один раз после клонирования. |
start.sh / start.bat |
Запускает сервер из venv (раздаёт PWA + API на :8080). |
start.sh автоопределяет ридер (PC/SC при работающем pcscd, иначе /dev/ttyUSB0); start.bat всегда использует -p 0. Без ридера сервер всё равно стартует («Reader: none») — карту можно инициализировать позже кнопкой Equip.
Ручная установка
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS (Windows: .venv\Scripts\activate)
pip install git+https://github.com/osmocom/pysim.git
pip install -e . # editable — раздаёт frontend/ из исходного дерева
pysim-otaman-server --http-port 8080
Параметры CLI
| Параметр | Описание |
|---|---|
--http-host |
Адрес привязки (по умолчанию 127.0.0.1) |
--http-port |
Порт (по умолчанию 8080) |
--web-dir |
Каталог со статикой PWA (по умолчанию <repo>/frontend) |
-p / --pcsc-device |
Номер слота PC/SC |
-d / --device |
Путь к serial-устройству |
--no-card-init |
Пропустить инициализацию карты (сохранить CAT-сессию) |
--apdu-trace |
Лог APDU-трафика в stderr |
--log-requests |
Лог запросов/ответов в stderr |
--poll-interval |
Интервал автоопроса STATUS (по умолчанию 30с) |
Устранение неполадок
- "Failed to establish context: Access denied" —
pcscdне запущен или нет прав:sudo systemctl enable --now pcscd && sudo usermod -a -G pcscd $USER. - "device file /dev/ttyUSB0 does not exist" — нет serial-ридера; подключите USB-ридер или укажите
-d. Сервер всё равно стартует без ридера.
Справочник API
Полный справочник endpoints: docs/api.md.