comparison simtool/select.c @ 93:d4150123ca45

fc-simtool: some refactoring of SELECT response parsing
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 Jan 2021 20:25:04 +0000
parents fb75855a74a9
children b84df973cd8b
comparison
equal deleted inserted replaced
92:0ead9444a698 93:d4150123ca45
81 81
82 cmd_select(argc, argv) 82 cmd_select(argc, argv)
83 char **argv; 83 char **argv;
84 { 84 {
85 int file_id, rc; 85 int file_id, rc;
86 unsigned file_size;
87 86
88 if (isxdigit(argv[1][0]) && isxdigit(argv[1][1]) && 87 if (isxdigit(argv[1][0]) && isxdigit(argv[1][1]) &&
89 isxdigit(argv[1][2]) && isxdigit(argv[1][3]) && !argv[1][4]) 88 isxdigit(argv[1][2]) && isxdigit(argv[1][3]) && !argv[1][4])
90 file_id = strtoul(argv[1], 0, 16); 89 file_id = strtoul(argv[1], 0, 16);
91 else 90 else
126 show_secret_code_status("PIN2", sim_resp_data[20]); 125 show_secret_code_status("PIN2", sim_resp_data[20]);
127 show_secret_code_status("PUK2", sim_resp_data[21]); 126 show_secret_code_status("PUK2", sim_resp_data[21]);
128 break; 127 break;
129 case 0x04: 128 case 0x04:
130 printf("File type: EF\n"); 129 printf("File type: EF\n");
131 file_size = (sim_resp_data[2] << 8) | sim_resp_data[3]; 130 curfile_total_size = (sim_resp_data[2] << 8) | sim_resp_data[3];
132 printf("File size: %u\n", file_size); 131 printf("File size: %u\n", curfile_total_size);
133 switch (sim_resp_data[13]) { 132 curfile_structure = sim_resp_data[13];
133 switch (curfile_structure) {
134 case 0x00: 134 case 0x00:
135 printf("Structure: transparent\n"); 135 printf("Structure: transparent\n");
136 break; 136 break;
137 case 0x01: 137 case 0x01:
138 printf("Structure: linear fixed\n"); 138 printf("Structure: linear fixed\n");
146 sim_resp_data_len); 146 sim_resp_data_len);
147 return(-1); 147 return(-1);
148 } 148 }
149 printf("Record length: %u\n", sim_resp_data[14]); 149 printf("Record length: %u\n", sim_resp_data[14]);
150 curfile_record_len = sim_resp_data[14]; 150 curfile_record_len = sim_resp_data[14];
151 if (file_size % curfile_record_len == 0) 151 if (curfile_record_len &&
152 curfile_total_size % curfile_record_len == 0) {
153 curfile_record_count =
154 curfile_total_size / curfile_record_len;
152 printf("Number of records: %u\n", 155 printf("Number of records: %u\n",
153 file_size / curfile_record_len); 156 curfile_record_count);
157 } else
158 curfile_record_count = 0;
154 break; 159 break;
155 default: 160 default:
156 printf("Structure: %02X (unknown)\n", 161 printf("Structure: %02X (unknown)\n",
157 sim_resp_data[13]); 162 curfile_structure);
158 } 163 }
159 printf("File status: %02X\n", sim_resp_data[11]); 164 printf("File status: %02X\n", sim_resp_data[11]);
160 show_access_conditions("UPDATE", sim_resp_data[8] & 0xF); 165 show_access_conditions("UPDATE", sim_resp_data[8] & 0xF);
161 show_access_conditions("READ & SEEK", sim_resp_data[8] >> 4); 166 show_access_conditions("READ & SEEK", sim_resp_data[8] >> 4);
162 show_access_conditions("INCREASE", sim_resp_data[9] >> 4); 167 show_access_conditions("INCREASE", sim_resp_data[9] >> 4);