FreeCalypso > hg > fc-pcsc-tools
view libcommon/dumpdirfunc.c @ 6:2c72709e0891
EF_DIR dump meaty function factored out into libcommon
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 11 Feb 2021 23:42:53 +0000 |
parents | |
children | dcfec53643c5 |
line wrap: on
line source
/* * This module implements the common function for dumping EF_DIR. */ #include <sys/types.h> #include <stdio.h> #include "simresp.h" static void dump_aid(tlv) u_char *tlv; { unsigned reclen, n; reclen = tlv[1]; printf(" AID:"); for (n = 0; n < reclen; n++) printf(" %02X", tlv[n+2]); putchar('\n'); } static void dump_label(tlv) u_char *tlv; { int rc; unsigned textlen; printf(" Label: "); rc = validate_alpha_field(tlv + 2, tlv[1], &textlen); if (rc < 0) { printf("malformed\n"); return; } print_alpha_field(tlv + 2, textlen, stdout); putchar('\n'); } static void dump_unknown_tlv(tlv) u_char *tlv; { unsigned reclen, n; reclen = tlv[1] + 2; printf(" TLV:"); for (n = 0; n < reclen; n++) printf(" %02X", tlv[n]); putchar('\n'); } void dump_efdir_record() { unsigned totlen, reclen; u_char *dp, *endp; if (sim_resp_data[0] != 0x61) { printf(" bad: first byte != 0x61\n"); return; } totlen = sim_resp_data[1]; if (totlen < 3 || totlen > 0x7F) { printf(" bad: global length byte 0x%02X is invalid\n", totlen); return; } if (totlen + 2 > sim_resp_data_len) { printf(" bad: TLV global length exceeds EF record length\n"); return; } dp = sim_resp_data + 2; endp = sim_resp_data + 2 + totlen; while (dp < endp) { if (endp - dp < 2) { trunc_error: printf(" bad: truncated TLV record\n"); return; } if ((dp[0] & 0x1F) == 0x1F) { printf(" bad: extended tag not supported\n"); return; } if (dp[1] & 0x80) { printf(" bad: extended length not supported\n"); return; } reclen = dp[1] + 2; if (endp - dp < reclen) goto trunc_error; switch (dp[0]) { case 0x4F: dump_aid(dp); break; case 0x50: dump_label(dp); break; default: dump_unknown_tlv(dp); } dp += reclen; } }