FreeCalypso > hg > fc-sim-tools
comparison simtool/grcard2pins.c @ 96:a5cfe5135701
simtool: grcard2.c split into grcard2ki.c and grcard2pins.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 05 May 2021 03:55:23 +0000 |
parents | simtool/grcard2.c@4ebd67176b73 |
children |
comparison
equal
deleted
inserted
replaced
95:c06c0e2da24c | 96:a5cfe5135701 |
---|---|
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 * FreeCalypso Community SIM model FCSIM1 is GrcardSIM2, and so are | |
8 * historical sysmoSIM-GR2 and 30C3 cards. | |
9 */ | |
10 | |
11 #include <sys/types.h> | |
12 #include <stdio.h> | |
13 #include "simresp.h" | |
14 | |
15 cmd_grcard2_set_pin(argc, argv) | |
16 char **argv; | |
17 { | |
18 u_char cmd[13]; | |
19 int rc; | |
20 | |
21 /* Grcard2 proprietary command APDU */ | |
22 cmd[0] = 0xA0; | |
23 cmd[1] = 0xD4; | |
24 cmd[2] = 0x3A; | |
25 switch (argv[0][15]) { | |
26 case '1': | |
27 cmd[3] = 0x01; | |
28 break; | |
29 case '2': | |
30 cmd[3] = 0x02; | |
31 break; | |
32 default: | |
33 fprintf(stderr, "BUG in grcard2-set-pinN command\n"); | |
34 return(-1); | |
35 } | |
36 cmd[4] = 8; | |
37 rc = encode_pin_entry(argv[1], cmd + 5); | |
38 if (rc < 0) | |
39 return(rc); | |
40 rc = apdu_exchange(cmd, 13); | |
41 if (rc < 0) | |
42 return(rc); | |
43 if (sim_resp_sw != 0x9000) { | |
44 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
45 return(-1); | |
46 } | |
47 return(0); | |
48 } | |
49 | |
50 cmd_grcard2_set_puk(argc, argv) | |
51 char **argv; | |
52 { | |
53 u_char cmd[13]; | |
54 int rc; | |
55 | |
56 /* Grcard2 proprietary command APDU */ | |
57 cmd[0] = 0xA0; | |
58 cmd[1] = 0xD4; | |
59 cmd[2] = 0x3B; | |
60 switch (argv[0][15]) { | |
61 case '1': | |
62 cmd[3] = 0x00; | |
63 break; | |
64 case '2': | |
65 cmd[3] = 0x02; | |
66 break; | |
67 default: | |
68 fprintf(stderr, "BUG in grcard2-set-pukN command\n"); | |
69 return(-1); | |
70 } | |
71 cmd[4] = 8; | |
72 rc = encode_pin_entry(argv[1], cmd + 5); | |
73 if (rc < 0) | |
74 return(rc); | |
75 rc = apdu_exchange(cmd, 13); | |
76 if (rc < 0) | |
77 return(rc); | |
78 if (sim_resp_sw != 0x9000) { | |
79 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
80 return(-1); | |
81 } | |
82 return(0); | |
83 } | |
84 | |
85 cmd_grcard2_set_adm5(argc, argv) | |
86 char **argv; | |
87 { | |
88 u_char cmd[13]; | |
89 int rc; | |
90 | |
91 /* Grcard2 proprietary command APDU */ | |
92 cmd[0] = 0xA0; | |
93 cmd[1] = 0xD4; | |
94 cmd[2] = 0x3A; | |
95 cmd[3] = 0x05; | |
96 cmd[4] = 8; | |
97 rc = encode_pin_entry(argv[1], cmd + 5); | |
98 if (rc < 0) | |
99 return(rc); | |
100 rc = apdu_exchange(cmd, 13); | |
101 if (rc < 0) | |
102 return(rc); | |
103 if (sim_resp_sw != 0x9000) { | |
104 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
105 return(-1); | |
106 } | |
107 return(0); | |
108 } | |
109 | |
110 cmd_grcard2_set_adm5_hex(argc, argv) | |
111 char **argv; | |
112 { | |
113 u_char cmd[13]; | |
114 int rc; | |
115 | |
116 /* Grcard2 proprietary command APDU */ | |
117 cmd[0] = 0xA0; | |
118 cmd[1] = 0xD4; | |
119 cmd[2] = 0x3A; | |
120 cmd[3] = 0x05; | |
121 cmd[4] = 8; | |
122 rc = decode_hex_data_from_string(argv[1], cmd + 5, 8, 8); | |
123 if (rc < 0) | |
124 return(rc); | |
125 rc = apdu_exchange(cmd, 13); | |
126 if (rc < 0) | |
127 return(rc); | |
128 if (sim_resp_sw != 0x9000) { | |
129 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
130 return(-1); | |
131 } | |
132 return(0); | |
133 } | |
134 | |
135 cmd_grcard2_set_super(argc, argv) | |
136 char **argv; | |
137 { | |
138 u_char cmd[13]; | |
139 int rc; | |
140 | |
141 /* Grcard2 proprietary command APDU */ | |
142 cmd[0] = 0xA0; | |
143 cmd[1] = 0xD4; | |
144 cmd[2] = 0x3A; | |
145 cmd[3] = 0x0B; | |
146 cmd[4] = 8; | |
147 rc = encode_pin_entry(argv[1], cmd + 5); | |
148 if (rc < 0) | |
149 return(rc); | |
150 rc = apdu_exchange(cmd, 13); | |
151 if (rc < 0) | |
152 return(rc); | |
153 if (sim_resp_sw != 0x9000) { | |
154 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
155 return(-1); | |
156 } | |
157 return(0); | |
158 } | |
159 | |
160 cmd_grcard2_set_super_hex(argc, argv) | |
161 char **argv; | |
162 { | |
163 u_char cmd[13]; | |
164 int rc; | |
165 | |
166 /* Grcard2 proprietary command APDU */ | |
167 cmd[0] = 0xA0; | |
168 cmd[1] = 0xD4; | |
169 cmd[2] = 0x3A; | |
170 cmd[3] = 0x0B; | |
171 cmd[4] = 8; | |
172 rc = decode_hex_data_from_string(argv[1], cmd + 5, 8, 8); | |
173 if (rc < 0) | |
174 return(rc); | |
175 rc = apdu_exchange(cmd, 13); | |
176 if (rc < 0) | |
177 return(rc); | |
178 if (sim_resp_sw != 0x9000) { | |
179 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | |
180 return(-1); | |
181 } | |
182 return(0); | |
183 } |