FreeCalypso > hg > freecalypso-hwlab
changeset 94:b84df973cd8b
fc-simtool: parse_ef_select_response() function added
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Jan 2021 20:35:23 +0000 |
parents | d4150123ca45 |
children | 5f826e428641 |
files | simtool/select.c |
diffstat | 1 files changed, 48 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/simtool/select.c Sun Jan 24 20:25:04 2021 +0000 +++ b/simtool/select.c Sun Jan 24 20:35:23 2021 +0000 @@ -173,3 +173,51 @@ } return(0); } + +parse_ef_select_response() +{ + if (sim_resp_data_len < 14) { + fprintf(stderr, + "error: SELECT response length of %u bytes is too short\n", + sim_resp_data_len); + return(-1); + } + if (sim_resp_data[6] != 0x04) { + fprintf(stderr, "error: selected file is not an EF\n"); + return(-1); + } + curfile_total_size = (sim_resp_data[2] << 8) | sim_resp_data[3]; + curfile_structure = sim_resp_data[13]; + switch (curfile_structure) { + case 0x00: + /* transparent */ + break; + case 0x01: + case 0x03: + /* record-based */ + if (sim_resp_data_len < 15) { + fprintf(stderr, +"error: SELECT response length of %u bytes is too short for record-based EF\n", + sim_resp_data_len); + return(-1); + } + curfile_record_len = sim_resp_data[14]; + if (!curfile_record_len) { + fprintf(stderr, + "error: SELECT response indicates record length of 0\n"); + return(-1); + } + if (curfile_total_size % curfile_record_len) { + fprintf(stderr, + "error: returned file size is not divisible by record length\n"); + return(-1); + } + curfile_record_count = curfile_total_size / curfile_record_len; + break; + default: + fprintf(stderr, "error: unknown EF structure code %02X\n", + curfile_structure); + return(-1); + } + return(0); +}