bla
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
INCLUDES = $(all_includes) -I$(top_srcdir)/include
|
||||
|
||||
if ENABLE_FIRMWARE
|
||||
else
|
||||
bin_PROGRAMS = librfid-tool mifare-tool librfid-send_script
|
||||
|
||||
noinst_HEADERS = librfid-tool.h
|
||||
|
||||
librfid_tool_SOURCES = librfid-tool.c common.c
|
||||
librfid_tool_LDADD = ../src/librfid.la
|
||||
|
||||
librfid_send_script_SOURCES= send_script.c
|
||||
librfid_send_script_LDADD = ../src/librfid.la
|
||||
|
||||
mifare_tool_SOURCES = mifare-tool.c common.c
|
||||
mifare_tool_LDADD = ../src/librfid.la
|
||||
|
||||
if ENABLE_WIN32
|
||||
LINKOPTS = -dynamic -mno-cygwin
|
||||
librfid_send_script_LDFLAGS = $(LINKOPTS)
|
||||
librfid_tool_LDFLAGS = $(LINKOPTS)
|
||||
mifare_tool_LDFLAGS = $(LINKOPTS)
|
||||
endif
|
||||
|
||||
endif
|
||||
@@ -0,0 +1,563 @@
|
||||
# Makefile.in generated by automake 1.11 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
||||
# Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
@ENABLE_FIRMWARE_FALSE@bin_PROGRAMS = librfid-tool$(EXEEXT) \
|
||||
@ENABLE_FIRMWARE_FALSE@ mifare-tool$(EXEEXT) \
|
||||
@ENABLE_FIRMWARE_FALSE@ librfid-send_script$(EXEEXT)
|
||||
subdir = utils
|
||||
DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__installdirs = "$(DESTDIR)$(bindir)"
|
||||
PROGRAMS = $(bin_PROGRAMS)
|
||||
am__librfid_send_script_SOURCES_DIST = send_script.c
|
||||
@ENABLE_FIRMWARE_FALSE@am_librfid_send_script_OBJECTS = \
|
||||
@ENABLE_FIRMWARE_FALSE@ send_script.$(OBJEXT)
|
||||
librfid_send_script_OBJECTS = $(am_librfid_send_script_OBJECTS)
|
||||
@ENABLE_FIRMWARE_FALSE@librfid_send_script_DEPENDENCIES = \
|
||||
@ENABLE_FIRMWARE_FALSE@ ../src/librfid.la
|
||||
librfid_send_script_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(librfid_send_script_LDFLAGS) $(LDFLAGS) -o $@
|
||||
am__librfid_tool_SOURCES_DIST = librfid-tool.c common.c
|
||||
@ENABLE_FIRMWARE_FALSE@am_librfid_tool_OBJECTS = \
|
||||
@ENABLE_FIRMWARE_FALSE@ librfid-tool.$(OBJEXT) common.$(OBJEXT)
|
||||
librfid_tool_OBJECTS = $(am_librfid_tool_OBJECTS)
|
||||
@ENABLE_FIRMWARE_FALSE@librfid_tool_DEPENDENCIES = ../src/librfid.la
|
||||
librfid_tool_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(librfid_tool_LDFLAGS) $(LDFLAGS) -o $@
|
||||
am__mifare_tool_SOURCES_DIST = mifare-tool.c common.c
|
||||
@ENABLE_FIRMWARE_FALSE@am_mifare_tool_OBJECTS = mifare-tool.$(OBJEXT) \
|
||||
@ENABLE_FIRMWARE_FALSE@ common.$(OBJEXT)
|
||||
mifare_tool_OBJECTS = $(am_mifare_tool_OBJECTS)
|
||||
@ENABLE_FIRMWARE_FALSE@mifare_tool_DEPENDENCIES = ../src/librfid.la
|
||||
mifare_tool_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(mifare_tool_LDFLAGS) $(LDFLAGS) -o $@
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
SOURCES = $(librfid_send_script_SOURCES) $(librfid_tool_SOURCES) \
|
||||
$(mifare_tool_SOURCES)
|
||||
DIST_SOURCES = $(am__librfid_send_script_SOURCES_DIST) \
|
||||
$(am__librfid_tool_SOURCES_DIST) \
|
||||
$(am__mifare_tool_SOURCES_DIST)
|
||||
am__noinst_HEADERS_DIST = librfid-tool.h
|
||||
HEADERS = $(noinst_HEADERS)
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
BUILDENV = @BUILDENV@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
FIRMWARE_PATH = @FIRMWARE_PATH@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OPENCT_CFLAGS = @OPENCT_CFLAGS@
|
||||
OPENCT_LIBS = @OPENCT_LIBS@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
to_host_path_cmd = @to_host_path_cmd@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
INCLUDES = $(all_includes) -I$(top_srcdir)/include
|
||||
@ENABLE_FIRMWARE_FALSE@noinst_HEADERS = librfid-tool.h
|
||||
@ENABLE_FIRMWARE_FALSE@librfid_tool_SOURCES = librfid-tool.c common.c
|
||||
@ENABLE_FIRMWARE_FALSE@librfid_tool_LDADD = ../src/librfid.la
|
||||
@ENABLE_FIRMWARE_FALSE@librfid_send_script_SOURCES = send_script.c
|
||||
@ENABLE_FIRMWARE_FALSE@librfid_send_script_LDADD = ../src/librfid.la
|
||||
@ENABLE_FIRMWARE_FALSE@mifare_tool_SOURCES = mifare-tool.c common.c
|
||||
@ENABLE_FIRMWARE_FALSE@mifare_tool_LDADD = ../src/librfid.la
|
||||
@ENABLE_FIRMWARE_FALSE@@ENABLE_WIN32_TRUE@LINKOPTS = -dynamic -mno-cygwin
|
||||
@ENABLE_FIRMWARE_FALSE@@ENABLE_WIN32_TRUE@librfid_send_script_LDFLAGS = $(LINKOPTS)
|
||||
@ENABLE_FIRMWARE_FALSE@@ENABLE_WIN32_TRUE@librfid_tool_LDFLAGS = $(LINKOPTS)
|
||||
@ENABLE_FIRMWARE_FALSE@@ENABLE_WIN32_TRUE@mifare_tool_LDFLAGS = $(LINKOPTS)
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu utils/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
|
||||
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed 's/$(EXEEXT)$$//' | \
|
||||
while read p p1; do if test -f $$p || test -f $$p1; \
|
||||
then echo "$$p"; echo "$$p"; else :; fi; \
|
||||
done | \
|
||||
sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
|
||||
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
||||
sed 'N;N;N;s,\n, ,g' | \
|
||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||
if ($$2 == $$4) files[d] = files[d] " " $$1; \
|
||||
else { print "f", $$3 "/" $$4, $$1; } } \
|
||||
END { for (d in files) print "f", d, files[d] }' | \
|
||||
while read type dir files; do \
|
||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||
test -z "$$files" || { \
|
||||
echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
|
||||
$(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
|
||||
} \
|
||||
; done
|
||||
|
||||
uninstall-binPROGRAMS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
||||
-e 's/$$/$(EXEEXT)/' `; \
|
||||
test -n "$$list" || exit 0; \
|
||||
echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
|
||||
cd "$(DESTDIR)$(bindir)" && rm -f $$files
|
||||
|
||||
clean-binPROGRAMS:
|
||||
@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
|
||||
echo " rm -f" $$list; \
|
||||
rm -f $$list || exit $$?; \
|
||||
test -n "$(EXEEXT)" || exit 0; \
|
||||
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
|
||||
echo " rm -f" $$list; \
|
||||
rm -f $$list
|
||||
librfid-send_script$(EXEEXT): $(librfid_send_script_OBJECTS) $(librfid_send_script_DEPENDENCIES)
|
||||
@rm -f librfid-send_script$(EXEEXT)
|
||||
$(librfid_send_script_LINK) $(librfid_send_script_OBJECTS) $(librfid_send_script_LDADD) $(LIBS)
|
||||
librfid-tool$(EXEEXT): $(librfid_tool_OBJECTS) $(librfid_tool_DEPENDENCIES)
|
||||
@rm -f librfid-tool$(EXEEXT)
|
||||
$(librfid_tool_LINK) $(librfid_tool_OBJECTS) $(librfid_tool_LDADD) $(LIBS)
|
||||
mifare-tool$(EXEEXT): $(mifare_tool_OBJECTS) $(mifare_tool_DEPENDENCIES)
|
||||
@rm -f mifare-tool$(EXEEXT)
|
||||
$(mifare_tool_LINK) $(mifare_tool_OBJECTS) $(mifare_tool_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfid-tool.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mifare-tool.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/send_script.Po@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
mkid -fID $$unique
|
||||
tags: TAGS
|
||||
|
||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(PROGRAMS) $(HEADERS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(bindir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
`test -z '$(STRIP)' || \
|
||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am: install-binPROGRAMS
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-binPROGRAMS
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
|
||||
clean-generic clean-libtool ctags distclean distclean-compile \
|
||||
distclean-generic distclean-libtool distclean-tags distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-binPROGRAMS install-data install-data-am install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
|
||||
pdf pdf-am ps ps-am tags uninstall uninstall-am \
|
||||
uninstall-binPROGRAMS
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
@@ -0,0 +1,125 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
//#include <libgen.h>
|
||||
|
||||
#include <librfid/rfid.h>
|
||||
#include <librfid/rfid_scan.h>
|
||||
#include <librfid/rfid_reader.h>
|
||||
#include <librfid/rfid_layer2.h>
|
||||
#include <librfid/rfid_protocol.h>
|
||||
|
||||
#include <librfid/rfid_protocol_mifare_classic.h>
|
||||
#include <librfid/rfid_protocol_mifare_ul.h>
|
||||
|
||||
#include "librfid-tool.h"
|
||||
#include "common.h"
|
||||
|
||||
const char *
|
||||
hexdump(const void *data, unsigned int len)
|
||||
{
|
||||
static char string[1024];
|
||||
unsigned char *d = (unsigned char *) data;
|
||||
unsigned int i, left;
|
||||
|
||||
string[0] = '\0';
|
||||
left = sizeof(string);
|
||||
for (i = 0; len--; i += 3) {
|
||||
if (i >= sizeof(string) -4)
|
||||
break;
|
||||
snprintf(string+i, 4, " %02x", *d++);
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
static char parse_hexdigit(const char hexdigit)
|
||||
{
|
||||
if (hexdigit <= '9' && hexdigit >= '0')
|
||||
return hexdigit - '0';
|
||||
if (hexdigit <= 'f' && hexdigit >= 'a')
|
||||
return 10 + (hexdigit - 'a');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
hexread(unsigned char *result, const unsigned char *in, unsigned int len)
|
||||
{
|
||||
const unsigned char *pos;
|
||||
char dig1, dig2;
|
||||
unsigned char *res = result;
|
||||
|
||||
for (pos = in; pos-in <= len-2; pos+=2) {
|
||||
if (*pos == ':') {
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
dig1 = *pos;
|
||||
dig2 = *(pos+1);
|
||||
|
||||
*res++ = parse_hexdigit(dig1) << 4 | parse_hexdigit(dig2);
|
||||
}
|
||||
|
||||
return (res - result);
|
||||
}
|
||||
|
||||
struct rfid_reader_handle *rh;
|
||||
struct rfid_layer2_handle *l2h;
|
||||
struct rfid_protocol_handle *ph;
|
||||
|
||||
int reader_init(void)
|
||||
{
|
||||
printf("opening reader handle\n");
|
||||
rh = rfid_reader_open(NULL, RFID_READER_CM5121);
|
||||
if (!rh) {
|
||||
fprintf(stderr, "No Omnikey Cardman 5121 found\n");
|
||||
rh = rfid_reader_open(NULL, RFID_READER_OPENPCD);
|
||||
if (!rh) {
|
||||
fprintf(stderr, "No OpenPCD found either\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int l2_init(int layer2)
|
||||
{
|
||||
int rc;
|
||||
|
||||
printf("opening layer2 handle\n");
|
||||
l2h = rfid_layer2_init(rh, layer2);
|
||||
if (!l2h) {
|
||||
fprintf(stderr, "error during iso14443a_init\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("running layer2 anticol\n");
|
||||
rc = rfid_layer2_open(l2h);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "error during layer2_open\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int l3_init(int protocol)
|
||||
{
|
||||
printf("running layer3 (ats)\n");
|
||||
ph = rfid_protocol_init(l2h, protocol);
|
||||
if (!ph) {
|
||||
fprintf(stderr, "error during protocol_init\n");
|
||||
return -1;
|
||||
}
|
||||
if (rfid_protocol_open(ph) < 0) {
|
||||
fprintf(stderr, "error during protocol_open\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("we now have layer3 up and running\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#ifndef __COMMON_H__
|
||||
#define __COMMON_H__
|
||||
|
||||
extern const char * hexdump(const void *data, unsigned int len);
|
||||
extern int hexread(unsigned char *result, const unsigned char *in, unsigned int len);
|
||||
|
||||
#endif/*__COMMON_H__*/
|
||||
@@ -0,0 +1,552 @@
|
||||
/* librfid-tool - a small command-line tool for librfid testing
|
||||
*
|
||||
* (C) 2005-2006 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
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
/*#include <libgen.h>*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <getopt.h>
|
||||
|
||||
#include <librfid/rfid.h>
|
||||
#include <librfid/rfid_scan.h>
|
||||
#include <librfid/rfid_reader.h>
|
||||
#include <librfid/rfid_layer2.h>
|
||||
#include <librfid/rfid_protocol.h>
|
||||
|
||||
#include <librfid/rfid_protocol_mifare_classic.h>
|
||||
#include <librfid/rfid_protocol_mifare_ul.h>
|
||||
|
||||
#include "librfid-tool.h"
|
||||
|
||||
|
||||
static int select_mf(void)
|
||||
{
|
||||
unsigned char cmd[] = { 0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00, 0x00 };
|
||||
unsigned char ret[256];
|
||||
unsigned int rlen = sizeof(ret);
|
||||
|
||||
int rv;
|
||||
|
||||
rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
printf("%d: [%s]\n", rlen, hexdump(ret, rlen));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int iso7816_get_challenge(unsigned char len)
|
||||
{
|
||||
unsigned char cmd[] = { 0x00, 0x84, 0x00, 0x00, 0x08 };
|
||||
unsigned char ret[256];
|
||||
unsigned int rlen = sizeof(ret);
|
||||
|
||||
cmd[4] = len;
|
||||
|
||||
int rv;
|
||||
|
||||
rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), ret, &rlen, 0, 0);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
printf("%d: [%s]\n", rlen, hexdump(ret, rlen));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
iso7816_select_application(void)
|
||||
{
|
||||
unsigned char cmd[] = { 0x00, 0xa4, 0x04, 0x0c, 0x07,
|
||||
0xa0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01 };
|
||||
unsigned char resp[7];
|
||||
unsigned int rlen = sizeof(resp);
|
||||
|
||||
int rv;
|
||||
|
||||
rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
/* FIXME: parse response */
|
||||
printf("%s\n", hexdump(resp, rlen));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
iso7816_select_ef(u_int16_t fid)
|
||||
{
|
||||
unsigned char cmd[7] = { 0x00, 0xa4, 0x02, 0x0c, 0x02, 0x00, 0x00 };
|
||||
unsigned char resp[7];
|
||||
unsigned int rlen = sizeof(resp);
|
||||
|
||||
int rv;
|
||||
|
||||
cmd[5] = (fid >> 8) & 0xff;
|
||||
cmd[6] = fid & 0xff;
|
||||
|
||||
rv = rfid_protocol_transceive(ph, cmd, sizeof(cmd), resp, &rlen, 0, 0);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
/* FIXME: parse response */
|
||||
printf("%s\n", hexdump(resp, rlen));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
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);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
printf("%s\n", hexdump(resp, rlen));
|
||||
|
||||
/* FIXME: parse response, determine whether we need additional reads */
|
||||
|
||||
/* FIXME: copy 'len' number of response bytes to 'buf' */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* wrapper function around SELECT EF and READ BINARY */
|
||||
int
|
||||
iso7816_read_ef(u_int16_t fid, unsigned char *buf, unsigned int *len)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = iso7816_select_ef(fid);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
return iso7816_read_binary(buf, len);
|
||||
}
|
||||
|
||||
/* mifare ultralight helpers */
|
||||
int
|
||||
mifare_ulight_write(struct rfid_protocol_handle *ph)
|
||||
{
|
||||
unsigned char buf[4] = { 0xa1, 0xa2, 0xa3, 0xa4 };
|
||||
|
||||
return rfid_protocol_write(ph, 10, buf, 4);
|
||||
}
|
||||
|
||||
int
|
||||
mifare_ulight_blank(struct rfid_protocol_handle *ph)
|
||||
{
|
||||
unsigned char buf[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||
int i, ret;
|
||||
|
||||
for (i = 4; i <= MIFARE_UL_PAGE_MAX; i++) {
|
||||
ret = rfid_protocol_write(ph, i, buf, 4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
mifare_ulight_read(struct rfid_protocol_handle *ph)
|
||||
{
|
||||
unsigned char buf[20];
|
||||
unsigned int len = sizeof(buf);
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= MIFARE_UL_PAGE_MAX; i++) {
|
||||
ret = rfid_protocol_read(ph, i, buf, &len);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
printf("Page 0x%x: %s\n", i, hexdump(buf, 4));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* mifare classic helpers */
|
||||
static int
|
||||
mifare_classic_read_sector(struct rfid_protocol_handle *ph, int sector)
|
||||
{
|
||||
unsigned char buf[20];
|
||||
unsigned int len = sizeof(buf);
|
||||
int ret;
|
||||
int block;
|
||||
|
||||
/* FIXME: make this work for sectors > 31 */
|
||||
printf("Reading sector %u\n", sector);
|
||||
|
||||
for (block = sector*4; block < sector*4+4; block++) {
|
||||
printf("Reading block %u: ", block);
|
||||
ret = rfid_protocol_read(ph, block, buf, &len);
|
||||
if(ret == -ETIMEDOUT)
|
||||
fprintf(stderr, "TIMEOUT\n");
|
||||
if (ret < 0) {
|
||||
printf("Error %d reading\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
printf("Page 0x%x: %s\n", block, hexdump(buf, len));
|
||||
}
|
||||
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 char *l2_names[] = {
|
||||
[RFID_LAYER2_ISO14443A] = "iso14443a",
|
||||
[RFID_LAYER2_ISO14443B] = "iso14443b",
|
||||
[RFID_LAYER2_ISO15693] = "iso15693",
|
||||
};
|
||||
|
||||
static int l2_by_name(const char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(l2_names); i++) {
|
||||
if (l2_names[i] == NULL)
|
||||
continue;
|
||||
if (!strcasecmp(name, l2_names[i]))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void do_scan(void)
|
||||
{
|
||||
int rc;
|
||||
unsigned int size;
|
||||
unsigned int size_len = sizeof(size);
|
||||
|
||||
printf("scanning for RFID token...\n");
|
||||
rc = rfid_scan(rh, &l2h, &ph);
|
||||
if (rc >= 2) {
|
||||
unsigned char uid_buf[16];
|
||||
unsigned int uid_len = sizeof(uid_buf);
|
||||
rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf,
|
||||
&uid_len);
|
||||
printf("Layer 2 success (%s): %s\n", rfid_layer2_name(l2h),
|
||||
hexdump(uid_buf, uid_len));
|
||||
}
|
||||
if (rc >= 3) {
|
||||
printf("Protocol success (%s)\n", rfid_protocol_name(ph));
|
||||
|
||||
if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE,
|
||||
&size, &size_len) == 0)
|
||||
printf("Size: %u bytes\n", size);
|
||||
}
|
||||
}
|
||||
|
||||
#define OPTION_OFFSET 256
|
||||
|
||||
static struct option original_opts[] = {
|
||||
{ "help", 0, 0, 'h' },
|
||||
{ "layer2", 1, 0, 'l' },
|
||||
{ "protocol", 1, 0, 'p' },
|
||||
{ "scan", 0, 0, 's' },
|
||||
{ "scan-loop", 0, 0, 'S' },
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/* module / option merging code */
|
||||
static struct option *opts = original_opts;
|
||||
static unsigned int global_option_offset = 0;
|
||||
|
||||
static char *program_name;
|
||||
static char *program_version = LIBRFID_TOOL_VERSION;
|
||||
|
||||
static void free_opts(int reset_offset)
|
||||
{
|
||||
if (opts != original_opts) {
|
||||
free(opts);
|
||||
opts = original_opts;
|
||||
if (reset_offset)
|
||||
global_option_offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static struct option *
|
||||
merge_options(struct option *oldopts, const struct option *newopts,
|
||||
unsigned int *option_offset)
|
||||
{
|
||||
unsigned int num_old, num_new, i;
|
||||
struct option *merge;
|
||||
|
||||
for (num_old = 0; oldopts[num_old].name; num_old++);
|
||||
for (num_new = 0; oldopts[num_new].name; num_new++);
|
||||
|
||||
global_option_offset += OPTION_OFFSET;
|
||||
*option_offset = global_option_offset;
|
||||
|
||||
merge = malloc(sizeof(struct option) * (num_new + num_old + 1));
|
||||
memcpy(merge, oldopts, num_old * sizeof(struct option));
|
||||
free_opts(0); /* Release previous options merged if any */
|
||||
for (i = 0; i < num_new; i++) {
|
||||
merge[num_old + i] = newopts[i];
|
||||
merge[num_old + i].val += *option_offset;
|
||||
}
|
||||
memset(merge + num_old + num_new, 0, sizeof(struct option));
|
||||
|
||||
return merge;
|
||||
}
|
||||
|
||||
struct rfidtool_module *find_module(const char *name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void register_module(struct rfidtool_module *me)
|
||||
{
|
||||
struct rfidtool_module *old;
|
||||
|
||||
if (strcmp(me->version, program_version) != 0) {
|
||||
fprintf(stderr, "%s: target `%s' v%s (I'm v%s).\n",
|
||||
program_name, me->name, me->version, program_version);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
old = find_module(me->name);
|
||||
if (old) {
|
||||
fprintf(stderr, "%s: target `%s' already registered.\n",
|
||||
program_name, me->name);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
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}\n"
|
||||
" -l --layer2 {iso14443a,iso14443b,iso15693}\n"
|
||||
" -h --help\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int rc;
|
||||
char buf[0x100];
|
||||
int i, len, protocol = -1, layer2 = -1;
|
||||
|
||||
#ifdef __MINGW32__
|
||||
program_name = argv[0];
|
||||
#else /*__MINGW32__*/
|
||||
program_name = basename(argv[0]);
|
||||
#endif/*__MINGW32__*/
|
||||
|
||||
printf("%s - (C) 2006 by Harald Welte\n"
|
||||
"This program is Free Software and has "
|
||||
"ABSOLUTELY NO WARRANTY\n\n", program_name);
|
||||
|
||||
printf("initializing librfid\n");
|
||||
rfid_init();
|
||||
|
||||
while (1) {
|
||||
int c, option_index = 0;
|
||||
c = getopt_long(argc, argv, "hp:l:sS", opts, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 's':
|
||||
if (reader_init() < 0)
|
||||
exit(1);
|
||||
do_scan();
|
||||
exit(0);
|
||||
break;
|
||||
case 'S':
|
||||
if (reader_init() < 0)
|
||||
exit(1);
|
||||
while (1)
|
||||
do_scan();
|
||||
exit(0);
|
||||
break;
|
||||
case 'p':
|
||||
protocol = proto_by_name(optarg);
|
||||
if (protocol < 0) {
|
||||
fprintf(stderr, "unknown protocol `%s'\n",
|
||||
optarg);
|
||||
exit(2);
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
layer2 = l2_by_name(optarg);
|
||||
if (layer2 < 0) {
|
||||
fprintf(stderr, "unknown layer2 `%s'\n",
|
||||
optarg);
|
||||
exit(2);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
help();
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (protocol) {
|
||||
case RFID_PROTOCOL_MIFARE_UL:
|
||||
case RFID_PROTOCOL_MIFARE_CLASSIC:
|
||||
layer2 = RFID_LAYER2_ISO14443A;
|
||||
break;
|
||||
case -1:
|
||||
fprintf(stderr, "you have to specify --protocol\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
if (layer2 < 0) {
|
||||
fprintf(stderr, "you have to specify --layer2\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
if (reader_init() < 0)
|
||||
exit(1);
|
||||
|
||||
if (l2_init(layer2) < 0)
|
||||
exit(1);
|
||||
|
||||
if (l3_init(protocol) < 0)
|
||||
exit(1);
|
||||
|
||||
switch (protocol) {
|
||||
|
||||
case RFID_PROTOCOL_TCL:
|
||||
printf("Protocol T=CL\n");
|
||||
/* we've established T=CL at this point */
|
||||
printf("selecting Master File\n");
|
||||
rc = select_mf();
|
||||
if (rc < 0) {
|
||||
printf("error selecting MF\n");
|
||||
break;
|
||||
}
|
||||
|
||||
printf("Getting random challenge, length 255\n");
|
||||
rc = iso7816_get_challenge(0xff);
|
||||
if (rc < 0) {
|
||||
printf("error getting random challenge\n");
|
||||
break;
|
||||
}
|
||||
|
||||
printf("selecting Passport application\n");
|
||||
rc = iso7816_select_application();
|
||||
if (rc < 0) {
|
||||
printf("error selecting passport application\n");
|
||||
break;
|
||||
}
|
||||
|
||||
printf("selecting EF 0x1e\n");
|
||||
rc = iso7816_select_ef(0x011e);
|
||||
if (rc < 0) {
|
||||
printf("error selecting EF 0x1e\n");
|
||||
break;
|
||||
}
|
||||
|
||||
printf("selecting EF 0x01\n");
|
||||
rc = iso7816_select_ef(0x0101);
|
||||
if (rc < 0) {
|
||||
printf("error selecting EF 0x01\n");
|
||||
break;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
printf("reading EF1\n");
|
||||
len = sizeof(buf);
|
||||
printf("reading ef\n");
|
||||
rc = iso7816_read_binary(buf, &len);
|
||||
if (rc < 0) {
|
||||
printf("error reading EF\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
for (i = 0; i < 4; i++)
|
||||
iso7816_get_challenge(0xff);
|
||||
#endif
|
||||
break;
|
||||
case RFID_PROTOCOL_MIFARE_UL:
|
||||
printf("Protocol Mifare Ultralight\n");
|
||||
mifare_ulight_read(ph);
|
||||
#if 0
|
||||
mifare_ulight_blank(ph);
|
||||
mifare_ulight_write(ph);
|
||||
mifare_ulight_read(ph);
|
||||
#endif
|
||||
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);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("unknown protocol\n");
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
|
||||
rfid_reader_close(rh);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef _RFIDTOOL_H
|
||||
#define _RFIDTOOL_H
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <getopt.h>
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
|
||||
extern const char *
|
||||
hexdump(const void *data, unsigned int len);
|
||||
|
||||
extern int
|
||||
hexread(unsigned char *result, const unsigned char *in, unsigned int len);
|
||||
|
||||
extern struct rfid_reader_handle *rh;
|
||||
extern struct rfid_layer2_handle *l2h;
|
||||
extern struct rfid_protocol_handle *ph;
|
||||
|
||||
extern int reader_init(void);
|
||||
extern int l2_init(int layer2);
|
||||
extern int l3_init(int protocol);
|
||||
|
||||
#define LIBRFID_TOOL_VERSION "0.1"
|
||||
|
||||
struct rfidtool_module {
|
||||
struct rfidtool_module *next;
|
||||
char *name;
|
||||
char *version;
|
||||
const struct option *extra_opts;
|
||||
|
||||
unsigned int option_offset;
|
||||
};
|
||||
|
||||
#endif /* _REFIDTOOL_H */
|
||||
@@ -0,0 +1,230 @@
|
||||
/* mifare-tool - a small command-line tool for librfid mifare testing
|
||||
*
|
||||
* (C) 2006 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
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
//#include <libgen.h>
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <getopt.h>
|
||||
|
||||
#include <librfid/rfid.h>
|
||||
#include <librfid/rfid_scan.h>
|
||||
#include <librfid/rfid_reader.h>
|
||||
#include <librfid/rfid_layer2.h>
|
||||
#include <librfid/rfid_protocol.h>
|
||||
|
||||
#include <librfid/rfid_protocol_mifare_classic.h>
|
||||
#include <librfid/rfid_protocol_mifare_ul.h>
|
||||
|
||||
#include <librfid/rfid_access_mifare_classic.h>
|
||||
|
||||
#include "librfid-tool.h"
|
||||
|
||||
static char *program_name;
|
||||
|
||||
static void help(void)
|
||||
{
|
||||
printf( " -h --help Print this help message\n"
|
||||
" -r --read Read a mifare sector\n"
|
||||
" -l --loop-read Loop reading a mifare sector\n"
|
||||
" -w --write Write a mifare sector\n"
|
||||
" -k --key Specify mifare access key (in hex tuples)\n");
|
||||
}
|
||||
|
||||
static struct option mifare_opts[] = {
|
||||
{ "key", 1, 0, 'k' },
|
||||
{ "read", 1, 0, 'r' },
|
||||
{ "loop-read", 1, 0, 'l' },
|
||||
{ "write", 1 ,0, 'w' },
|
||||
{ "help", 0, 0, 'h' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
static int mifare_cl_auth(unsigned char *key, int page)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = mfcl_set_key(ph, key);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "key format error\n");
|
||||
return rc;
|
||||
}
|
||||
rc = mfcl_auth(ph, RFID_CMD_MIFARE_AUTH1A, page);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "mifare auth error\n");
|
||||
return rc;
|
||||
} else
|
||||
printf("mifare auth succeeded!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mifare_l3(void)
|
||||
{
|
||||
while (l2_init(RFID_LAYER2_ISO14443A) < 0) ;
|
||||
|
||||
printf("ISO14443-3A anticollision succeeded\n");
|
||||
|
||||
while (l3_init(RFID_PROTOCOL_MIFARE_CLASSIC) < 0) ;
|
||||
|
||||
printf("Mifare card available\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int len, rc, c, option_index = 0;
|
||||
unsigned int page,uid,uid_len;
|
||||
char key[MIFARE_CL_KEY_LEN];
|
||||
char buf[MIFARE_CL_PAGE_SIZE];
|
||||
|
||||
#ifdef __MINGW32__
|
||||
program_name = argv[0];
|
||||
#else
|
||||
program_name = basename(argv[0]);
|
||||
#endif/*__MINGW32__*/
|
||||
|
||||
memcpy(key, MIFARE_CL_KEYA_DEFAULT_INFINEON, MIFARE_CL_KEY_LEN);
|
||||
|
||||
printf("%s - (C) 2006 by Harald Welte\n"
|
||||
"This program is Free Software and has "
|
||||
"ABSOLUTELY NO WARRANTY\n\n", program_name);
|
||||
|
||||
printf("initializing librfid\n");
|
||||
rfid_init();
|
||||
|
||||
if (reader_init() < 0) {
|
||||
fprintf(stderr, "error opening reader\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
c = getopt_long(argc, argv, "k:r:l:w:", mifare_opts,
|
||||
&option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 'k':
|
||||
hexread(key, optarg, strlen(optarg));
|
||||
printf("key: %s\n", hexdump(key, MIFARE_CL_KEY_LEN));
|
||||
break;
|
||||
case 'r':
|
||||
page = atoi(optarg);
|
||||
printf("read(key='%s',page=%u):",
|
||||
hexdump(key, MIFARE_CL_KEY_LEN), page);
|
||||
len = MIFARE_CL_PAGE_SIZE;
|
||||
mifare_l3();
|
||||
if (mifare_cl_auth(key, page) < 0)
|
||||
exit(1);
|
||||
|
||||
uid_len=sizeof(uid);
|
||||
uid=0;
|
||||
if(rfid_layer2_getopt(l2h,RFID_OPT_LAYER2_UID,&uid,&uid_len)>=0)
|
||||
printf("UID=%08X (len=%u)\n",uid,uid_len);
|
||||
|
||||
len=MIFARE_CL_PAGE_SIZE;
|
||||
rc = rfid_protocol_read(ph, page, buf, &len);
|
||||
if (rc < 0) {
|
||||
printf("\n");
|
||||
fprintf(stderr, "error during read\n");
|
||||
break;
|
||||
}
|
||||
printf("len=%u data=%s\n", len, hexdump(buf, len));
|
||||
|
||||
if (page & 0x3 == 0x3) {
|
||||
struct mfcl_access_sect s;
|
||||
struct mfcl_access_exp_sect es;
|
||||
int b;
|
||||
u_int8_t recreated[4];
|
||||
mfcl_parse_access(&s, buf+6);
|
||||
printf("access b0:%u b1:%u b2:%u b3:%u\n",
|
||||
s.block[0], s.block[1],
|
||||
s.block[2], s.block[3]);
|
||||
mfcl_access_to_exp(&es, &s);
|
||||
for (b = 0; b < 3; b++)
|
||||
printf("%u: %s\n", b, mfcl_access_exp_stringify(&es.block[b]));
|
||||
printf("3: %s\n", mfcl_access_exp_acc_stringify(&es.acc));
|
||||
#if 0
|
||||
mfcl_compile_access(recreated, &s);
|
||||
printf("recreated; %s\n", hexdump(recreated,4));
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
page = atoi(optarg);
|
||||
printf("read_loop(key='%s',page=%u):\n",
|
||||
hexdump(key, MIFARE_CL_KEY_LEN), page);
|
||||
while (1) {
|
||||
mifare_l3();
|
||||
if (mifare_cl_auth(key, page) < 0)
|
||||
continue;
|
||||
|
||||
uid_len=sizeof(uid);
|
||||
uid=0;
|
||||
if(rfid_layer2_getopt(l2h,RFID_OPT_LAYER2_UID,&uid,&uid_len)>=0)
|
||||
printf("UID=%08X (len=%u)\n",uid,uid_len);
|
||||
|
||||
len=MIFARE_CL_PAGE_SIZE;
|
||||
rc = rfid_protocol_read(ph, page, buf, &len);
|
||||
if (rc < 0) {
|
||||
printf("\n");
|
||||
fprintf(stderr, "error during read\n");
|
||||
continue;
|
||||
}
|
||||
printf("%s\n", hexdump(buf, len));
|
||||
}
|
||||
break;
|
||||
case 'w':
|
||||
page = atoi(optarg);
|
||||
len = strlen(argv[optind]);
|
||||
len = hexread(buf, argv[optind], len);
|
||||
printf("write(key='%s',page=%u):",
|
||||
hexdump(key, MIFARE_CL_KEY_LEN), page);
|
||||
printf(" '%s'(%u):", hexdump(buf, len), len);
|
||||
mifare_l3();
|
||||
if (mifare_cl_auth(key, page) < 0)
|
||||
exit(1);
|
||||
rc = rfid_protocol_write(ph, page, buf, len);
|
||||
if (rc < 0) {
|
||||
printf("\n");
|
||||
fprintf(stderr, "error during write\n");
|
||||
break;
|
||||
}
|
||||
printf("success\n");
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
help();
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
rfid_protocol_close(ph);
|
||||
rfid_protocol_fini(ph);
|
||||
|
||||
rfid_layer2_close(l2h);
|
||||
rfid_layer2_fini(l2h);
|
||||
#endif
|
||||
rfid_reader_close(rh);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* 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,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <getopt.h>
|
||||
|
||||
#include <librfid/rfid.h>
|
||||
#include <librfid/rfid_reader.h>
|
||||
#include <librfid/rfid_layer2.h>
|
||||
#include <librfid/rfid_protocol.h>
|
||||
|
||||
#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)
|
||||
{
|
||||
static char string[2048];
|
||||
unsigned char *d = (unsigned char *) data;
|
||||
unsigned int i, left, llen = len;
|
||||
|
||||
string[0] = '\0';
|
||||
left = sizeof(string);
|
||||
for (i = 0; llen--; i += 3) {
|
||||
if (i >= sizeof(string) -4)
|
||||
break;
|
||||
snprintf(string+i, 4, " %02x", *d++);
|
||||
} return string;
|
||||
|
||||
if (i >= sizeof(string) -2)
|
||||
return string;
|
||||
snprintf(string+i, 2, " ");
|
||||
i++; llen = len;
|
||||
|
||||
d = (unsigned char *) data;
|
||||
for (; llen--; i += 1) {
|
||||
if (i >= sizeof(string) -2)
|
||||
break;
|
||||
snprintf(string+i, 2, "%c", isprint(*d) ? *d : '.');
|
||||
d++;
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
static struct rfid_reader_handle *rh;
|
||||
static struct rfid_layer2_handle *l2h;
|
||||
static struct rfid_protocol_handle *ph;
|
||||
|
||||
static int init()
|
||||
{
|
||||
unsigned char buf[0x3f];
|
||||
int rc;
|
||||
|
||||
printf("initializing librfid\n");
|
||||
rfid_init();
|
||||
|
||||
printf("opening reader handle\n");
|
||||
rh = rfid_reader_open(NULL, RFID_READER_CM5121);
|
||||
if (!rh) {
|
||||
fprintf(stderr, "error, no cm5121 handle\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("opening layer2 handle\n");
|
||||
l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443A);
|
||||
//l2h = rfid_layer2_init(rh, RFID_LAYER2_ISO14443B);
|
||||
if (!l2h) {
|
||||
fprintf(stderr, "error during iso14443a_init\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
//rc632_register_dump(rh->ah, buf);
|
||||
|
||||
printf("running layer2 anticol\n");
|
||||
rc = rfid_layer2_open(l2h);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "error during layer2_open\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int l3(int protocol)
|
||||
{
|
||||
printf("running layer3 (ats)\n");
|
||||
ph = rfid_protocol_init(l2h, protocol);
|
||||
if (!ph) {
|
||||
fprintf(stderr, "error during protocol_init\n");
|
||||
return -1;
|
||||
}
|
||||
if (rfid_protocol_open(ph) < 0) {
|
||||
fprintf(stderr, "error during protocol_open\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("we now have layer3 up and running\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int send_command(char* sbuf, int slen, char* rbuf, int rlen)
|
||||
{
|
||||
int rv;
|
||||
static int doit;
|
||||
int answer, c = 0;
|
||||
|
||||
if(doit == 0) {
|
||||
fprintf(stderr, "?? %s (%i bytes)\n", hexdump(sbuf, slen), slen);
|
||||
fprintf(stderr, "Execute? (Yes/No/All/Exit) ");
|
||||
answer = getc(stdin);
|
||||
if(answer != '\n') do {
|
||||
c = getc(stdin);
|
||||
} while(c != '\n' && c != EOF);
|
||||
switch(answer) {
|
||||
case 'y': // Fall-through
|
||||
case 'Y':
|
||||
case '\n':
|
||||
// Do nothing
|
||||
break;
|
||||
case 'n': // Fall-through
|
||||
case 'N':
|
||||
return 0;
|
||||
break;
|
||||
case 'a': // Fall-through
|
||||
case 'A':
|
||||
doit = 1;
|
||||
break;
|
||||
case 'e': // Fall-through
|
||||
case 'E':
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
return 0; // Default to 'n'
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf(">> %s (%i bytes)\n", hexdump(sbuf, slen), slen);
|
||||
|
||||
rv = rfid_protocol_transceive(ph, sbuf, slen, rbuf, &rlen, 0, 0);
|
||||
if (rv < 0) {
|
||||
fprintf(stderr, "Error from transceive: %i\n", rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
printf("<< %s (%i bytes)\n", hexdump(rbuf, rlen), rlen);
|
||||
|
||||
if(rlen < 2 || rbuf[rlen-2] != (char)0x90 || rbuf[rlen-1] != 0x00) {
|
||||
fprintf(stderr, "SW is not 90 00. Ignore (i) or Abort (a)? ");
|
||||
answer = getc(stdin);
|
||||
if(answer != '\n') do {
|
||||
c = getc(stdin);
|
||||
} while(c != '\n' && c != EOF);
|
||||
switch(answer) {
|
||||
case 'i': // Fall-through
|
||||
case 'I':
|
||||
case '\n':
|
||||
// Do nothing
|
||||
break;
|
||||
case 'a': // Fall-through
|
||||
case 'A':
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
return -1; // Default to 'a'
|
||||
}
|
||||
}
|
||||
|
||||
return rlen;
|
||||
}
|
||||
|
||||
static char *nextline(FILE* fh)
|
||||
{
|
||||
int buflen = 1024; // FIXME Might want to increase dynamically?
|
||||
char *buffer = malloc(buflen);
|
||||
if (!buffer) {
|
||||
perror("malloc");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!fgets(buffer, buflen, fh)) {
|
||||
perror("fgets");
|
||||
free(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static int unhexchar(char c) {
|
||||
if ((c - '0') >= 0 && (c - '0') < 10)
|
||||
return c-'0';
|
||||
if ((c - 'a') >= 0 && (c - 'a') < 6)
|
||||
return 10 + c-'a';
|
||||
if ((c - 'A') >= 0 && (c - 'A') < 6)
|
||||
return 10 + c-'A';
|
||||
return -1;
|
||||
}
|
||||
|
||||
int make_command( const char *line, char **buffer, int *blen )
|
||||
{
|
||||
int len = strlen(line), pos;
|
||||
*buffer = malloc( len );
|
||||
*blen = 0;
|
||||
if(!*buffer) {
|
||||
perror("malloc");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(pos = 0; pos < len; pos++) {
|
||||
if(!isxdigit(line[pos]))
|
||||
continue;
|
||||
if(! (pos+1 < len) )
|
||||
continue;
|
||||
|
||||
(*buffer)[*blen] = unhexchar(line[pos]) * 16 + unhexchar(line[pos+1]);
|
||||
pos += 1;
|
||||
*blen += 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *fh;
|
||||
int slen, rlen, retval = 0;
|
||||
char *next, *sbuf, *rbuf;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Syntax: %s scriptfile\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
fh = fopen(argv[1], "r");
|
||||
if (!fh) {
|
||||
perror("fopen");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (init() < 0)
|
||||
exit(1);
|
||||
|
||||
if (l3(RFID_PROTOCOL_TCL) < 0)
|
||||
exit(1);
|
||||
|
||||
printf("Protocol T=CL\n");
|
||||
/* we've established T=CL at this point */
|
||||
|
||||
while (next = nextline(fh)) {
|
||||
if (!(strlen(next) >= 2 && strncmp(next, "//", 2) == 0)) {
|
||||
if (make_command(next, &sbuf, &slen)) {
|
||||
rlen = 1024;
|
||||
rbuf = calloc(rlen, 1);
|
||||
|
||||
retval = send_command(sbuf, slen, rbuf, rlen);
|
||||
|
||||
free(sbuf);
|
||||
free(rbuf);
|
||||
}
|
||||
}
|
||||
free(next);
|
||||
|
||||
if (retval < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
rfid_reader_close(rh);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
Reference in New Issue
Block a user