Add file-aware decoding for READ/UPDATE/SEARCH RECORD
- Track the currently selected file (SELECT by FID/path) across the session and pass it to the decoder; reset on ATR/card change; seed via a bounded backward scan on paged views. - Decode READ BINARY/RECORD, UPDATE BINARY/RECORD and (via GET RESPONSE) SEARCH RECORD bodies using a FILE_DECODERS registry: IMSI, ICCID, LI/PL, ADN-format (MSISDN/SDN/FDN/...), SMS records (SMSC + TPDU), UST/SST/IST service tables, PLMN lists (+access tech), EF_DIR, CBMI/R, ARR, PNN, ECC, SPN, LOCI, ACC, Phase, ISIM IMPI/DOMAIN/IMPU. - File formats verified against TS 51.011 / TS 102 221 / TS 31.102 (PLMNwAcT is 5-byte entries; EF_SMS = status + SMSC + TPDU; ISIM identities are 0x80 TLV). - Offset != 0 READ BINARY/UPDATE BINARY is skipped (fragment reads). - SEARCH RECORD results (record numbers) decoded in GET RESPONSE. - GET RESPONSE summary now shows FCP file type/structure/size. - New 'File data' section in the detail view.
This commit is contained in:
1 parent
143e1854e2
commit
91cb4e6e02
4 files changed
+858
-7
No files matched your search
@@ -630,6 +630,56 @@ function cmdRows(cmd) {
|
||||
rows.map(([l, v]) => `<tr><td class="label">${l}</td><td class="value">${v}</td></tr>`).join('');
|
||||
}
|
||||
|
||||
function fileRows(f) {
|
||||
if (!f) return '';
|
||||
const title = f.ef ? `${f.ef} (0x${(f.fid || '').toUpperCase()})` : (f.fid || '').toUpperCase();
|
||||
const rows = [];
|
||||
if (f.empty) {
|
||||
rows.push(['File', title + ' — empty']);
|
||||
} else {
|
||||
rows.push(['File', title]);
|
||||
if (f.imsi) rows.push(['IMSI', f.imsi]);
|
||||
if (f.iccid) rows.push(['ICCID', f.iccid]);
|
||||
if (f.languages) rows.push(['Languages', f.languages.join(', ')]);
|
||||
if (f.name !== undefined) rows.push(['Name', f.name]);
|
||||
if (f.number) rows.push(['Number', f.number]);
|
||||
if (f.text) rows.push(['Text', f.text]);
|
||||
if (f.ccp !== undefined) rows.push(['CCP', '0x' + hx(f.ccp, 2)]);
|
||||
if (f.ext1 !== undefined) rows.push(['Ext1', '0x' + hx(f.ext1, 2)]);
|
||||
if (f.plmns) rows.push(['PLMNs', f.plmns.map(p => p.mcc + '/' + p.mnc + (p.access_tech ? ' (' + p.access_tech + ')' : '')).join(', ')]);
|
||||
if (f.services) {
|
||||
for (const s of f.services) rows.push(['Service ' + s.n, s.name || '']);
|
||||
}
|
||||
if (f.applications) {
|
||||
for (const a of f.applications) rows.push(['App', (a.label ? a.label + ' · ' : '') + (a.aid || '')]);
|
||||
}
|
||||
if (f.direction) rows.push(['SMS', f.direction + ' — ' + f.status]);
|
||||
if (f.message_ids) rows.push(['Message IDs', f.message_ids.join(', ')]);
|
||||
if (f.record_numbers) rows.push(['Records found', f.record_numbers.join(', ')]);
|
||||
if (f.range) rows.push(['Range', f.range[0] + '…' + f.range[1]]);
|
||||
if (f.access_classes) rows.push(['Access classes', f.access_classes.join(', ')]);
|
||||
if (f.phase) rows.push(['Phase', f.phase]);
|
||||
if (f.display_condition) rows.push(['Display condition', f.display_condition]);
|
||||
if (f.mcc) rows.push(['Location', 'MCC ' + f.mcc + ' MNC ' + f.mnc + ' · LAC ' + f.lac]);
|
||||
if (f.tmsi) rows.push(['TMSI', f.tmsi]);
|
||||
if (f.location_update_status) rows.push(['Update status', f.location_update_status]);
|
||||
if (f.rules) rows.push(['Rules', f.rules.map(r => r.tag + ' ' + r.hex).join(', ')]);
|
||||
if (f.raw) rows.push(['Data', f.raw]);
|
||||
if (f.tpdu) {
|
||||
const t = f.tpdu;
|
||||
rows.push(['SMS TPDU', t.mti]);
|
||||
if (t.oa) rows.push(['TP-OA', t.oa]);
|
||||
if (t.da) rows.push(['TP-DA', t.da]);
|
||||
if (t.text !== undefined) rows.push(['TP-UD', t.text]);
|
||||
if (t.payload) rows.push(['TP-UD (payload)', t.payload]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!rows.length) return '';
|
||||
return `<tr><td class="label" colspan="2" style="padding-top:6px; border-top:1px solid var(--border);">File data</td></tr>` +
|
||||
rows.map(([l, v]) => `<tr><td class="label">${l}</td><td class="value">${v}</td></tr>`).join('');
|
||||
}
|
||||
|
||||
function ifaceValue(ifc) {
|
||||
const v = [];
|
||||
if (ifc.f !== undefined) v.push('F=' + ifc.f);
|
||||
@@ -795,6 +845,7 @@ function showDetail(msg, entry) {
|
||||
${body}
|
||||
${cmdRows(decoded.cmd)}
|
||||
${responseRows(decoded.response)}
|
||||
${fileRows(decoded.file)}
|
||||
${sw}
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
Reference in new issue
Block a user