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 }