v1.9.7: spec fixes, T=1/parity, EOF guards, dead code + rate scaling
The audit's P2 items: - ODD_INS: add 0x73 MANAGE SECURE CHANNEL and 0x75 TRANSACT DATA (TS 102 221 Table 10.5); the tools/vs_reader.py mirror and the pinned test are updated. - 9E/9F are SW1: ISO 7816-3 10.3.3 Table 11 makes every 9X value SW1. Remove the fabricated "extended-length procedure byte" that consumed SW2 as a length and lost the status word. - T=1: EOF-guard every block read, bound the M-bit chain with T1_CHAIN_MAX, and drop the caller's duplicate chain loop -- it read the next block after every I-block (usually the peer's R-block) and merged the following I-block's INF into the packet. R/S blocks emit nothing; the (possibly chained) I-block INF is the APDU payload. - Parity: a packet containing a parity-error byte is emitted with GSMTAP_FLAG_BAD_FCS (the CHKSUM annotation was invisible downstream), with a log note when the exchange is otherwise clean. - EOF guards: handle_atr (TA/TB/TC/TD, historical, TCK), handle_pps (request/response fields incl. PPS1-3) and the T=1 block parser return cleanly on a truncated capture instead of raising on None. - Dead code: _edge_read was initialized True and never cleared, so the ATR-based T=0 procedure loop (58 lines) and the 1.5-ETU guard branch were unreachable. Remove the flag, both dead paths and the branch; dedent the live loop (behavior unchanged). - Samplerate scaling: _samples_for_us() replaces the hard-coded 16 MHz thresholds -- start-bit deglitch (0.125 us), min_high floor (0.25 us) and the ETU glitch floor (0.75 us). At 16 MHz the values are unchanged. Validation: 130/130 unit tests (13 new: 9E/9F SW1, parity BAD_FCS, T=1 I/R/S blocks + M chain + truncations + one-block-per-step, PPS truncations, truncated ATR TA, samplerate/ETU-floor vectors); the 10-trace suite is unchanged from v1.9.6 (identical APDU/CHKSUM/CONCAT/ BAD_FCS counts, RESULT: OK); compare_baseline.sh reports IDENTICAL. VERSION -> 1.9.7.
This commit is contained in:
1 parent
3e39032802
commit
6e6f465841
7 files changed
+593
-359
No files matched your search
+8
-5
@@ -58,10 +58,13 @@ GSMTAP pcap-файлы (включая PCAP, который этот декод
|
||||
| Отслеживание RST (опционально) | `rst_detect=true`: события assert/deassert сброса (sub_type 0x10) |
|
||||
| Отслеживание VCC (опционально) | `vcc_detect=true`: события включения/выключения питания (sub_type 0x11) |
|
||||
| PCAP сразу в файл | `pcap_file=<path>` пишет PCAP без перенаправления вывода оболочки |
|
||||
| Деглитч стартового бита | Деглитч в 2 отсчёта в детекторе стартового бита убирает LOW-глитчи короче ETU от артефактов подтяжки FX2LP и предотвращает смещение байтов на быстрых телефонных трассах |
|
||||
| Деглитч стартового бита | Деглитч в детекторе стартового бита (2 отсчёта при 16 МГц, с v1.9.7 масштабируется от частоты дискретизации) убирает LOW-глитчи короче ETU от артефактов подтяжки FX2LP и предотвращает смещение байтов на быстрых телефонных трассах |
|
||||
| Захват ETU в середине сессии | Оценщик ETU по фронтам DATA отбрасывает пачки только со сторожевым интервалом (нулевые данные) и одиночные интервалы, а также сбрасывает скорость, не прошедшую проверку чётности, поэтому трасса с нестандартным F/D захватывается надёжно |
|
||||
| Защита ATR / ресинхронизации | `0x3B`/`0x3F` в состоянии DATA считается кандидатом в ATR только до первого APDU; кадры с ошибкой чётности или голый TS+T0 игнорируются, а `resync_idle` действительно ждёт уровень простоя |
|
||||
| Инверсная конвенция | ATR с TS=0x3F разбирается по ISO 7816-3 7.1: инверсные данные, msb первым, стартовый бит по-прежнему LOW при простое линии HIGH |
|
||||
| Блоки T=1 | Разбор NAD/PCB/LEN/INF/LRC с цепочкой по биту M; INF I-блока выдаётся как APDU, R/S-блоки не выдаются; обрезанная запись завершается чисто |
|
||||
| Флаг чётности | Пакет с байтом с ошибкой чётности выдаётся с флагом GSMTAP BAD_FCS (не только аннотацией) |
|
||||
| Пороги от частоты | Деглитч стартового бита, пороги защиты и порог глитча ETU масштабируются от частоты дискретизации, а не считаются от 16 МГц |
|
||||
|
||||
## Опции декодера
|
||||
|
||||
@@ -163,8 +166,8 @@ flags) USB-протокола simtrace2 и не является частью с
|
||||
- никогда не даёт исключению при декодировании убить запись — ошибки
|
||||
логируются, аннотируются, а конечный автомат ресинхронизируется
|
||||
(конец потока по-прежнему завершается чисто);
|
||||
- ограничивает продолжение цепочки T=1-блоков, чтобы мусор не мог
|
||||
зациклиться навсегда.
|
||||
- разбирает блоки T=1 (NAD/PCB/LEN/INF/LRC) и ограничивает цепочку по биту M,
|
||||
чтобы мусор не мог зациклиться навсегда.
|
||||
|
||||
После принятого PPS декодер **следует переключению скорости**: в режиме
|
||||
native CLK `clock_skip` становится равным F/D тактов CLK на бит (например,
|
||||
@@ -178,7 +181,7 @@ native CLK `clock_skip` становится равным F/D тактов CLK
|
||||
`FIND START`, native-пропуск сбрасывается в 372, счётчик охоты очищается —
|
||||
поэтому повторный ATR разбирается как ATR, а не ошибочно читается как
|
||||
TPDU-трафик на скорости, согласованной PPS. **Защита стартового бита в
|
||||
1.5 ETU** дополнительно отбрасывает фантомный `0x00`, который глитч на
|
||||
0.5 ETU** (edge-ридер) дополнительно отбрасывает фантомный `0x00`, который глитч на
|
||||
холостом ходу может вставить перед этим ATR. Требуется `rst_detect=true`
|
||||
(назначенный канал `rst`); без него сброс в середине сессии всё равно
|
||||
будет прочитан неверно.
|
||||
@@ -196,7 +199,7 @@ TPDU-трафик на скорости, согласованной PPS. **За
|
||||
неверного кадрирования, дребезг линии VCC) была следствием плохо
|
||||
декодированного конечного автомата, а не железа: переподключение съёма
|
||||
ничего не давало, а переписанный декодер полностью это вылечил (re-arm по
|
||||
тёплому сбросу, защита стартового бита 1.5 ETU, антидребезг VCC 10 мс,
|
||||
тёплому сбросу, защита стартового бита 0.5 ETU, антидребезг VCC 10 мс,
|
||||
сборка обмена T=0). Чистая запись теперь декодируется с нулём мусора —
|
||||
см. проверку `vs_reader.py` ниже.
|
||||
|
||||
|
||||
Reference in new issue
Block a user