From 544071c0f971da2826fdbf339a12383f9f3200ef Mon Sep 17 00:00:00 2001 From: laforge Date: Sat, 24 May 2008 13:41:16 +0000 Subject: Add WRITE support for ISO15693 (Bjoern Riemer) git-svn-id: https://svn.gnumonks.org/trunk/librfid@2106 e0336214-984f-0b4b-a45f-81c69e1f0ede --- utils/librfid-tool.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 118 insertions(+), 11 deletions(-) (limited to 'utils') diff --git a/utils/librfid-tool.c b/utils/librfid-tool.c index c8b59ea..3651e5d 100644 --- a/utils/librfid-tool.c +++ b/utils/librfid-tool.c @@ -3,7 +3,7 @@ * (C) 2005-2008 by Harald Welte * * 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, @@ -132,7 +132,7 @@ iso7816_read_binary(unsigned char *buf, unsigned int *len) 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); @@ -241,7 +241,7 @@ mifare_classic_dump(struct rfid_protocol_handle *ph) unsigned int size_len = sizeof(size); int sector, num_sectors; - 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); } else { @@ -280,13 +280,96 @@ mifare_classic_dump(struct rfid_protocol_handle *ph) if (rc < 0) { printf("mifare auth error\n"); exit(1); - } else + } 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,rfid_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,rfid_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", @@ -363,7 +446,7 @@ static int do_scan(int first) 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); @@ -527,6 +610,8 @@ 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} }; @@ -599,12 +684,14 @@ void register_module(struct rfidtool_module *me) static void help(void) { printf( " -s --scan scan until first RFID tag is found\n" - " -S --scan-loop endless scanning loop\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 \n" " -E --enum-loop (ms) enumerate endless\n" + " -r --read read iso15693 sector \n\t\t\t(-1:0-255 stop on error, -2: 0-255 no stop)\n" + " -w --write write to iso15693 sector data: 01:02:03:04\n" " -h --help\n"); } @@ -619,7 +706,7 @@ int main(int argc, char **argv) #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); @@ -629,11 +716,31 @@ int main(int argc, char **argv) while (1) { int c, option_index = 0; - c = getopt_long(argc, argv, "hp:l:sSdeE:", 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); @@ -677,7 +784,7 @@ int main(int argc, char **argv) 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); } @@ -715,7 +822,7 @@ int main(int argc, char **argv) fprintf(stderr, "you have to specify --layer2\n"); exit(2); } - + if (reader_init() < 0) exit(1); @@ -805,6 +912,6 @@ int main(int argc, char **argv) } rfid_reader_close(rh); - + exit(0); } -- cgit v1.2.3