From 3660a7e173e2e934016ffb473d7207e06aa59972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Fri, 2 Oct 2026 11:28:33 +0300 Subject: [PATCH] v3.12.0: the card preset carries the card's CAT (USAT) release The release selector lives in the preset rather than a global chip: presets already travel with the card (ICCID auto-selection, export/import), and the operations that will consume the release are preset-aware. - presets.py: the optional `release` field (4-18; empty = unspecified) joins PRESET_FIELDS; a value outside 4-18 is refused on save/import; the store schema version is 5. - catrelease.py: DEFAULT_RELEASE = 12 and preset_release() - the effective release is the preset's own value, else Rel-12 (the safe level for cards whose release is not known; an unset release never filters anything away). The PWA mirrors both (CAT_RELEASE_DEFAULT + presetRelease()), drift-guarded. - Cards tab: the editor's header row gains a compact CAT release select (unspecified / pre-Rel-6 stored as 5 / Rel-6 ... Rel-18); the empty option names the Rel-12 default and the tooltip explains the guard; the field is collected, cleared and restored with the other form fields. - Nothing filters yet: the Simulator's event parameters (stage 3) will use the effective release. - docs/api.md + help EN/RU updated; sw cache simple-v368. --- docs/api.md | 8 +++++- frontend/help-ru.html | 2 +- frontend/help.html | 2 +- frontend/index.html | 44 ++++++++++++++++++++++++++++-- frontend/sw.js | 2 +- frontend/tests/cards_form.test.js | 17 +++++++++++- frontend/tests/cat_release.test.js | 14 ++++++++++ pyproject.toml | 2 +- pysim_simple_server/catrelease.py | 25 ++++++++++++++++- pysim_simple_server/presets.py | 13 +++++++-- pysim_simple_server/server.py | 2 +- tests/test_catrelease.py | 16 ++++++++++- tests/test_presets.py | 15 ++++++++++ 13 files changed, 149 insertions(+), 13 deletions(-) diff --git a/docs/api.md b/docs/api.md index c59bc8a..6e6054a 100644 --- a/docs/api.md +++ b/docs/api.md @@ -245,6 +245,12 @@ stored for later use (nothing consumes them yet). PIN/PUK must be **4–8 decimal digits** when set (empty is fine; anything else is refused with `400` naming the field); the ADM key is 4–16 hex digits (a decimal PIN is fine). +**CAT (USAT) release.** The optional `release` field (4–18) names the release +the card implements; the release guard hides CAT items introduced after it +(the Simulator's event parameters, see `catrelease`). Empty means unspecified +and resolves to Rel-12 (`catrelease.DEFAULT_RELEASE`) — an unset release never +filters anything away. + **Counters.** The store is the source of truth for the SCP80 counters, one per keyset ("a dedicated counter shall be associated to each key version", Annex A.1 — the spec's wording). The operations below accept a `preset_id` and **persist the @@ -256,7 +262,7 @@ is not defined in preset '…' - add it in the Cards tab"}`), and so is a KIc/KID number mismatch. The Cards tab's export/import uses this API; the import also accepts presets exported by the older localStorage-based builds. -- `GET /api/presets` — `{"path": "…", "count": 2, "version": 4, "presets": [{…}]}` +- `GET /api/presets` — `{"path": "…", "count": 2, "version": 5, "presets": [{…}]}` (card-free: it answers while a long card operation runs). - `POST /api/presets` — body = the preset fields (`keysets` included); returns `{"ok": true, "preset": {…}}`. A duplicate ICCID (digits, spaced or raw EF diff --git a/frontend/help-ru.html b/frontend/help-ru.html index b93fb3b..7f30f7c 100644 --- a/frontend/help-ru.html +++ b/frontend/help-ru.html @@ -346,7 +346,7 @@
Каждый принятый картой пакет расходует счётчик, который сохраняется в keyset пресета — проба отклоняется, если в разрешённом SPI1 нет проверки счётчика или в пресете нет такого номера keyset. На живой карте: 000000, B00000 и B00001 зарегистрированы (приложения компактного формата), расширенный формат, USAT, мультиплексирование и CASD отклонены с 6200.
Хранит пресеты карт на сервере (~/.pysim-simple-server/card_presets.json; переопределяется --card-presets), чтобы представление Secured Packet могло автоматически подставлять ключи и параметры, слушатель SCP81 HTTP OTA — находить PSK-ключи, а счётчики SCP80, израсходованные операцией, сохранялись самой операцией — закрытая вкладка или второе окно браузера больше не могут потерять инкремент. Пресет содержит несколько keysets — номер keyset задаётся нибблом b8..b5 его KIc/KID (TS 102 225 §5.1.2/A.2): KIc и KID одного keyset должны нести один и тот же номер (01–0F; A.2 отвергает несовпадение), и у каждого keyset на карте свой счётчик (Annex A.1), поэтому счётчики ведутся по keysets. В форме keysets редактируются строками — по одной на номер, с кнопками Добавить keyset / Удалить keyset; номер в строке вычисляется из байта KIc/KID, а 00 («без защиты») не принимается как keyset. Список загружается при подключении PWA и экспортируется/импортируется как JSON (импорт принимает и пресеты старых сборок — плоские и с keysets). «Карты» — верхнеуровневая вкладка: по умолчанию показывается список пресетов, а Добавить пресет / Редактировать открывают редактор (отдельное представление) — Сохранить сохраняет пресет и возвращает к списку, Отмена отменяет правки. При подключении карты читается её EF.ICCID, и пресет с тем же ICCID автоматически выбирается во всех трёх представлениях SCP80; если подключённая карта не совпадает ни с одним пресетом — или выбранный пресет принадлежит другой карте — все три представления SCP80 показывают жёлтое предупреждение над выбором пресета. В списке подсвечивается пресет подключённой карты. Поля редактора сгруппированы в блоки с рамкой: PIN/ADM (необязательные коды карты — PIN1/PUK1/PIN2/PUK2 по 4–8 десятичных цифр и ключ ADM — сохраняются для будущего использования), TAR (таблица TAR), SCP80 (GSM 03.48, ETSI TS 102 225) (keysets и их счётчики) и SCP81 (HTTP OTA) (пара PSK identity/ключ с пояснением о выборе ключа). В шапке отображаются серые маркеры SCP80/SCP81 и значок ключа на бейдже ADM, когда в пресете с ICCID подключённой карты эти поля заполнены.
Хранит пресеты карт на сервере (~/.pysim-simple-server/card_presets.json; переопределяется --card-presets), чтобы представление Secured Packet могло автоматически подставлять ключи и параметры, слушатель SCP81 HTTP OTA — находить PSK-ключи, а счётчики SCP80, израсходованные операцией, сохранялись самой операцией — закрытая вкладка или второе окно браузера больше не могут потерять инкремент. Пресет содержит несколько keysets — номер keyset задаётся нибблом b8..b5 его KIc/KID (TS 102 225 §5.1.2/A.2): KIc и KID одного keyset должны нести один и тот же номер (01–0F; A.2 отвергает несовпадение), и у каждого keyset на карте свой счётчик (Annex A.1), поэтому счётчики ведутся по keysets. В форме keysets редактируются строками — по одной на номер, с кнопками Добавить keyset / Удалить keyset; номер в строке вычисляется из байта KIc/KID, а 00 («без защиты») не принимается как keyset. Список загружается при подключении PWA и экспортируется/импортируется как JSON (импорт принимает и пресеты старых сборок — плоские и с keysets). «Карты» — верхнеуровневая вкладка: по умолчанию показывается список пресетов, а Добавить пресет / Редактировать открывают редактор (отдельное представление) — Сохранить сохраняет пресет и возвращает к списку, Отмена отменяет правки. При подключении карты читается её EF.ICCID, и пресет с тем же ICCID автоматически выбирается во всех трёх представлениях SCP80; если подключённая карта не совпадает ни с одним пресетом — или выбранный пресет принадлежит другой карте — все три представления SCP80 показывают жёлтое предупреждение над выбором пресета. В списке подсвечивается пресет подключённой карты. Поля редактора сгруппированы в блоки с рамкой: PIN/ADM (необязательные коды карты — PIN1/PUK1/PIN2/PUK2 по 4–8 десятичных цифр и ключ ADM — сохраняются для будущего использования), TAR (таблица TAR), SCP80 (GSM 03.48, ETSI TS 102 225) (keysets и их счётчики) и SCP81 (HTTP OTA) (пара PSK identity/ключ с пояснением о выборе ключа). В шапке редактора также выбирается релиз CAT (USAT) карты — по нему механизм релизов скрывает элементы CAT, появившиеся позже (параметры событий в Симуляторе); «не указан» означает Rel-12, и неуказанный релиз ничего не фильтрует. В шапке отображаются серые маркеры SCP80/SCP81 и значок ключа на бейдже ADM, когда в пресете с ICCID подключённой карты эти поля заполнены.
| Поле | Описание |
|---|
| Field | Description |
|---|