TERMINAL CAPABILITY: decode the A9 template (TS 102 221 §11.1.19)

- terminal power supply (tag 80): voltage class per Table 6.1, maximum
  current in mA, clock in 0.1 MHz steps ('FF' = not indicated)
- extended logical channels (tag 81) — zero length per §11.1.19.2.2, a
  nonzero length is preserved as raw
- additional interfaces (tag 82 b1 = UICC-CLF)
- eUICC device capabilities: tag 83 per GSMA SGP.22 v2.6 §3.4.2 Table 7
  (LUId/LPDd/LDSd/LUIe-SCWS); tag 84 preserved raw (no pinned SGP.32 spec)
- unknown/private TLVs preserved via raw_tlv
- concise APDU-list summary; decoded rows in the PWA detail view
- v2.1.0; SW cache simtrace-analyser-v55
- tests: 6 real samples from the local trace sessions (49/55/58/61/206/208)
This commit is contained in:
catarrh committed 2026-09-20 00:11:41 +03:00
1 parent 38650b4797
commit 561801a983
9 files changed
+210 -6

No files matched your search

+26 -1
View File
@@ -1300,6 +1300,31 @@ function cmdRows(cmd) {
rows.push(['Encapsulated', cmd.encapsulated.type]);
}
if (cmd.text_note) rows.push(['Text note', cmd.text_note]);
// TERMINAL CAPABILITY (TS 102 221 §11.1.19)
if (cmd.power_supply) {
const ps = cmd.power_supply;
const bits = [];
bits.push(ps.classes && ps.classes.length
? 'class ' + ps.classes.join('+')
: 'class 0x' + hx(ps.class_raw || 0, 2));
if (ps.max_current_ma !== undefined) bits.push(ps.max_current_ma + ' mA');
if (ps.clock_mhz !== undefined && ps.clock_mhz !== null) bits.push(ps.clock_mhz + ' MHz clock');
else if (ps.clock_raw !== undefined) bits.push('clock not indicated');
rows.push(['Power supply', bits.join(', ')]);
}
if (cmd.extended_channels) rows.push(['Logical channels', 'extended support']);
if (cmd.extended_channels_raw) rows.push(['Logical channels raw', cmd.extended_channels_raw]);
if (cmd.interfaces) rows.push(['Additional interfaces',
cmd.interfaces.length ? cmd.interfaces.join(', ') : 'none']);
if (cmd.interfaces_raw) rows.push(['Interfaces raw', cmd.interfaces_raw]);
if (cmd.euicc_sgp22) {
const e = cmd.euicc_sgp22;
const names = (e.functions || []).join(', ');
rows.push(['eUICC (SGP.22)', names ? names + ' \u00b7 0x' + e.raw : '0x' + e.raw]);
}
if (cmd.euicc_sgp32) rows.push(['eUICC (SGP.32)', '0x' + (cmd.euicc_sgp32.raw || '')]);
if (cmd.raw_tlv) {
for (const t of cmd.raw_tlv) rows.push(['TLV 0x' + t.tag, t.value || '(empty)']);
}
@@ -2681,7 +2706,7 @@ function onFilterChange() {
}
// ──────────────────── Versioning ────────────────────
const PWA_VERSION = '2.0.0';
const PWA_VERSION = '2.1.0';
const MIN_SERVER_VERSION = '1.0.0';
function parseVersion(v) {