910770f09f2ed40002daa7c38fd662d582d33a8f
[librfid] / utils / librfid-tool.c
1 /* librfid-tool - a small command-line tool for librfid testing
2  *
3  * (C) 2005-2008 by Harald Welte <laforge@gnumonks.org>
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License version 2 
7  *  as published by the Free Software Foundation
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdio.h>
20 #include <unistd.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <errno.h>
24
25 #ifndef __MINGW32__
26 #include <libgen.h>
27 #endif
28
29 #define _GNU_SOURCE
30 #include <getopt.h>
31
32 #include <librfid/rfid.h>
33 #include <librfid/rfid_scan.h>
34 #include <librfid/rfid_reader.h>
35 #include <librfid/rfid_layer2.h>
36 #include <librfid/rfid_protocol.h>
37
38 #include <librfid/rfid_layer2_iso14443a.h>
39 #include <librfid/rfid_layer2_iso15693.h>
40
41 #include <librfid/rfid_protocol_mifare_classic.h>
42 #include <librfid/rfid_protocol_mifare_ul.h>
43 #include <librfid/rfid_protocol_tagit.h>
44 #include <librfid/rfid_protocol_icode.h>
45
46 #include "librfid-tool.h"
47
48
49 static int select_mf(void)
50 {
51         unsigned char cmd[] = { 0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00 };
52         unsigned char ret[256];
53         unsigned int rlen = sizeof(ret);
54
55         int rv;
56
57         rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
58         if (rv < 0)
59                 return rv;
60
61         printf("%d: [%s]\n", rlen, hexdump(ret, rlen));
62
63         return 0;
64 }
65
66
67 static int iso7816_get_challenge(unsigned char len)
68 {
69         unsigned char cmd[] = { 0x00, 0x84, 0x00, 0x00, 0x08 };
70         unsigned char ret[256];
71         unsigned int rlen = sizeof(ret);
72
73         cmd[4] = len;
74
75         int rv;
76
77         rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
78         if (rv < 0)
79                 return rv;
80
81         printf("%d: [%s]\n", rlen, hexdump(ret, rlen));
82
83         return 0;
84 }
85
86 int
87 iso7816_select_application(void)
88 {
89         unsigned char cmd[] = { 0x00, 0xa4, 0x04, 0x0c, 0x07,
90                        0xa0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01 };
91         unsigned char resp[7];
92         unsigned int rlen = sizeof(resp);
93
94         int rv;
95
96         rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
97         if (rv < 0)
98                 return rv;
99
100         /* FIXME: parse response */
101         printf("%s\n", hexdump(resp, rlen));
102
103         return 0;
104 }
105
106 int
107 iso7816_select_ef(u_int16_t fid)
108 {
109         unsigned char cmd[7] = { 0x00, 0xa4, 0x02, 0x0c, 0x02, 0x00, 0x00 };
110         unsigned char resp[7];
111         unsigned int rlen = sizeof(resp);
112
113         int rv;
114
115         cmd[5] = (fid >> 8) & 0xff;
116         cmd[6] = fid & 0xff;
117
118         rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
119         if (rv < 0)
120                 return rv;
121
122         /* FIXME: parse response */
123         printf("%s\n", hexdump(resp, rlen));
124
125         return 0;
126 }
127
128 int
129 iso7816_read_binary(unsigned char *buf, unsigned int *len)
130 {
131         unsigned char cmd[] = { 0x00, 0xb0, 0x00, 0x00, 0x00 };
132         unsigned char resp[256];
133         unsigned int rlen = sizeof(resp);
134         
135         int rv;
136
137         rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
138         if (rv < 0)
139                 return rv;
140
141         printf("%s\n", hexdump(resp, rlen));
142
143         /* FIXME: parse response, determine whether we need additional reads */
144
145         /* FIXME: copy 'len' number of response bytes to 'buf' */
146         return 0;
147 }
148
149 /* wrapper function around SELECT EF and READ BINARY */
150 int
151 iso7816_read_ef(u_int16_t fid, unsigned char *buf, unsigned int *len)
152 {
153         int rv;
154
155         rv = iso7816_select_ef(fid);
156         if (rv < 0)
157                 return rv;
158
159         return iso7816_read_binary(buf, len);
160 }
161
162 /* mifare ultralight helpers */
163 int
164 mifare_ulight_write(struct rfid_protocol_handle *ph)
165 {
166         unsigned char buf[4] = { 0xa1, 0xa2, 0xa3, 0xa4 };
167
168         return rfid_protocol_write(ph, 10, buf, 4);
169 }
170
171 int
172 mifare_ulight_blank(struct rfid_protocol_handle *ph)
173 {
174         unsigned char buf[4] = { 0x00, 0x00, 0x00, 0x00 };
175         int i, ret;
176
177         for (i = 4; i <= MIFARE_UL_PAGE_MAX; i++) {
178                 ret = rfid_protocol_write(ph, i, buf, 4);
179                 if (ret < 0)
180                         return ret;
181         }
182         return 0;
183 }
184
185 static int
186 mifare_ulight_read(struct rfid_protocol_handle *ph)
187 {
188         unsigned char buf[20];
189         unsigned int len = sizeof(buf);
190         int ret;
191         int i;
192
193         for (i = 0; i <= MIFARE_UL_PAGE_MAX; i++) {
194                 ret = rfid_protocol_read(ph, i, buf, &len);
195                 if (ret < 0)
196                         return ret;
197
198                 printf("Page 0x%x: %s\n", i, hexdump(buf, 4));
199         }
200         return 0;
201 }
202
203 /* mifare classic helpers */
204 static int
205 mifare_classic_read_sector(struct rfid_protocol_handle *ph, int sector)
206 {
207         unsigned char buf[20];
208         unsigned int len = sizeof(buf);
209         int ret;
210         int block, blocks_per_sector, first_block;
211
212         printf("Reading sector %u\n", sector);
213
214         first_block = mfcl_sector2block(sector);
215         blocks_per_sector = mfcl_sector_blocks(sector);
216
217         if (first_block < 0 || blocks_per_sector < 0)
218                 return -EINVAL;
219
220         for (block = first_block; block < first_block + blocks_per_sector;
221              block++) {
222                 printf("Reading block %u: ", block);
223                 ret = rfid_protocol_read(ph, block, buf, &len);
224                 if (ret == -ETIMEDOUT)
225                         fprintf(stderr, "TIMEOUT\n");
226                 if (ret < 0) {
227                         printf("Error %d reading\n", ret);
228                         return ret;
229                 }
230
231                 printf("Page 0x%x: %s\n", block, hexdump(buf, len));
232         }
233         return 0;
234 }
235
236 static int
237 mifare_classic_dump(struct rfid_protocol_handle *ph)
238 {
239         unsigned int size;
240         unsigned int size_len = sizeof(size);
241         int sector, num_sectors;
242
243         if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE, 
244                                  &size, &size_len) == 0) {
245                 printf("Size: %u bytes\n", size);
246         } else {
247                 printf("Size: unknown ?!?\n");
248                 return -EINVAL;
249         }
250
251         switch (size) {
252         case 320:
253                 num_sectors = 5;
254                 break;
255         case 1024:
256                 num_sectors = 16;
257                 break;
258         case 4096:
259                 num_sectors = 40;
260                 break;
261         default:
262                 return -EINVAL;
263         }
264
265         for (sector = 0; sector < num_sectors; sector++) {
266                 int rc;
267
268                 printf("Authenticating sector %u: ", sector);
269                 fflush(stdout);
270
271                 rc = mfcl_set_key(ph, MIFARE_CL_KEYA_DEFAULT_INFINEON);
272                 if (rc < 0) {
273                         printf("key format error\n");
274                         exit(1);
275                 }
276
277                 rc = mfcl_auth(ph, RFID_CMD_MIFARE_AUTH1A,
278                                mfcl_sector2block(sector));
279                 if (rc < 0) {
280                         printf("mifare auth error\n");
281                         exit(1);
282                 } else 
283                         printf("mifare auth succeeded!\n");
284
285                 mifare_classic_read_sector(ph, sector);
286         }
287 }
288
289 static char *proto_names[] = {
290         [RFID_PROTOCOL_TCL] = "tcl",
291         [RFID_PROTOCOL_MIFARE_UL] = "mifare-ultralight",
292         [RFID_PROTOCOL_MIFARE_CLASSIC] = "mifare-classic",
293         [RFID_PROTOCOL_ICODE_SLI] = "icode",
294         [RFID_PROTOCOL_TAGIT] = "tagit",
295 };
296
297 static int proto_by_name(const char *name)
298 {
299         int i;
300
301         for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
302                 if (proto_names[i] == NULL)
303                         continue;
304                 if (!strcasecmp(name, proto_names[i]))
305                         return i;
306         }
307         return -1;
308 }
309
310 static char *l2_names[] = {
311         [RFID_LAYER2_ISO14443A] = "iso14443a",
312         [RFID_LAYER2_ISO14443B] = "iso14443b",
313         [RFID_LAYER2_ISO15693] = "iso15693",
314         [RFID_LAYER2_ICODE1] = "icode1",
315 };
316
317 static int l2_by_name(const char *name)
318 {
319         int i;
320
321         for (i = 0; i < ARRAY_SIZE(l2_names); i++) {
322                 if (l2_names[i] == NULL)
323                         continue;
324                 if (!strcasecmp(name, l2_names[i]))
325                         return i;
326         }
327         return -1;
328 }
329
330 static int do_scan(int first)
331 {
332         int rc;
333         unsigned int size;
334         unsigned int size_len = sizeof(size);
335
336         if (first) {
337                 rh->reader->rf_power(rh, 0);
338                 usleep(10*1000);
339                 rh->reader->rf_power(rh, 1);
340         }
341         printf("scanning for RFID token...\n");
342         rc = rfid_scan(rh, &l2h, &ph);
343         if (rc >= 2) {
344                 unsigned char uid_buf[16];
345                 unsigned int uid_len = sizeof(uid_buf);
346                 rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf,
347                                    &uid_len);
348                 printf("Layer 2 success (%s): %s\n", rfid_layer2_name(l2h),
349                         hexdump(uid_buf, uid_len));
350         }
351         if (rc >= 3) {
352                 printf("Protocol success (%s)\n", rfid_protocol_name(ph));
353
354                 if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE, 
355                                          &size, &size_len) == 0)
356                         printf("Size: %u bytes\n", size);
357         }
358
359         return rc;
360 }
361
362 static void do_endless_scan()
363 {
364         int rc;
365         int first = 1;
366
367         while (1) {
368                 if (first)
369                         putc('\n', stdout);
370                 printf("==> doing %s scan\n", first ? "first" : "successive");
371                 rc = do_scan(first);
372                 if (rc >= 3) {
373                         printf("closing proto\n");
374                         rfid_protocol_close(ph);
375                 }
376                 if (rc >= 2) {
377                         printf("closing layer2\n");
378                         rfid_layer2_close(l2h);
379                         first = 0;
380                 } else
381                         first = 1;
382         }
383 }
384
385 static void do_regdump(void)
386 {
387         u_int8_t buffer[0xff];
388         int i;
389
390         printf("dumping rc632 regs...\n");
391
392         rc632_register_dump(rh->ah, buffer);
393
394         printf("\n     ");
395         for (i=0; i<=0x0f; i++)
396                 printf(" 0x_%01X",i);
397         printf("\n-----------------------------------------------------------------------------------\n");
398
399         for (i=0; i <= 0x3f; i++) {
400                 if ((i % 0x10) == 0)
401                         printf("0x%01X_:",i/0x10);
402                 printf(" 0x%02X", buffer[i]);
403                 if ((i% 0x10) == 0x0f)
404                         printf("\n");
405         }
406
407         /* print regdump as c-style array*/
408         printf("u_int8_t rc632_regs[] = {");
409         for (i = 0; i <= 0x3f; i++) {
410                 if (((i+1) % 0x08) == 1) {
411                         if (i > 7)
412                                 printf("//%2d..%2d",i-8,i-1);
413                         printf("\n\t");
414                 }
415                 printf(" 0x%02X, ",buffer[i]);
416         }
417         printf("//%2d..%2d\n\t 0 };\n",i-8,i-1);
418
419 }
420
421 static void do_enum(int layer2)
422 {
423         int rc;
424         //unsigned int size;
425         //unsigned int size_len = sizeof(size);
426         unsigned char uid_buf[16];
427         unsigned int uid_len;
428
429         printf("scanning for RFID token on layer %s...\n", l2_names[layer2]);
430
431         if (rh->reader->l2_supported & (1 << layer2)) {
432                 l2h = rfid_layer2_init(rh, layer2);
433                 rc = rfid_layer2_open(l2h);
434         } else {
435                 printf("error during layer2_open\n");
436                 return ;
437         }
438
439         while (rc>=0) {
440                 if (l2h) {
441                         uid_len = sizeof(uid_buf);
442                         rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf, &uid_len);
443                         printf("Layer 2 success (%s)[%d]: %s\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
444                 }
445
446         /*
447                 ph = rfid_protocol_scan(l2h);
448                 if (ph) {
449                         printf("Protocol success (%s)\n", rfid_protocol_name(ph));
450
451                         if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE,
452                                              &size, &size_len) == 0)
453                         printf("Size: %u bytes\n", size);
454                 } else
455                         printf("##############\n");
456                 */
457
458                 if (rc >= 0) {
459                         rfid_layer2_close(l2h);
460                 }
461                 rc = rfid_layer2_open(l2h);
462         }
463 }
464
465 #define OPTION_OFFSET 256
466
467 static struct option original_opts[] = {
468         { "help", 0, 0, 'h' },
469         { "layer2", 1, 0, 'l' },
470         { "protocol", 1, 0, 'p' },
471         { "scan", 0, 0, 's' },
472         { "scan-loop", 0, 0, 'S' },
473         { "dump", 0, 0, 'd' },
474         { "enum", 0, 0, 'e' },
475         {0, 0, 0, 0}
476 };
477
478 /* module / option merging code */
479 static struct option *opts = original_opts;
480 static unsigned int global_option_offset = 0;
481
482 static char *program_name;
483 static char *program_version = LIBRFID_TOOL_VERSION;
484
485 static void free_opts(int reset_offset)
486 {
487         if (opts != original_opts) {
488                 free(opts);
489                 opts = original_opts;
490                 if (reset_offset)
491                         global_option_offset = 0;
492         }
493 }
494
495 static struct option *
496 merge_options(struct option *oldopts, const struct option *newopts,
497               unsigned int *option_offset)
498 {
499         unsigned int num_old, num_new, i;
500         struct option *merge;
501
502         for (num_old = 0; oldopts[num_old].name; num_old++);
503         for (num_new = 0; oldopts[num_new].name; num_new++);
504
505         global_option_offset += OPTION_OFFSET;
506         *option_offset = global_option_offset;
507
508         merge = malloc(sizeof(struct option) * (num_new + num_old + 1));
509         memcpy(merge, oldopts, num_old * sizeof(struct option));
510         free_opts(0); /* Release previous options merged if any */
511         for (i = 0; i < num_new; i++) {
512                 merge[num_old + i] = newopts[i];
513                 merge[num_old + i].val += *option_offset;
514         }
515         memset(merge + num_old + num_new, 0, sizeof(struct option));
516
517         return merge;
518 }
519
520 struct rfidtool_module *find_module(const char *name)
521 {
522         return NULL;
523 }
524
525 void register_module(struct rfidtool_module *me)
526 {
527         struct rfidtool_module *old;
528
529         if (strcmp(me->version, program_version) != 0) {
530                 fprintf(stderr, "%s: target `%s' v%s (I'm v%s).\n",
531                         program_name, me->name, me->version, program_version);
532                 exit(1);
533         }
534
535         old = find_module(me->name);
536         if (old) {
537                 fprintf(stderr, "%s: target `%s' already registered.\n",
538                         program_name, me->name);
539                 exit(1);
540         }
541 }
542
543 static void help(void)
544 {
545         printf( " -s    --scan          scan until first RFID tag is found\n"
546                 " -S    --scan-loop     endless scanning loop\n" 
547                 " -p    --protocol      {tcl,mifare-ultralight,mifare-classic,tagit}\n"
548                 " -l    --layer2        {iso14443a,iso14443b,iso15693}\n"
549                 " -d    --dump          dump rc632 registers\n"
550                 " -e    --enum          enumerate all tag's in field (iso14443a)\n"
551                 " -h    --help\n");
552 }
553
554 int main(int argc, char **argv)
555 {
556         int rc;
557         char buf[0x100];
558         int i, len, protocol = -1, layer2 = -1;
559
560 #ifdef  __MINGW32__
561         program_name = argv[0];
562 #else /*__MINGW32__*/
563         program_name = basename(argv[0]);
564 #endif/*__MINGW32__*/
565         
566         printf("%s - (C) 2005-2008 by Harald Welte\n"
567                "This program is Free Software and has "
568                "ABSOLUTELY NO WARRANTY\n\n", program_name);
569
570         printf("initializing librfid\n");
571         rfid_init();
572
573         while (1) {
574                 int c, option_index = 0;
575                 c = getopt_long(argc, argv, "hp:l:sSde", opts, &option_index);
576                 if (c == -1)
577                         break;
578
579                 switch (c) {
580                 case 'e':
581                         if (reader_init() < 0)
582                                 exit(1);
583                         layer2 = RFID_LAYER2_ISO14443A;
584                         do_enum(layer2);
585                         exit(0);
586                         break;
587                 case 'd':
588                         if (reader_init() < 0)
589                                 exit(1);
590                         do_regdump();
591                         break;
592                 case 's':
593                         if (reader_init() < 0)
594                                 exit(1);
595                         do_scan(0);
596                         exit(0);
597                         break;
598                 case 'S':
599                         if (reader_init() < 0)
600                                 exit(1);
601                         do_endless_scan();
602                         exit(0);
603                         break;
604                 case 'p':
605                         protocol = proto_by_name(optarg);
606                         if (protocol < 0) {
607                                 fprintf(stderr, "unknown protocol `%s'\n", 
608                                         optarg);
609                                 exit(2);
610                         }
611                         break;
612                 case 'l':
613                         layer2 = l2_by_name(optarg);
614                         if (layer2 < 0) {
615                                 fprintf(stderr, "unknown layer2 `%s'\n",
616                                         optarg);
617                                 exit(2);
618                         }
619                         break;
620                 case 'h':
621                         help();
622                         exit(0);
623                         break;
624                 }
625         }
626
627         switch (protocol) {
628         case RFID_PROTOCOL_MIFARE_UL:
629         case RFID_PROTOCOL_MIFARE_CLASSIC:
630                 layer2 = RFID_LAYER2_ISO14443A;
631                 break;
632         case -1:
633                 fprintf(stderr, "you have to specify --protocol\n");
634                 exit(2);
635         }
636
637         if (layer2 < 0) {
638                 fprintf(stderr, "you have to specify --layer2\n");
639                 exit(2);
640         }
641         
642         if (reader_init() < 0)
643                 exit(1);
644
645
646         if (l2_init(layer2) < 0) {
647                 rfid_reader_close(rh);
648                 exit(1);
649         }
650
651         if (l3_init(protocol) < 0) {
652                 rfid_reader_close(rh);
653                 exit(1);
654         }
655
656         switch (protocol) {
657
658         case RFID_PROTOCOL_TCL:
659                 printf("Protocol T=CL\n");
660                 /* we've established T=CL at this point */
661                 printf("selecting Master File\n");
662                 rc = select_mf();
663                 if (rc < 0) {
664                         printf("error selecting MF\n");
665                         break;
666                 }
667
668                 printf("Getting random challenge, length 255\n");
669                 rc = iso7816_get_challenge(0xff);
670                 if (rc < 0) {
671                         printf("error getting random challenge\n");
672                         break;
673                 }
674
675                 printf("selecting Passport application\n");
676                 rc = iso7816_select_application();
677                 if (rc < 0) {
678                         printf("error selecting passport application\n");
679                         break;
680                 }
681
682                 printf("selecting EF 0x1e\n");
683                 rc = iso7816_select_ef(0x011e);
684                 if (rc < 0) {
685                         printf("error selecting EF 0x1e\n");
686                         break;
687                 }
688
689                 printf("selecting EF 0x01\n");
690                 rc = iso7816_select_ef(0x0101);
691                 if (rc < 0) {
692                         printf("error selecting EF 0x01\n");
693                         break;
694                 }
695
696                 while (1) {
697                         printf("reading EF1\n");
698                         len = sizeof(buf);
699                         printf("reading ef\n");
700                         rc = iso7816_read_binary(buf, &len);
701                         if (rc < 0) {
702                                 printf("error reading EF\n");
703                                 break;
704                         }
705                 }
706 #if 0
707                 for (i = 0; i < 4; i++)
708                         iso7816_get_challenge(0xff);
709 #endif
710                 break;
711         case RFID_PROTOCOL_MIFARE_UL:
712                 printf("Protocol Mifare Ultralight\n");
713                 mifare_ulight_read(ph);
714 #if 0
715                 mifare_ulight_blank(ph);
716                 mifare_ulight_write(ph);
717                 mifare_ulight_read(ph);
718 #endif
719                 break;
720         case RFID_PROTOCOL_MIFARE_CLASSIC:
721                 printf("Protocol Mifare Classic\n");
722                 mifare_classic_dump(ph);
723                 break;
724         default:
725                 printf("unknown protocol %u\n", protocol);
726                 exit(1);
727                 break;
728         }
729
730         rfid_reader_close(rh);
731         
732         exit(0);
733 }