summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/Makefile.am6
-rw-r--r--utils/librfid-tool.c111
2 files changed, 83 insertions, 34 deletions
diff --git a/utils/Makefile.am b/utils/Makefile.am
index fff8e6a..0ff9b24 100644
--- a/utils/Makefile.am
+++ b/utils/Makefile.am
@@ -2,7 +2,7 @@ INCLUDES = $(all_includes) -I$(top_srcdir)/include
bin_PROGRAMS = librfid-tool
-openct_escape_SOURCES = librfid-tool.c
-openct_escape_LDADD = ../src/librfid.la
-openct_escape_LDFLAGS = -dynamic
+librfid_tool_SOURCES = librfid-tool.c
+librfid_tool_LDADD = ../src/librfid.la
+librfid_tool_LDFLAGS = -dynamic
diff --git a/utils/librfid-tool.c b/utils/librfid-tool.c
index 3c0de34..e151e45 100644
--- a/utils/librfid-tool.c
+++ b/utils/librfid-tool.c
@@ -18,6 +18,9 @@
#include <stdlib.h>
#include <string.h>
+#define _GNU_SOURCE
+#include <getopt.h>
+
#include <librfid/rfid.h>
#include <librfid/rfid_reader.h>
#include <librfid/rfid_layer2.h>
@@ -26,6 +29,8 @@
#include <librfid/rfid_protocol_mifare_classic.h>
#include <librfid/rfid_protocol_mifare_ul.h>
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
static const char *
hexdump(const void *data, unsigned int len)
{
@@ -277,46 +282,73 @@ mifare_classic_read_sector(struct rfid_protocol_handle *ph, int sector)
return 0;
}
+static char *proto_names[] = {
+ [RFID_PROTOCOL_TCL] = "tcl",
+ [RFID_PROTOCOL_MIFARE_UL] = "mifare-ultralight",
+ [RFID_PROTOCOL_MIFARE_CLASSIC] = "mifare-classic",
+};
+
+static int proto_by_name(const char *name)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
+ if (proto_names[i] == NULL)
+ continue;
+ if (!strcasecmp(name, proto_names[i]))
+ return i;
+ }
+ return -1;
+}
+
+static void help(void)
+{
+ printf(" -p --protocol {tcl,mifare-ultralight,mifare-classic}\n");
+}
+
+static struct option opts[] = {
+ { "help", 0, 0, 'h' },
+ { "protocol", 1, 0, 'p' },
+ {0, 0, 0, 0}
+};
int main(int argc, char **argv)
{
int rc;
char buf[0x40];
- int i, protocol;
+ int i, protocol = -1;
+
+ printf("librfid_tool - (C) 2006 by Harald Welte\n"
+ "This program is Free Software and has ABSOLUTELY NO WARRANTY\n\n");
-#if 0
- if (argc) {
- argc--;
- argv++;
- }
-
- while (argc) {
- if ( !strcmp (*argv, "--list")) {
- char *p;
- p = ccid_get_reader_list ();
- if (!p)
- return 1;
- fputs (p, stderr);
- free (p);
- return 0;
- }
- else if ( !strcmp (*argv, "--debug")) {
- ccid_set_debug_level (ccid_set_debug_level (-1) + 1);
- argc--; argv++;
- }
- else
- break;
- }
-#endif
+ while (1) {
+ int c, option_index = 0;
+ c = getopt_long(argc, argv, "hp:", opts, &option_index);
+ if (c == -1)
+ break;
- if (init() < 0)
- exit(1);
+ switch (c) {
+ case 'p':
+ protocol = proto_by_name(optarg);
+ if (protocol < 0) {
+ fprintf(stderr, "unknown protocol `%s'\n", optarg);
+ exit(2);
+ }
+ break;
+ case 'h':
+ help();
+ exit(0);
+ break;
+ }
+ }
- //while(1) { }
+ if (protocol < 0) {
+ fprintf(stderr, "you have to specify --protocol\n");
+ exit(2);
+ }
- //protocol = RFID_PROTOCOL_MIFARE_UL;
- //protocol = RFID_PROTOCOL_MIFARE_CLASSIC;
- protocol = RFID_PROTOCOL_TCL;
+ if (init() < 0)
+ exit(1);
if (l3(protocol) < 0)
exit(1);
@@ -326,14 +358,25 @@ int main(int argc, char **argv)
int len = 200;
case RFID_PROTOCOL_TCL:
+ printf("Protocol T=CL\n");
/* we've established T=CL at this point */
+ printf("selecting Master File\n");
select_mf();
+ printf("Getting random challenge, length 255\n");
+ iso7816_get_challenge(0xff);
+
+ printf("selecting Passport application\n");
iso7816_select_application();
+
+ printf("selecting EF 0x1e\n");
iso7816_select_ef(0x011e);
+
+ printf("selecting EF 0x01\n");
iso7816_select_ef(0x0101);
while (1) {
+ printf("reading EF1\n");
len = 200;
printf("reading ef\n");
iso7816_read_binary(buf, &len);
@@ -344,6 +387,7 @@ int main(int argc, char **argv)
#endif
break;
case RFID_PROTOCOL_MIFARE_UL:
+ printf("Protocol Mifare Ultralight\n");
mifare_ulight_read(ph);
#if 0
mifare_ulight_blank(ph);
@@ -352,6 +396,7 @@ int main(int argc, char **argv)
#endif
break;
case RFID_PROTOCOL_MIFARE_CLASSIC:
+ printf("Protocol Mifare Classic\n");
{
int sector;
for (sector = 1; sector < 31; sector++) {
@@ -371,6 +416,10 @@ int main(int argc, char **argv)
}
}
break;
+ default:
+ printf("unknown protocol\n");
+ exit(1);
+ break;
}
rfid_reader_close(rh);
personal git repositories of Harald Welte. Your mileage may vary