60f60b73b67c1847cd4cee1b3b9063d57b060fd3
[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         printf("opening layer2 handle\n");
92         l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443A);
93         //l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443B);
94         if (!l2h) {
95                 fprintf(stderr, "error during iso14443a_init\n");
96                 return -1;
97         }
98
99         //rc632_register_dump(rh->ah, buf);
100
101         printf("running layer2 anticol\n");
102         rc = rfid_layer2_open(l2h);
103         if (rc < 0) {
104                 fprintf(stderr, "error during layer2_open\n");
105                 return rc;
106         }
107
108         printf("running layer3 (ats)\n");
109         ph = rfid_protocol_init(l2h, RFID_PROTOCOL_TCL);
110         if (!ph) {
111                 fprintf(stderr, "error during protocol_init\n");
112                 return -1;
113         }
114         if (rfid_protocol_open(ph) < 0) {
115                 fprintf(stderr, "error during protocol_open\n");
116                 return -1;
117         }
118
119         printf("we now have T=CL up and running\n");
120
121         return 0;
122 }
123
124 static int select_mf(void)
125 {
126         unsigned char cmd[] = { 0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00 };
127         unsigned char ret[256];
128         unsigned int rlen = sizeof(ret);
129
130         int rv;
131
132         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
133         if (rv < 0)
134                 return rv;
135
136         //printf("%s\n", rfid_hexdump(ret, rlen));
137
138         return 0;
139 }
140
141
142 static int get_challenge(unsigned char len)
143 {
144         unsigned char cmd[] = { 0x00, 0x84, 0x00, 0x00, 0x08 };
145         unsigned char ret[256];
146         unsigned int rlen = sizeof(ret);
147
148         cmd[4] = len;
149
150         int rv;
151
152         rv = rfid_protocol_transcieve(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
153         if (rv < 0)
154                 return rv;
155
156         //printf("%s\n", rfid_hexdump(ret, rlen));
157
158         return 0;
159 }
160
161 int main(int argc, char **argv)
162 {
163         int rc;
164         char buf[0x40];
165         int i;
166
167         if (init() < 0)
168                 exit(1);
169
170         /* we've established T=CL at this point */
171
172         select_mf();
173
174         for (i = 0; i < 4; i++)
175                 get_challenge(0x60);
176  
177         rfid_reader_close(rh);
178         
179         exit(0);
180 }