comparison simtool/grcard1.c @ 10:ddd767f6e15b

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