comparison simtool/select.c @ 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
comparison
equal deleted inserted replaced
93:d4150123ca45 94:b84df973cd8b
171 default: 171 default:
172 printf("File type: %02X (unknown)\n", sim_resp_data[6]); 172 printf("File type: %02X (unknown)\n", sim_resp_data[6]);
173 } 173 }
174 return(0); 174 return(0);
175 } 175 }
176
177 parse_ef_select_response()
178 {
179 if (sim_resp_data_len < 14) {
180 fprintf(stderr,
181 "error: SELECT response length of %u bytes is too short\n",
182 sim_resp_data_len);
183 return(-1);
184 }
185 if (sim_resp_data[6] != 0x04) {
186 fprintf(stderr, "error: selected file is not an EF\n");
187 return(-1);
188 }
189 curfile_total_size = (sim_resp_data[2] << 8) | sim_resp_data[3];
190 curfile_structure = sim_resp_data[13];
191 switch (curfile_structure) {
192 case 0x00:
193 /* transparent */
194 break;
195 case 0x01:
196 case 0x03:
197 /* record-based */
198 if (sim_resp_data_len < 15) {
199 fprintf(stderr,
200 "error: SELECT response length of %u bytes is too short for record-based EF\n",
201 sim_resp_data_len);
202 return(-1);
203 }
204 curfile_record_len = sim_resp_data[14];
205 if (!curfile_record_len) {
206 fprintf(stderr,
207 "error: SELECT response indicates record length of 0\n");
208 return(-1);
209 }
210 if (curfile_total_size % curfile_record_len) {
211 fprintf(stderr,
212 "error: returned file size is not divisible by record length\n");
213 return(-1);
214 }
215 curfile_record_count = curfile_total_size / curfile_record_len;
216 break;
217 default:
218 fprintf(stderr, "error: unknown EF structure code %02X\n",
219 curfile_structure);
220 return(-1);
221 }
222 return(0);
223 }