* (C) 2005-2008 by Harald Welte <laforge@gnumonks.org>
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
+ * it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful,
#include <librfid/rfid_protocol_mifare_ul.h>
#include <librfid/rfid_protocol_tagit.h>
#include <librfid/rfid_protocol_icode.h>
+#include <librfid/rfid_protocol_tcl.h>
#include "librfid-tool.h"
unsigned char cmd[] = { 0x00, 0xb0, 0x00, 0x00, 0x00 };
unsigned char resp[256];
unsigned int rlen = sizeof(resp);
-
+
int rv;
rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
unsigned char buf[20];
unsigned int len = sizeof(buf);
int ret;
- int block;
+ int block, blocks_per_sector, first_block;
- /* FIXME: make this work for sectors > 31 */
printf("Reading sector %u\n", sector);
- for (block = sector*4; block < sector*4+4; block++) {
+ first_block = mfcl_sector2block(sector);
+ blocks_per_sector = mfcl_sector_blocks(sector);
+
+ if (first_block < 0 || blocks_per_sector < 0)
+ return -EINVAL;
+
+ for (block = first_block; block < first_block + blocks_per_sector;
+ block++) {
printf("Reading block %u: ", block);
ret = rfid_protocol_read(ph, block, buf, &len);
- if(ret == -ETIMEDOUT)
+ if (ret == -ETIMEDOUT)
fprintf(stderr, "TIMEOUT\n");
if (ret < 0) {
printf("Error %d reading\n", ret);
return 0;
}
+static int
+mifare_classic_dump(struct rfid_protocol_handle *ph)
+{
+ unsigned int size;
+ unsigned int size_len = sizeof(size);
+ int sector, num_sectors;
+
+ if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE,
+ &size, &size_len) == 0) {
+ printf("Size: %u bytes\n", size);
+ } else {
+ printf("Size: unknown ?!?\n");
+ return -EINVAL;
+ }
+
+ switch (size) {
+ case 320:
+ num_sectors = 5;
+ break;
+ case 1024:
+ num_sectors = 16;
+ break;
+ case 4096:
+ num_sectors = 40;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ for (sector = 0; sector < num_sectors; sector++) {
+ int rc;
+
+ printf("Authenticating sector %u: ", sector);
+ fflush(stdout);
+
+ rc = mfcl_set_key(ph, MIFARE_CL_KEYA_DEFAULT_INFINEON);
+ if (rc < 0) {
+ printf("key format error\n");
+ exit(1);
+ }
+
+ rc = mfcl_auth(ph, RFID_CMD_MIFARE_AUTH1A,
+ mfcl_sector2block(sector));
+ if (rc < 0) {
+ printf("mifare auth error\n");
+ exit(1);
+ } else
+ printf("mifare auth succeeded!\n");
+
+ mifare_classic_read_sector(ph, sector);
+ }
+}
+
+void
+iso15693_write(struct rfid_reader_handle *rh,int layer2,int sector,
+ unsigned char *data, unsigned int len)
+{
+ int rc;
+ unsigned char uid_buf[16];
+ unsigned int uid_len = sizeof(uid_buf);
+
+ if (rh->reader->l2_supported & (1 << layer2)) {
+ l2h = rfid_layer2_init(rh, layer2);
+ if (!l2h) {
+ printf("error during layer2(%d)_init (0=14a,1=14b,3=15)\n",layer2);
+ return;
+ }
+ printf("Layer2 init ok\n");
+ rc = rfid_layer2_open(l2h);
+ if (rc>0){
+ rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf, &uid_len);
+ printf("Layer 2 success (%s)[%d]: '%s'\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
+ rc = iso15693_write_block(l2h,sector,data,len);
+ printf("write>>rc: %d\n",rc);
+
+ }else {
+ printf("error during layer2_open\n");
+ return ;
+ }
+ rfid_layer2_close(l2h);
+ rfid_layer2_fini(l2h);
+ }
+}
+
+void iso15693_dump(struct rfid_reader_handle *rh,int layer2,int sector){
+ unsigned int size;
+ unsigned int size_len = sizeof(size);
+ unsigned char buf[1024];
+ int rc,i;
+ unsigned char uid_buf[16], block_sec;
+ unsigned int uid_len = sizeof(uid_buf);
+
+
+ if (rh->reader->l2_supported & (1 << layer2)) {
+ l2h = rfid_layer2_init(rh, layer2);
+ if (!l2h) {
+ printf("error during layer2(%d)_init (0=14a,1=14b,3=15)\n",layer2);
+ return;
+ }
+ printf("Layer2 init ok\n");
+ rc = rfid_layer2_open(l2h);
+ if (rc>0){
+ rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf, &uid_len);
+ printf("Layer 2 success (%s)[%d]: '%s'\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
+
+ if (sector < 0){
+ if (sector<=-3)
+ iso15693_select(l2h);
+ for(i=0;i<=255;i++){
+ rc = iso15693_read_block(l2h,i,buf,sizeof(buf),&block_sec);
+ if (rc>=0)
+ printf("block[%3d:%02x]sec:0x%0x data(%d): %s\n",i,i,block_sec,rc,hexdump(buf,rc));
+ else{
+ printf("no data(read_block(%d)>> %d)\n",i,rc);
+ if ((sector == -1)||(sector == -3))
+ break;
+ }
+ }
+ }else{
+ if (sector>255)
+ sector=255;
+ rc = iso15693_read_block(l2h,sector,buf,sizeof(buf));
+ if (rc>=0)
+ printf("block[%d]data(%d): %s\n",i,rc,hexdump(buf,rc));
+ else
+ printf("no data(read_block(%d)>> %d)\n",i,rc);
+ }
+ } else {
+ printf("error during layer2_open\n");
+ return ;
+ }
+ rfid_layer2_close(l2h);
+ rfid_layer2_fini(l2h);
+ }
+}
+
static char *proto_names[] = {
[RFID_PROTOCOL_TCL] = "tcl",
[RFID_PROTOCOL_MIFARE_UL] = "mifare-ultralight",
int rc;
unsigned int size;
unsigned int size_len = sizeof(size);
+ char *data;
+ unsigned int data_len;
if (first) {
- rh->reader->rf_power(rh, 0);
+ unsigned int opt;
+ unsigned int optlen = sizeof(opt);
+
+ /* turn off RF */
+ opt = 1;
+ rfid_reader_setopt(rh, RFID_OPT_RDR_RF_KILL, &opt, optlen);
+
usleep(10*1000);
- rh->reader->rf_power(rh, 1);
+
+ /* turn on RF */
+ opt = 0;
+ rfid_reader_setopt(rh, RFID_OPT_RDR_RF_KILL, &opt, optlen);
}
printf("scanning for RFID token...\n");
rc = rfid_scan(rh, &l2h, &ph);
if (rc >= 3) {
printf("Protocol success (%s)\n", rfid_protocol_name(ph));
- if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE,
+ if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE,
&size, &size_len) == 0)
printf("Size: %u bytes\n", size);
+ size_len = sizeof(size);
+ size = 0;
+ if (rfid_protocol_getopt(ph, RFID_OPT_P_TCL_ATS_LEN,
+ &size, &size_len) == 0) {
+ data_len = size + 1;
+ data = malloc(data_len);
+ if (data) {
+ if (rfid_protocol_getopt(ph, RFID_OPT_P_TCL_ATS,
+ data, &data_len) == 0) {
+ printf("Got ATS of %u bytes: %s\n", size,
+ hexdump(data, data_len));
+ }
+ }
+ }
}
return rc;
if (rh->reader->l2_supported & (1 << layer2)) {
l2h = rfid_layer2_init(rh, layer2);
+ if (!l2h) {
+ printf("error during layer2(%s)_init\n",
+ l2_names[layer2]);
+ return;
+ }
+ printf("Layer2 init ok\n");
rc = rfid_layer2_open(l2h);
} else {
printf("error during layer2_open\n");
if (l2h) {
uid_len = sizeof(uid_buf);
rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf, &uid_len);
- printf("Layer 2 success (%s)[%d]: %s\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
+ printf("Layer 2 success (%s)[%d]: '%s'\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
}
/*
}
}
+static void do_enum_loop(int layer2, unsigned int delay)
+{
+ while (1) {
+ do_enum(layer2);
+ {
+ unsigned int opt;
+ unsigned int optlen = sizeof(opt);
+
+ /* turn off RF */
+ opt = 1;
+ rfid_reader_setopt(rh, RFID_OPT_RDR_RF_KILL, &opt, optlen);
+
+ usleep(10 * 1000);
+
+ /* turn on RF */
+ opt = 0;
+ rfid_reader_setopt(rh, RFID_OPT_RDR_RF_KILL, &opt, optlen);
+ }
+ usleep(delay * 1000);
+ printf("--- next run ---\n");
+ }
+}
+
#define OPTION_OFFSET 256
static struct option original_opts[] = {
{ "scan-loop", 0, 0, 'S' },
{ "dump", 0, 0, 'd' },
{ "enum", 0, 0, 'e' },
+ { "read", 1, 0, 'r' },
+ { "write", 1, 0, 'w'},
+ { "enum-loop", 1, 0, 'E' },
{0, 0, 0, 0}
};
static void help(void)
{
printf( " -s --scan scan until first RFID tag is found\n"
- " -S --scan-loop endless scanning loop\n"
- " -p --protocol {tcl,mifare-ultralight,mifare-classic,tagit}\n"
- " -l --layer2 {iso14443a,iso14443b,iso15693}\n"
+ " -S --scan-loop endless scanning loop\n"
+ " -p --protocol {tcl,mifare-ultralight,mifare-classic,tagit,icode}\n"
+ " -l --layer2 {iso14443a,iso14443b,iso15693,icode1}\n"
" -d --dump dump rc632 registers\n"
- " -e --enum enumerate all tag's in field (iso14443a)\n"
+ " -e --enum enumerate all tag's in field \n"
+ " -E --enum-loop <delay> (ms) enumerate endless\n"
+ " -r --read <secror> read iso15693 sector \n\t\t\t(-1:0-255 stop on error, -2: 0-255 no stop)\n"
+ " -w --write <sector> write to iso15693 sector data: 01:02:03:04\n"
" -h --help\n");
}
#else /*__MINGW32__*/
program_name = basename(argv[0]);
#endif/*__MINGW32__*/
-
+
printf("%s - (C) 2005-2008 by Harald Welte\n"
"This program is Free Software and has "
"ABSOLUTELY NO WARRANTY\n\n", program_name);
while (1) {
int c, option_index = 0;
- c = getopt_long(argc, argv, "hp:l:sSde", opts, &option_index);
+ c = getopt_long(argc, argv, "hp:l:sSdeE:r:w:", opts, &option_index);
if (c == -1)
break;
switch (c) {
+ case 'w':
+ //hexread(key, optarg, strlen(optarg));
+ i = strtol(optarg, NULL, 10);
+ if (reader_init() < 0)
+ exit(1);
+ layer2 = RFID_LAYER2_ISO15693;
+ iso15693_write(rh,layer2,i,"\x1\x2\x3\x4",4);
+ rfid_reader_close(rh);
+ exit(0);
+ break;
+ case 'r':
+ i = strtol(optarg, NULL, 10);
+ if (reader_init() < 0)
+ exit(1);
+ //if (layer2 < 0)
+ layer2 = RFID_LAYER2_ISO15693;
+ iso15693_dump(rh,layer2,i);
+ rfid_reader_close(rh);
+ exit(0);
+ break;
+ case 'E':
+ i = strtol(optarg, NULL, 10);
+
+ if (reader_init() < 0)
+ exit(1);
+ if (layer2<0)
+ layer2 = RFID_LAYER2_ISO14443A;
+
+ do_enum_loop(layer2, i>1? i : 500);
+ rfid_reader_close(rh);
+ exit(0);
+ break;
case 'e':
if (reader_init() < 0)
exit(1);
- layer2 = RFID_LAYER2_ISO14443A;
+ if (layer2 < 0)
+ layer2 = RFID_LAYER2_ISO14443A;
do_enum(layer2);
+ rfid_reader_close(rh);
exit(0);
break;
case 'd':
if (reader_init() < 0)
exit(1);
do_regdump();
+ rfid_reader_close(rh);
break;
case 's':
if (reader_init() < 0)
exit(1);
do_scan(0);
+ rfid_reader_close(rh);
exit(0);
break;
case 'S':
case 'p':
protocol = proto_by_name(optarg);
if (protocol < 0) {
- fprintf(stderr, "unknown protocol `%s'\n",
+ fprintf(stderr, "unknown protocol `%s'\n",
optarg);
exit(2);
}
exit(2);
}
break;
+ default:
+ printf("unknown cmd: %c\n",c);
case 'h':
help();
exit(0);
break;
+ case '?':
+ exit(0);
}
}
fprintf(stderr, "you have to specify --layer2\n");
exit(2);
}
-
+
if (reader_init() < 0)
exit(1);
break;
case RFID_PROTOCOL_MIFARE_CLASSIC:
printf("Protocol Mifare Classic\n");
- {
- int sector;
- for (sector = 0; sector < 31; sector++) {
- printf("Authenticating sector %u: ", sector);
- fflush(stdout);
- rc = mfcl_set_key(ph, MIFARE_CL_KEYA_DEFAULT_INFINEON);
- if (rc < 0) {
- printf("key format error\n");
- exit(1);
- }
- rc = mfcl_auth(ph, RFID_CMD_MIFARE_AUTH1A, sector*4);
- if (rc < 0) {
- printf("mifare auth error\n");
- exit(1);
- } else
- printf("mifare auth succeeded!\n");
-
- mifare_classic_read_sector(ph, sector);
- }
- }
+ mifare_classic_dump(ph);
break;
default:
printf("unknown protocol %u\n", protocol);
}
rfid_reader_close(rh);
-
+
exit(0);
}