comparison simtool/hlread.c @ 1:2071b28cd0c7

simtool: first refactored version
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 11 Feb 2021 23:04:28 +0000
parents
children 4360a7906f34
comparison
equal deleted inserted replaced
0:f7145c77b7fb 1:2071b28cd0c7
1 /*
2 * This module implements some high-level or user-friendly read commands.
3 */
4
5 #include <sys/types.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include "simresp.h"
9 #include "curfile.h"
10 #include "file_id.h"
11
12 encode_hex_digit(d)
13 unsigned d;
14 {
15 if (d <= 9)
16 return(d + '0');
17 else
18 return(d - 10 + 'A');
19 }
20
21 decode_reversed_nibbles(bytes, nbytes, dest)
22 u_char *bytes;
23 unsigned nbytes;
24 char *dest;
25 {
26 u_char *sp;
27 char *dp;
28 unsigned n, c;
29
30 sp = bytes;
31 dp = dest;
32 for (n = 0; n < nbytes; n++) {
33 c = *sp & 0xF;
34 *dp++ = encode_hex_digit(c);
35 c = *sp >> 4;
36 *dp++ = encode_hex_digit(c);
37 sp++;
38 }
39 }
40
41 cmd_iccid()
42 {
43 int rc;
44 char buf[21];
45
46 rc = select_op(FILEID_MF);
47 if (rc < 0)
48 return(rc);
49 rc = select_op(EF_ICCID);
50 if (rc < 0)
51 return(rc);
52 rc = parse_ef_select_response();
53 if (rc < 0)
54 return(rc);
55 if (curfile_structure != 0x00 || curfile_total_size != 10) {
56 fprintf(stderr, "error: expected transparent EF of 10 bytes\n");
57 return(-1);
58 }
59 rc = readbin_op(0, 10);
60 if (rc < 0)
61 return(rc);
62 decode_reversed_nibbles(sim_resp_data, 10, buf);
63 buf[20] = '\0';
64 printf("%s\n", buf);
65 return(0);
66 }
67
68 cmd_imsi()
69 {
70 int rc;
71 char buf[17];
72
73 rc = select_op(DF_GSM);
74 if (rc < 0)
75 return(rc);
76 rc = select_op(EF_IMSI);
77 if (rc < 0)
78 return(rc);
79 rc = parse_ef_select_response();
80 if (rc < 0)
81 return(rc);
82 if (curfile_structure != 0x00 || curfile_total_size != 9) {
83 fprintf(stderr, "error: expected transparent EF of 9 bytes\n");
84 return(-1);
85 }
86 rc = readbin_op(0, 9);
87 if (rc < 0)
88 return(rc);
89 decode_reversed_nibbles(sim_resp_data + 1, 8, buf);
90 buf[16] = '\0';
91 printf("%s parity=%c len=%u\n", buf + 1, buf[0], sim_resp_data[0]);
92 return(0);
93 }
94
95 cmd_spn()
96 {
97 int rc;
98 unsigned textlen;
99
100 rc = select_op(DF_GSM);
101 if (rc < 0)
102 return(rc);
103 rc = select_op(EF_SPN);
104 if (rc < 0)
105 return(rc);
106 rc = parse_ef_select_response();
107 if (rc < 0)
108 return(rc);
109 if (curfile_structure != 0x00 || curfile_total_size != 17) {
110 fprintf(stderr, "error: expected transparent EF of 17 bytes\n");
111 return(-1);
112 }
113 rc = readbin_op(0, 17);
114 if (rc < 0)
115 return(rc);
116 printf("Display condition: %02X\n", sim_resp_data[0]);
117 printf("SPN: ");
118 rc = validate_alpha_field(sim_resp_data + 1, 16, &textlen);
119 if (rc >= 0)
120 print_alpha_field(sim_resp_data, textlen, stdout);
121 else
122 printf("malformed alpha field");
123 putchar('\n');
124 return(0);
125 }