# HG changeset patch # User Mychaela Falconia # Date 1611520523 0 # Node ID b84df973cd8b65938bcf39596ab01d4026812067 # Parent d4150123ca453b5df08670ff5ae67cd7299b6cb9 fc-simtool: parse_ef_select_response() function added diff -r d4150123ca45 -r b84df973cd8b simtool/select.c --- 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); +}