comparison uicc/select.c @ 134:69628bcfec17

fc-uicc-tool: iccid command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Feb 2021 02:28:52 +0000
parents 5af88fa11b54
children 51d6aaa43a7b
comparison
equal deleted inserted replaced
133:f3bdefbeae38 134:69628bcfec17
149 rc = select_op(file_id); 149 rc = select_op(file_id);
150 if (rc < 0) 150 if (rc < 0)
151 return(rc); 151 return(rc);
152 return parse_and_display_select_response(); 152 return parse_and_display_select_response();
153 } 153 }
154
155 u_char *
156 extract_select_resp_tag(sought_tag)
157 unsigned sought_tag;
158 {
159 unsigned offset, totlen, reclen;
160 u_char *dp, *endp;
161 int rc;
162
163 rc = select_resp_header_check(&offset, &totlen);
164 if (rc < 0)
165 return(0);
166 dp = sim_resp_data + offset;
167 endp = sim_resp_data + offset + totlen;
168 while (dp < endp) {
169 if (endp - dp < 2) {
170 trunc_error: fprintf(stderr,
171 "error: truncated TLV record in SELECT response\n");
172 return(0);
173 }
174 if ((dp[0] & 0x1F) == 0x1F) {
175 fprintf(stderr,
176 "error: extended tag not supported in SELECT response\n");
177 return(0);
178 }
179 if (dp[1] & 0x80) {
180 fprintf(stderr,
181 "error: extended length not supported in SELECT response\n");
182 return(0);
183 }
184 reclen = dp[1] + 2;
185 if (endp - dp < reclen)
186 goto trunc_error;
187 if (dp[0] == sought_tag)
188 return(dp);
189 dp += reclen;
190 }
191 fprintf(stderr, "error: tag 0x%02X not found in SELECT response\n",
192 sought_tag);
193 return(0);
194 }
195
196 select_resp_get_transparent(lenp)
197 unsigned *lenp;
198 {
199 u_char *tlv;
200
201 tlv = extract_select_resp_tag(0x82);
202 if (!tlv)
203 return(-1);
204 if (tlv[1] != 2) {
205 bad_file_desc: fprintf(stderr, "error: file type is not transparent EF\n");
206 return(-1);
207 }
208 if (tlv[2] & 0x80)
209 goto bad_file_desc;
210 if ((tlv[2] & 0x38) == 0x38)
211 goto bad_file_desc;
212 if ((tlv[2] & 0x07) != 0x01)
213 goto bad_file_desc;
214 tlv = extract_select_resp_tag(0x80);
215 if (!tlv)
216 return(-1);
217 if (tlv[1] != 2) {
218 fprintf(stderr,
219 "error: file size TLV element has wrong length\n");
220 return(-1);
221 }
222 if (lenp)
223 *lenp = (tlv[2] << 8) | tlv[3];
224 return(0);
225 }