add some known vendor codes
[librfid] / openct-escape.c
1
2 /*
3  *  This program is free software; you can redistribute it and/or modify
4  *  it under the terms of the GNU General Public License version 2 
5  *  as published by the Free Software Foundation
6  *
7  *  This program is distributed in the hope that it will be useful,
8  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *  GNU General Public License for more details.
11  *
12  *  You should have received a copy of the GNU General Public License
13  *  along with this program; if not, write to the Free Software
14  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 #include <stdio.h>
18 #include <unistd.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <openct/openct.h>
22
23 #include <rfid/rfid.h>
24 #include <rfid/rfid_reader.h>
25 #include <rfid/rfid_layer2.h>
26 #include <rfid/rfid_protocol.h>
27 #include <rfid/rfid_reader_cm5121.h>
28
29 static int slot = 1;
30 static ct_handle *h;
31 static ct_lock_handle lock;
32
33 static struct rfid_reader_handle *rh;
34 static struct rfid_layer2_handle *l2h;
35 static struct rfid_protocol_handle *ph;
36
37
38 /* this is the sole function required by rfid_reader_cm5121.c */
39 int 
40 PC_to_RDR_Escape(void *handle, 
41                  const unsigned char *tx_buf, unsigned int tx_len,
42                  unsigned char *rx_buf, unsigned int *rx_len)
43 {
44         ct_handle *h = (ct_handle *) handle;
45         int rc;
46
47         rc = ct_card_transact(h, 1, tx_buf, tx_len, rx_buf, *rx_len);
48         if (rc >= 0) {
49                 *rx_len = rc;
50                 return 0;
51         }
52
53         return rc;
54 }
55
56
57
58 static int init()
59 {
60         unsigned char buf[0x3f];
61         unsigned char atr[64];
62         int rc;
63
64         h = ct_reader_connect(0);
65         if (!h)
66                 return -1;
67
68         printf("acquiring card lock\n");
69         rc = ct_card_lock(h, slot, IFD_LOCK_EXCLUSIVE, &lock);
70         if (rc < 0) {
71                 fprintf(stderr, "error, no card lock\n");
72                 return -1;
73         }
74
75         rc = ct_card_reset(h, slot, atr, sizeof(atr));
76         if (rc < 0) {
77                 fprintf(stderr, "error, can't reset virtual card\n");
78                 return -1;
79         }
80
81         printf("initializing librfid\n");
82         rfid_init();
83
84         printf("opening reader handle\n");
85         rh = rfid_reader_open(h, RFID_READER_CM5121);
86         if (!rh) {
87                 fprintf(stderr, "error, no cm5121 handle\n");
88                 return -1;
89         }
90
91         sleep(2);
92
93         printf("opening layer2 handle\n");
94         l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443A);
95         //l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443B);
96         if (!l2h) {
97                 fprintf(stderr, "error during iso14443a_init\n");
98                 return -1;
99         }
100
101         //rc632_register_dump(rh->ah, buf);
102
103         printf("running layer2 anticol\n");
104         rc = rfid_layer2_open(l2h);
105         if (rc < 0) {
106                 fprintf(stderr, "error during layer2_open\n");
107                 return rc;
108         }
109
110         printf("running layer3 (ats)\n");
111         ph = rfid_protocol_init(l2h, RFID_PROTOCOL_TCL);
112         if (!ph) {
113                 fprintf(stderr, "error during protocol_init\n");
114                 return -1;
115         }
116         if (rfid_protocol_open(ph) < 0) {
117                 fprintf(stderr, "error during protocol_open\n");
118                 return -1;
119         }
120
121         printf("we now have T=CL up and running\n");
122
123         return 0;
124 }
125
126 static int select_mf(void)
127 {
128         unsigned char cmd[] = { 0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00 };
129         unsigned char ret[256];
130         unsigned int rlen = sizeof(ret);
131
132         int rv;
133
134         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
135         if (rv < 0)
136                 return rv;
137
138         printf("%s\n", rfid_hexdump(ret, rlen));
139
140         return 0;
141 }
142
143
144 static int get_challenge(unsigned char len)
145 {
146         unsigned char cmd[] = { 0x00, 0x84, 0x00, 0x00, 0x08 };
147         unsigned char ret[256];
148         unsigned int rlen = sizeof(ret);
149
150         cmd[4] = len;
151
152         int rv;
153
154         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
155         if (rv < 0)
156                 return rv;
157
158         //printf("%s\n", rfid_hexdump(ret, rlen));
159
160         return 0;
161 }
162
163 int
164 iso7816_select_application(void)
165 {
166         char cmd[] = { 0x00, 0xa4, 0x04, 0x0c, 0x07,
167                        0x0a, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01 };
168         char resp[7];
169         unsigned int rlen = sizeof(resp);
170
171         int rv;
172
173         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
174         if (rv < 0)
175                 return rv;
176
177         /* FIXME: parse response */
178         return 0;
179 }
180
181 int
182 iso7816_select_ef(u_int16_t fid)
183 {
184         unsigned char cmd[7] = { 0x00, 0xa4, 0x02, 0x0c, 0x02, 0x00, 0x00 };
185         unsigned char resp[7];
186         unsigned int rlen = sizeof(resp);
187
188         int rv;
189
190         cmd[5] = (fid >> 8) & 0xff;
191         cmd[6] = fid & 0xff;
192
193         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
194         if (rv < 0)
195                 return rv;
196
197         /* FIXME: parse response */
198
199         return 0;
200 }
201
202 int
203 iso7816_read_binary(unsigned char *buf, unsigned int *len)
204 {
205         unsigned char cmd[] = { 0x00, 0xb0, 0x00, 0x00, 0x00 };
206         unsigned char resp[256];
207         unsigned int rlen = sizeof(resp);
208         
209         int rv;
210
211         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
212         if (rv < 0)
213                 return rv;
214
215         /* FIXME: parse response, determine whether we need additional reads */
216
217         /* FIXME: copy 'len' number of response bytes to 'buf' */
218         return 0;
219 }
220
221 /* wrapper function around SELECT EF and READ BINARY */
222 int
223 iso7816_read_ef(u_int16_t fid, unsigned char *buf, unsigned int *len)
224 {
225         int rv;
226
227         rv = iso7816_select_ef(fid);
228         if (rv < 0)
229                 return rv;
230
231         return iso7816_read_binary(buf, len);
232 }
233
234 int
235 mifare_ulight_read(struct rfid_protocol_handle *ph)
236 {
237         unsigned char buf[16];
238         unsigned int len = sizeof(buf);
239         int ret;
240         int i;
241
242         for (i = 0; i < 7; i++) {
243                 ret = rfid_protocol_read(ph, i, buf, &len);
244                 if (ret < 0)
245                         return ret;
246
247                 rfid_hexdump(buf, 4);
248         }
249         return 0;
250 }
251
252 int main(int argc, char **argv)
253 {
254         int rc;
255         char buf[0x40];
256         int i;
257
258         if (init() < 0)
259                 exit(1);
260
261         /* we've established T=CL at this point */
262
263         select_mf();
264 #if 1
265         select_mf();
266
267         iso7816_select_application();
268         iso7816_select_ef(0x011e);
269         iso7816_select_ef(0x0101);
270 #endif
271
272 #if 1
273         for (i = 0; i < 4; i++)
274                 get_challenge(0x60);
275 #endif
276
277 //      mifare_ulight_read(ph);
278
279         rfid_reader_close(rh);
280         
281         exit(0);
282 }