FreeCalypso > hg > fc-sim-tools
comparison simtool/grcard2.c @ 10:ddd767f6e15b
fc-simtool ported over
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 14 Mar 2021 07:11:25 +0000 |
parents | |
children | 4ebd67176b73 |
comparison
equal
deleted
inserted
replaced
9:c9ef9e91dd8e | 10:ddd767f6e15b |
---|---|
1 /* | |
2 * This module implements special commands for the grcard.cn card model | |
3 * which is known in the Osmocom community as GrcardSIM2: | |
4 * | |
5 * https://osmocom.org/projects/cellular-infrastructure/wiki/GrcardSIM2 | |
6 * | |
7 * The sample cards which Mother Mychaela received from Grcard in 2021-02 | |
8 * are GrcardSIM2, and so are historical sysmoSIM-GR2 and 30C3 cards. | |
9 */ | |
10 | |
11 #include <sys/types.h> | |
12 #include <stdio.h> | |
13 #include "simresp.h" | |
14 #include "curfile.h" | |
15 #include "file_id.h" | |
16 | |
17 cmd_grcard2_set_pin(argc, argv) | |
18 char **argv; | |
19 { | |
20 u_char cmd[13]; | |
21 int rc; | |
22 | |
23 /* Grcard2 proprietary command APDU */ | |
24 cmd[0] = 0xA0; | |
25 cmd[1] = 0xD4; | |
26 cmd[2] = 0x3A; | |
27 switch (argv[0][15]) { | |
28 case '1': | |
29 cmd[3] = 0x01; | |
30 break; | |
31 case '2': | |
32 cmd[3] = 0x02; | |
33 break; | |
34 default: | |
35 fprintf(stderr, "BUG in grcard2-set-pinN command\n"); | |
36 return(-1); | |
37 } | |
38 cmd[4] = 8; | |
39 rc = encode_pin_entry(argv[1], cmd + 5); | |
40 if (rc < 0) | |
41 return(rc); | |
42 rc = apdu_exchange(cmd, 13); | |
43 if (rc < 0) | |
44 return(rc); | |
45 if (sim_resp_sw != 0x9000) { | |
46 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
47 return(-1); | |
48 } | |
49 return(0); | |
50 } | |
51 | |
52 cmd_grcard2_set_puk(argc, argv) | |
53 char **argv; | |
54 { | |
55 u_char cmd[13]; | |
56 int rc; | |
57 | |
58 /* Grcard2 proprietary command APDU */ | |
59 cmd[0] = 0xA0; | |
60 cmd[1] = 0xD4; | |
61 cmd[2] = 0x3B; | |
62 switch (argv[0][15]) { | |
63 case '1': | |
64 cmd[3] = 0x00; | |
65 break; | |
66 case '2': | |
67 cmd[3] = 0x02; | |
68 break; | |
69 default: | |
70 fprintf(stderr, "BUG in grcard2-set-pukN command\n"); | |
71 return(-1); | |
72 } | |
73 cmd[4] = 8; | |
74 rc = encode_pin_entry(argv[1], cmd + 5); | |
75 if (rc < 0) | |
76 return(rc); | |
77 rc = apdu_exchange(cmd, 13); | |
78 if (rc < 0) | |
79 return(rc); | |
80 if (sim_resp_sw != 0x9000) { | |
81 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
82 return(-1); | |
83 } | |
84 return(0); | |
85 } | |
86 | |
87 cmd_grcard2_set_adm5(argc, argv) | |
88 char **argv; | |
89 { | |
90 u_char cmd[13]; | |
91 int rc; | |
92 | |
93 /* Grcard2 proprietary command APDU */ | |
94 cmd[0] = 0xA0; | |
95 cmd[1] = 0xD4; | |
96 cmd[2] = 0x3A; | |
97 cmd[3] = 0x05; | |
98 cmd[4] = 8; | |
99 rc = encode_pin_entry(argv[1], cmd + 5); | |
100 if (rc < 0) | |
101 return(rc); | |
102 rc = apdu_exchange(cmd, 13); | |
103 if (rc < 0) | |
104 return(rc); | |
105 if (sim_resp_sw != 0x9000) { | |
106 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
107 return(-1); | |
108 } | |
109 return(0); | |
110 } | |
111 | |
112 cmd_grcard2_set_adm5_hex(argc, argv) | |
113 char **argv; | |
114 { | |
115 u_char cmd[13]; | |
116 int rc; | |
117 | |
118 /* Grcard2 proprietary command APDU */ | |
119 cmd[0] = 0xA0; | |
120 cmd[1] = 0xD4; | |
121 cmd[2] = 0x3A; | |
122 cmd[3] = 0x05; | |
123 cmd[4] = 8; | |
124 rc = decode_hex_data_from_string(argv[1], cmd + 5, 8, 8); | |
125 if (rc < 0) | |
126 return(rc); | |
127 rc = apdu_exchange(cmd, 13); | |
128 if (rc < 0) | |
129 return(rc); | |
130 if (sim_resp_sw != 0x9000) { | |
131 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
132 return(-1); | |
133 } | |
134 return(0); | |
135 } | |
136 | |
137 cmd_grcard2_set_super(argc, argv) | |
138 char **argv; | |
139 { | |
140 u_char cmd[13]; | |
141 int rc; | |
142 | |
143 /* Grcard2 proprietary command APDU */ | |
144 cmd[0] = 0xA0; | |
145 cmd[1] = 0xD4; | |
146 cmd[2] = 0x3A; | |
147 cmd[3] = 0x0B; | |
148 cmd[4] = 8; | |
149 rc = encode_pin_entry(argv[1], cmd + 5); | |
150 if (rc < 0) | |
151 return(rc); | |
152 rc = apdu_exchange(cmd, 13); | |
153 if (rc < 0) | |
154 return(rc); | |
155 if (sim_resp_sw != 0x9000) { | |
156 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
157 return(-1); | |
158 } | |
159 return(0); | |
160 } | |
161 | |
162 cmd_grcard2_set_super_hex(argc, argv) | |
163 char **argv; | |
164 { | |
165 u_char cmd[13]; | |
166 int rc; | |
167 | |
168 /* Grcard2 proprietary command APDU */ | |
169 cmd[0] = 0xA0; | |
170 cmd[1] = 0xD4; | |
171 cmd[2] = 0x3A; | |
172 cmd[3] = 0x0B; | |
173 cmd[4] = 8; | |
174 rc = decode_hex_data_from_string(argv[1], cmd + 5, 8, 8); | |
175 if (rc < 0) | |
176 return(rc); | |
177 rc = apdu_exchange(cmd, 13); | |
178 if (rc < 0) | |
179 return(rc); | |
180 if (sim_resp_sw != 0x9000) { | |
181 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
182 return(-1); | |
183 } | |
184 return(0); | |
185 } | |
186 | |
187 static | |
188 select_ef_weki() | |
189 { | |
190 int rc; | |
191 | |
192 rc = select_op(DF_GSM); | |
193 if (rc < 0) | |
194 return(rc); | |
195 rc = select_op(0x0001); /* proprietary EF */ | |
196 if (rc < 0) | |
197 return(rc); | |
198 rc = parse_ef_select_response(); | |
199 if (rc < 0) | |
200 return(rc); | |
201 if (curfile_structure != 0x00 || curfile_total_size != 35) { | |
202 fprintf(stderr, | |
203 "error: EF_WEKI is not a transparent EF of 35 bytes\n"); | |
204 return(-1); | |
205 } | |
206 return(0); | |
207 } | |
208 | |
209 cmd_grcard2_set_comp128(argc, argv) | |
210 char **argv; | |
211 { | |
212 int rc; | |
213 unsigned code; | |
214 u_char magic_byte; | |
215 | |
216 if (argv[1][0] < '1' || argv[1][0] > '3' || argv[1][1]) { | |
217 fprintf(stderr, "error: invalid argument\n"); | |
218 return(-1); | |
219 } | |
220 code = argv[1][0] - '1'; | |
221 rc = select_ef_weki(); | |
222 if (rc < 0) | |
223 return(rc); | |
224 rc = readbin_op(2, 1); | |
225 if (rc < 0) | |
226 return(rc); | |
227 magic_byte = sim_resp_data[0]; | |
228 magic_byte &= 0xFC; | |
229 magic_byte |= code; | |
230 return update_bin_op(2, &magic_byte, 1); | |
231 } | |
232 | |
233 cmd_grcard2_set_ki(argc, argv) | |
234 char **argv; | |
235 { | |
236 u_char ki[16]; | |
237 int rc; | |
238 | |
239 rc = decode_hex_data_from_string(argv[1], ki, 16, 16); | |
240 if (rc < 0) | |
241 return(rc); | |
242 rc = select_ef_weki(); | |
243 if (rc < 0) | |
244 return(rc); | |
245 return update_bin_op(3, ki, 16); | |
246 } |