- Move installation/startup to the top (after a short intro): download (Linux tar.gz / Windows zip) and source checkout, each ending with the setup/start commands. - Usage (start options, wiring, pin mapping, clock modes, troubleshooting, raw sigrok-cli) follows the install section instead of preceding it. - Remove "Robustness against noisy signals" (decoder internals, not end-user information). - Remove historical explanations (early-version failures, "used to", before/after fix counts) from troubleshooting, clock modes, capture scenarios, cold-boot, validation and data-rate notes. - Rewrite live-capture troubleshooting: early stopping (especially on Windows) is commonly the wrong USB driver - the Saleae Logic driver works only with Saleae Logic software, sigrok needs WinUSB (Zadig) - with links to sigrok's Windows/FX2 documentation; keep the current device-not-found, USB-bandwidth and auto-restart guidance. - Move the tap photos below Usage; features/reference/development sections follow. Russian README mirrors the same structure and edits. Docs only; no decoder or release change.
33 KiB
English version: README.md
sigrok_iso7816_stream
📢 Новости и обновления проекта: Сайт · Telegram-канал
Форк svenso/sigrok_iso7816 с живым GSMTAP-UDP-стримингом: дешёвый логический анализатор FX2 (клон Saleae) ведёт себя как сниффер SIMtrace2:
SIM-карта ⇄ ридер (пассивный съём с контактов)
→ логический анализатор FX2 (fx2lafw, 8 каналов, до 24 МГц)
→ sigrok-cli + декодер iso7816
→ GSMTAP UDP :4729 → [SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) / Wireshark
SIMtrace Analyser —
рекомендуемый инструмент для визуализации живых трасс и просмотра
сохранённых записей; он также умеет импортировать и экспортировать
GSMTAP pcap-файлы (включая PCAP, который этот декодер пишет через опцию
pcap_file=<path>).
Установка и запуск
Оба способа ставят один и тот же декодер — выберите один:
- Скачать (рекомендуется) — архив релиза. Не нужно ничего клонировать и
нет истории git: распакуйте, запустите
setup, затемstart. Лучший вариант, если нужен только съём. - Из исходников —
git clone. Тот же рантайм плюс материал для разработки:tests/и инструменты трасс и базовой линии (tools/capture_baseline.sh,tools/compare_baseline.sh,tools/vs_reader.py). Трассы примеров (examples/) исключены из git и остаются локальными. В архивах релиза нетtests/, dev-инструментов иexamples/.
Скачать (рекомендуется)
Скачайте последний архив со страницы Releases:
sigrok_iso7816_stream-<version>.tar.gz— Linuxsigrok_iso7816_stream-<version>.zip— Windows
К каждому релизу прилагается SHA256SUMS — в нём оба архива.
Положите файл рядом со скачанным архивом и проверьте:
sha256sum -c --ignore-missing SHA256SUMS # GNU coreutils (Linux)
В Windows выполните certutil -hashfile sigrok_iso7816_stream-<version>.zip SHA256
и сравните вывод со строкой .zip в SHA256SUMS.
Linux (скачать)
tar xzf sigrok_iso7816_stream-<version>.tar.gz
cd sigrok_iso7816_stream-<version>
./setup.sh
./start.sh
setup.sh проверяет, что установлены sigrok-cli и пакет прошивки FX2
(sigrok-firmware-fx2lafw), создаёт симлинк каталога проекта в
~/.local/share/libsigrokdecode/decoders/iso7816 (пользовательские
декодеры перекрывают системные) и опрашивает подключённое устройство на
предмет максимальной поддерживаемой частоты дискретизации.
Windows (скачать)
Предварительные требования:
- sigrok-cli — установщик для Windows (0.7.2 x86_64) с
sigrok.org/wiki/Downloads —
протестированная версия. На этой же странице публикуются ночные сборки
для Windows; они могут менять синтаксис sigrok-cli или API декодеров,
поэтому поддерживаемой остаётся версия из релизного установщика 0.7.2.
Если sigrok-cli не запускается с ошибкой
0xc0150002, установите Visual C++ 2010 Redistributable (msvcr100.dllтребуется встроенному Python-рантайму). - Прошивка fx2lafw поставляется вместе с установщиком — отдельно скачивать не нужно.
Настройка драйвера (донглам FX2 нужен WinUSB, вендорский драйвер не подойдёт):
- Запустите Zadig, который лежит внутри каталога установки sigrok-cli (также доступен из меню «Пуск»). Выберите устройство FX2 в выпадающем списке и установите драйвер WinUSB.
- После загрузки прошивки устройство переподключается с другим VID/PID — если оно всё ещё не находится, запустите Zadig второй раз для переподключившегося устройства.
- Windows привязывает драйверы к USB-порту, когда нет серийного номера: перенос донгла в другой порт может потребовать повторить Zadig.
Затем распакуйте архив .zip (в Проводнике: правой кнопкой → «Извлечь все»)
и запустите в распакованном каталоге:
setup.bat
start.bat
setup.bat проверяет sigrok-cli и встроенную прошивку, регистрирует декодер
этого проекта через junction в
%LOCALAPPDATA%\libsigrokdecode\decoders\iso7816 (подтверждается тем, что
sigrok-cli -L показывает iso7816), и опрашивает устройство на предмет
поддерживаемых частот дискретизации. В zip-архиве релиза bat-файлы уже с
переводами строк CRLF, поэтому преобразование не требуется.
start.bat --help перечисляет его опции (основное подмножество start.sh:
каналы, частота дискретизации, clock, host/port, pcap, protocol, debug).
Из исходников
Linux (из исходников)
git clone git@github.com:anttro/sigrok_iso7816_stream.git
cd sigrok_iso7816_stream
./setup.sh
./start.sh
setup.sh выполняет те же проверки и создаёт тот же симлинк, что и выше.
Windows (из исходников)
Предварительные требования Windows (sigrok-cli и Visual C++ 2010 Redistributable, встроенная прошивка fx2lafw и настройка драйвера Zadig/WinUSB) — те же, что в разделе Windows (скачать) выше.
git clone git@github.com:anttro/sigrok_iso7816_stream.git
cd sigrok_iso7816_stream
setup.bat
start.bat
setup.bat выполняет те же проверки и регистрацию junction, что и выше.
start.bat поддерживает основное подмножество опций; основной формат — с
пробелом, --clk=CH тоже работает (start.bat --help перечисляет опции):
start.bat --clk D1 --data D6
Примечание: bat-файлы требуют переводов строк CRLF; репозиторий следит за
этим через .gitattributes, поэтому свежий клон в Windows уже корректен
(zip-архив релиза содержит те же файлы с CRLF).
Использование
start.sh пишет непрерывный поток на частоте 16 МГц до Ctrl+C (rc=130) и
стримит GSMTAP на 127.0.0.1:4729. Умолчания: выводы D5=CLK, D0=I/O,
D4=RST, D2=VCC. Переопределяются аргументами:
./start.sh --clk=D1 --data=D6 # другое подключение
./start.sh --no-rst --no-vcc # только CLK+I/O
./start.sh --host=10.0.28.7 # стримить на удалённый анализатор
./start.sh --pcap=session.pcap # также записать декодированные события в PCAP
./start.sh --debug # полный вывод декодера и sigrok (все
# строки аннотаций + libsigrok -l 4);
# по умолчанию показываются только
# декодированные APDU и предупреждения/ошибки
В Windows start.bat принимает то же основное подмножество опций (форма с
пробелом; форма --opt=value тоже работает) — см. заметки по установке
Windows выше.
Подключение
Рекомендуемый способ съёма — короткий кабель с внешними подтягивающими
резисторами (см. раздел «Съём на практике» ниже): 10 кОм к GND на VCC
(тянет вниз без питания) и 47 кОм к VCC на DATA (быстрее фронт вверх).
Его распиновка фиксирована и известна заранее — см. таблицу
«Распиновка» ниже — и в точности совпадает с умолчаниями start.sh
(D5=CLK, D0=I/O, D4=RST, D2=VCC). Автодетект подключения не нужен;
выводы не меняются.
Сначала GND. Сначала подключите GND и проверьте его вручную (мультиметром или заведомо исправным контактом) — отсутствующий или плохой контакт земли маскируется под все остальные неисправности сразу: плавающие линии, фантомные стартовые биты, кадры из одних нулей.
Распиновка
Каналы клона FX2 назначаются через -P iso7816:clk=N:data=N:rst=N:vcc=N.
Рекомендуемый съём коротким кабелем (с внешними подтягивающими резисторами)
использует фиксированные выводы, которые в точности совпадают с умолчаниями
start.sh; --clk/--data/--rst/--vcc переназначают их, если вы
подключили иначе:
| Канал FX2 | Контакт SIM | Сигнал |
|---|---|---|
| D0 | C7 | I/O |
| D2 | C1 | VCC (только цифровой уровень!) |
| D4 | C2 | RST |
| D5 | C3 | CLK |
| GND | C5 | GND |
Входной порог FX2 близок к TTL (~1.4 В): карты класса 1.8 В могут читаться нестабильно; классы 3 В/5 В — нормально.
Частота дискретизации и 8-битный режим (важно): номинальные 24 МГц FX2
доступны только при дискретизации в 8-битном режиме, т.е. когда включены
только каналы D0–D7. Включение 9-го канала (A0/аналоговый на клонах CWAV
AX) или любого аналогового входа переводит сбор в 16-битный, который
libsigrok ограничивает 12 МГц. Поэтому start.sh/start.bat явно
передают -C D0,D1,D2,D3,D4,D5,D6,D7 и по умолчанию используют 16 МГц
(с комфортным запасом под потолком USB 24 МГц; ~3.3 отсчёта на такт CLK
4.8 МГц). setup.sh/setup.bat проверяют и сообщают фактический максимум
вашего железа при том же ограничении.
Режимы CLK
native(по умолчанию) — живые записи. Декодер отслеживает переключение скорости по PPS и заново взводится по RST, поэтому тёплые сбросы и трафик после PPS разбираются корректно.detect— для офлайн-экспериментов или записей без PPS. Он не отслеживает переключение по PPS, поэтому трафик после PPS может читаться неверно.sample_as_clock— экспериментальный режим upstream; для съёма SIM не рекомендуется.
Решение проблем при живой записи
Запись обрывается рано (особенно в Windows). Частая причина — неподходящий драйвер USB. Драйвер Saleae Logic работает только с Saleae Logic software; sigrok нужен драйвер WinUSB. Установите его через Zadig (входит в установщик sigrok-cli) и повторите назначение после переподключения устройства с VID/PID прошивки. Подробности в документации sigrok:
Устройство не найдено / нет сигнала. Проверьте драйвер WinUSB (Windows), прошивку fx2lafw, подключение и GND (см. «Подключение»), попробуйте другой USB-порт и заведомо исправный кабель. Дешёвые USB-кабели и хабы — частая причина остановок.
Запись завершается сама (rc=0). FX2 упирается в потолок пропускной
способности USB на высокой частоте дискретизации. Снизьте --samplerate,
избегайте хабов, закройте другой USB-трафик. start.sh автоматически
перезапускает запись при rc=0 (по умолчанию 20 перезапусков с паузой 2 с;
--no-loop, --max-restarts=N, --restart-delay=S). При --pcap=FILE
каждый перезапуск пишет FILE.<N>.<ext>.
start.sh работает до Ctrl+C; нажатия клавиш его не останавливают
(приглашение «нажмите любую клавишу» отключено). Полезные опции:
./start.sh --pcap=s.pcap --log=s.log # записать события и вердикт rc=
./start.sh ... --samplerate=24M # больше запаса по таймингу при необходимости
./start.sh ... --klog # также записать журнал ядра
./start.sh ... --debug # полный вывод декодера и sigrok
--logсохраняет строку вердиктаrc=в конце сессии.- Декодер пишет
SIGNAL INTEGRITY WARNING, когда ≥ 8 из последних 64 кадров не проходят проверку чётности. - Десинхронизированные пакеты сохраняются с флагом
GSMTAP_FLAG_BAD_FCSв байтеresзаголовка GSMTAP — видно в Wireshark как предупреждение BAD-FCS.
Сырые команды sigrok-cli
Эквивалентные команды без скриптов-обёрток:
# Минимум: только CLK+I/O, живой поток на localhost:4729
sigrok-cli -d fx2lafw --config samplerate=12M --continuous \
-P iso7816:clk=D0:data=D1:clock_option=detect -A iso7816
# Полное подключение: CLK + I/O + RST + VCC с отслеживанием событий линий
sigrok-cli -d fx2lafw --config samplerate=12M --continuous \
-P iso7816:clk=D5:data=D0:rst=D4:vcc=D2:clock_option=native:rst_detect=true:vcc_detect=true \
-A iso7816
# Поток на удалённый анализатор / отключить стриминг / писать PCAP-файл
... -P iso7816:...:gsmtap_host=10.0.28.7 ...
... -P iso7816:...:gsmtap_enable=false ...
... -P iso7816:...:pcap_file=trace.pcap ...
# Классический режим upstream: бинарный PCAP в stdout
sigrok-cli -i capture.sr -P iso7816:clk=2:data=0 -B iso7816=pcap > out.pcap
Съём на практике
Компоненты, использованные в сборке
Стенд снимает сессию SIM-карты телефона
Стенд снимает сессию картридера
Съём коротким кабелем — меньше площадь контура и артефактов фронта
Детали подключения короткого кабеля
Короткий кабель с внешними подтягивающими резисторами — 10 кОм к GND на VCC (тянет вниз, когда питания нет), 47 кОм к VCC на DATA (быстрее фронт вверх)
Возможности
| Возможность | Описание |
|---|---|
| Живой поток GSMTAP | Каждое декодированное событие отправляется как GSMTAP-SIM UDP-пакет (включено по умолчанию, повторяет поведение simtrace2-sniff) |
| Правильные sub_types | ATR=0x01 и PPS=0x02 корректно помечаются в PCAP |
| ATR/PPS в PCAP | ATR и объединённые запрос+ответ PPS выводятся как PCAP-пакеты |
| Отслеживание RST (опционально) | rst_detect=true: события assert/deassert сброса (sub_type 0x10) |
| Отслеживание VCC (опционально) | vcc_detect=true: события включения/выключения питания (sub_type 0x11) |
| PCAP сразу в файл | pcap_file=<path> пишет PCAP без перенаправления вывода оболочки |
| Деглитч стартового бита | Подавляет LOW-глитчи короче ETU (2 отсчёта при 16 МГц, масштабируется от частоты дискретизации) |
| Захват ETU в середине сессии | Восстанавливает ETU по линии DATA, когда CLK непригоден; скорость, не прошедшая проверку чётности, измеряется заново |
| Защита ATR / ресинхронизации | Проверяет ATR, игнорирует неверно кадрированные кандидаты и выравнивается после десинхронизации |
| Инверсная конвенция | Поддерживает прямую (TS=0x3B) и инверсную (TS=0x3F) карты |
| Блоки T=1 | Разбирает NAD/PCB/LEN/INF/LRC с цепочкой по биту M; INF I-блока выдаётся как APDU |
| Флаг чётности | Пакеты с ошибкой чётности помечаются GSMTAP_FLAG_BAD_FCS |
| Пороги от частоты | Пороги деглитча, защиты и ETU масштабируются от частоты дискретизации |
Опции декодера
| Опция | По умолчанию | Описание |
|---|---|---|
clock_option |
native |
native, detect, sample_as_clock (см. FAQ upstream) |
protocol |
auto |
auto, T=0, T=1 |
gsmtap_enable |
true |
Живой GSMTAP UDP-стриминг |
gsmtap_host |
127.0.0.1 |
Хост назначения GSMTAP |
gsmtap_port |
4729 |
Порт назначения GSMTAP |
pcap_file |
(пусто) | Писать PCAP в этот файл вдобавок к бинарному выводу |
rst_detect |
false |
Отслеживать события пина RST (требуется назначенный канал rst) |
vcc_detect |
false |
Отслеживать события пина VCC (требуется назначенный канал vcc) |
Каналы: clk, data (обязательные); rst, vcc (опциональные —
назначайте только если соответствующий провод физически подключён).
События GSMTAP
Заголовок GSMTAP: версия 2, тип SIM (0x04), UDP-порт 4729.
| sub_type | Имя | Полезная нагрузка |
|---|---|---|
| 0x00 | APDU | сырые байты пакета T=0/T=1 |
| 0x01 | ATR | сырые байты ATR |
| 0x02 | Запрос PPS | сырые байты запроса PPS |
| 0x03 | Ответ PPS | сырые байты ответа PPS |
| 0x10 | Событие RST (кастомное) | [direction, level, flags, clk_hz_be32] — частота CLK добавляется, когда известна |
| 0x11 | Событие VCC (кастомное) | [direction, level, 0x00] |
Семантика байтов полезной нагрузки:
- RST:
direction1 = сброс asserted (высокий→низкий), 0 = deasserted (низкий→высокий);level= уровень линии после перехода. - VCC:
direction1 = питание подано (низкий→высокий), 0 = снято (высокий→низкий);level= уровень линии после перехода.
0x00–0x03 совпадают с gsmtap.h из libosmocore: стандартные значения и полезные нагрузки (запрос и ответ PPS отправляются отдельными пакетами). 0x10/0x11 — кастомные расширения, не определённые в gsmtap.h из libosmocore.
События RST несут измеренную частоту CLK, когда она известна: тогда
устанавливается бит 0 байта flags, а следом идёт частота как big-endian
uint32 в герцах (полезная нагрузка 7 байт). Пока частота не измерена,
нагрузка остаётся 3 байта, поэтому потребители, читающие только первые два
байта, не затрагиваются. Вместе с F/D, согласованными в ATR/PPS, скорость
передачи данных равна clk_hz × D / F бит/с.
Расширения заголовка: флаги вроде GSMTAP_FLAG_BAD_FCS пишутся в байт
res заголовка, который официальный gsmtap.h помечает как зарезервированный
(RFU). Это собственное расширение данного декодера (upstream simtrace2-sniff
никогда не заполняет res); семантика флагов повторяет флаги данных (data
flags) USB-протокола simtrace2 и не является частью спецификации libosmocore.
Заметки и ограничения по детектированию RST/VCC
- События детектируются асинхронно до первого ATR (включение питания / снятие сброса фиксируются, как только уровень стабилизируется) и на границах пакетов между T=0/T=1 в дальнейшем.
- Фронты, происходящие целиком внутри передачи пакета, наблюдаются как итоговое изменение уровня на следующей границе; короткие импульсы внутри пакета могут быть пропущены.
- VCC — только цифровой: декодер видит «питание есть/нет», но никогда не класс напряжения (1.8/3/5 В).
- RST и VCC используют гистерезис стабильности уровня 10 мс (масштабируется от частоты дискретизации): новый уровень сообщается только после того, как он непрерывно стабилен ≥ 10 мс. Это делает включение и выключение питания симметричными и подавляет звон и короткие глитчи.
- События VCC в целом ненадёжны — лучше не отслеживать VCC. Плавающий
или неподключённый пин съёма VCC всегда читается как HIGH (логическая
единица без нагрузки), поэтому декодер постоянно видит «питание подано»
и выдаёт ложные события питания при каждом дребезге. Если ваш съём не
берёт VCC с чистого нагруженного источника, лучше оставить канал
vccненазначенным (не передавать--vcc) и держатьvcc_detect=false; отслеживания RST обычно достаточно, чтобы видеть сбросы. Включайте отслеживание VCC только на съёме с надёжным измерением VCC (и надёжным GND — см. заметки о подключении). - Неназначенные опциональные каналы игнорируются, даже если
rst_detect/vcc_detectвключены (защита черезhas_channel()).
Разработка и тестирование
Декодер проверяется на примерах записей с помощью tools/vs_reader.py.
Фикстуры трасс хранятся локально и не входят в репозиторий.
Проверка по SDK ридера (tools/vs_reader.py)
На контролируемом стенде (PCSC-ридер под управлением софта) эталонный журнал APDU из SDK ридера можно сравнить с декодированным PCAP:
sigrok-cli -i <trace>.sr \
-P iso7816:clk=D5:data=D0:rst=D4:vcc=D2:clock_option=native:rst_detect=true:vcc_detect=true:gsmtap_enable=false:pcap_file=out.pcap \
-A iso7816
python3 tools/vs_reader.py <reader-log>.log out.pcap
vs_reader.py выравнивает каждый обмен из журнала ридера с APDU из записи
(побайтовое LCS-совпадение) и классифицирует остатки как proactive/CAT
(невидимые для SDK ридера), pre-capture/потерянные или мусор.
Записи холодного старта (запись начинается до включения питания)
Когда запись начинается до включения питания, RST всё ещё низкий на
отсчёте 0. Используйте rst_detect=true и protocol=T=0; декодер взводит
охоту за ATR по начальному уровню RST и разбирает полный ATR. Пример:
sigrok-cli -i <coldboot>.sr \
-P iso7816:clk=CLK:data=DATA:rst=RST:vcc=VCC:clock_option=native:protocol=T=0:rst_detect=true:vcc_detect=true:gsmtap_enable=false:pcap_file=out.pcap \
-A iso7816
Сценарии записи: ридер (постоянный CLK) и телефон (Clock Stop Mode)
- Запись ридера / постоянный CLK — ридер ведёт ровный CLK всю сессию.
Проверяйте её по SDK ридера через
tools/vs_reader.py <reader-log>.log out.pcap. - Запись телефона / гейтированный или остановленный CLK — телефон
гейтирует или останавливает CLK между передачами (Clock Stop Mode),
поэтому ETU нельзя вывести из CLK. Запускайте с
protocol=T=0; декодер восстанавливает ETU из линии DATA и декодирует edge-list читателем. Команды T=0 case 3/4 (например,80 12/80 14STK envelope) объединяются в один APDU команда→ответ.
Рекомендуемые вызовы:
# Запись ридера (контролируемый стенд, CLK всегда работает)
sigrok-cli -i <trace>.sr \
-P iso7816:clk=CLK:data=DATA:rst=RST:vcc=VCC:clock_option=native:rst_detect=true:vcc_detect=true:gsmtap_enable=false:pcap_file=out.pcap \
-A iso7816
python3 tools/vs_reader.py <reader-log>.log out.pcap
# Запись телефона (середина сессии, гейтированный/остановленный CLK)
sigrok-cli -i <phone>.sr \
-P iso7816:clk=CLK:data=DATA:rst=RST:clock_option=native:rst_detect=true:vcc_detect=false:protocol=T=0:gsmtap_enable=false:pcap_file=out.pcap \
-A iso7816
Скорости данных и ETU
Справочные значения, наблюдавшиеся на примерах записей при частоте дискретизации 16 МГц:
| Трасса | Режим CLK | ETU (отсчёты) | CLK/ETU | Конвенция | Примечания |
|---|---|---|---|---|---|
| test_8 | постоянный | ~43 | 372 (стандарт) | Direct | PC/SC ридер, ATR+PPS+APDU |
| test_7 | постоянный | ~43 | 372 (стандарт) | Direct | PC/SC ридер, тёплые сбросы |
| xiaomi | гейтированный/остановленный | ~53 | восстановлен из DATA | Direct | Телефон, середина сессии |
| samsung | гейтированный/остановленный | ~72 | 16 (F=512/D=32) | Direct | Телефон, нестандартный F/D, меню STK |
| alcor_reader | постоянный | ~53 | 16 (F=512/D=32) | Direct | PC/SC ридер, CLK 4.0 МГц на ATR -> 4.8 МГц после PPS |
Декодер автоопределяет ETU и выбирает подходящий читатель битов
(CLK-синхронный для постоянного CLK, edge-list для гейтированного/
остановленного CLK). Никакой ручной настройки не требуется, кроме
clock_option=native и protocol=T=0 для телефонных записей.
Чётность — чётная по TS 102 221 («чётное число битов, установленных в
'1', включая бит чётности»); кадры, не прошедшие проверку, помечаются
CHKSUM ERROR, но всё равно декодируются.
Лицензия
GPL-2.0+, как и upstream.


