FreeCalypso > hg > fc-sim-tools
annotate simtool/grcard1.c @ 63:f4eb486aab40
doc/Admin-write-commands: fix verify-hex command name
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Tue, 23 Mar 2021 23:29:31 +0000 | 
| parents | ddd767f6e15b | 
| children | c8e2a0e89d08 | 
| rev | line source | 
|---|---|
| 
10
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
1 /* | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
2 * This module implements a few special commands for those very few | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
3 * incredibly lucky people on Earth who have no-longer-available | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
4 * sysmoSIM-GR1 cards, or any other branded variant of the same card | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
5 * from Grcard. | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
6 */ | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
7 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
8 #include <sys/types.h> | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
9 #include <stdio.h> | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
10 #include "simresp.h" | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
11 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
12 cmd_grcard1_set_pin(argc, argv) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
13 char **argv; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
14 { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
15 u_char cmd[21]; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
16 int rc; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
17 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
18 /* Grcard1 proprietary command APDU */ | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
19 cmd[0] = 0x80; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
20 cmd[1] = 0xD4; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
21 cmd[2] = 0x00; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
22 switch (argv[0][15]) { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
23 case '1': | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
24 cmd[3] = 0x01; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
25 break; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
26 case '2': | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
27 cmd[3] = 0x02; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
28 break; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
29 default: | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
30 fprintf(stderr, "BUG in grcard1-set-pinN command\n"); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
31 return(-1); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
32 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
33 cmd[4] = 16; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
34 rc = encode_pin_entry(argv[1], cmd + 5); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
35 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
36 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
37 rc = encode_pin_entry(argv[2], cmd + 13); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
38 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
39 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
40 rc = apdu_exchange(cmd, 21); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
41 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
42 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
43 if (sim_resp_sw != 0x9000) { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
44 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
45 return(-1); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
46 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
47 return(0); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
48 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
49 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
50 cmd_grcard1_set_adm(argc, argv) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
51 char **argv; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
52 { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
53 u_char cmd[23]; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
54 int rc; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
55 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
56 /* Grcard1 proprietary command APDU */ | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
57 cmd[0] = 0x80; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
58 cmd[1] = 0xD4; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
59 cmd[2] = 0x01; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
60 switch (argv[0][15]) { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
61 case '1': | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
62 cmd[3] = 0x04; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
63 break; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
64 case '2': | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
65 cmd[3] = 0x05; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
66 break; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
67 default: | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
68 fprintf(stderr, "BUG in grcard1-set-admN command\n"); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
69 return(-1); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
70 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
71 cmd[4] = 18; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
72 cmd[5] = 0x03; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
73 cmd[6] = 0x00; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
74 rc = encode_pin_entry(argv[1], cmd + 7); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
75 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
76 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
77 rc = encode_pin_entry(argv[2], cmd + 15); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
78 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
79 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
80 rc = apdu_exchange(cmd, 23); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
81 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
82 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
83 if (sim_resp_sw != 0x9000) { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
84 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
85 return(-1); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
86 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
87 return(0); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
88 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
89 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
90 cmd_grcard1_set_ki(argc, argv) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
91 char **argv; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
92 { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
93 u_char cmd[21]; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
94 int rc; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
95 | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
96 /* Grcard1 proprietary command APDU */ | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
97 cmd[0] = 0x80; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
98 cmd[1] = 0xD4; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
99 cmd[2] = 0x02; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
100 cmd[3] = 0x00; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
101 cmd[4] = 16; | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
102 rc = decode_hex_data_from_string(argv[1], cmd + 5, 16, 16); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
103 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
104 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
105 rc = apdu_exchange(cmd, 21); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
106 if (rc < 0) | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
107 return(rc); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
108 if (sim_resp_sw != 0x9000) { | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
109 fprintf(stderr, "bad SW response: %04X\n", sim_resp_sw); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
110 return(-1); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
111 } | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
112 return(0); | 
| 
 
ddd767f6e15b
fc-simtool ported over
 
Mychaela Falconia <falcon@freecalypso.org> 
parents:  
diff
changeset
 | 
113 } | 
