Imported Upstream version 0.10.6
authorMati Aharoni (Kali Linux Developer) <muts@kali.org>
Mon, 19 Aug 2013 14:17:54 +0000 (10:17 -0400)
committerMati Aharoni (Kali Linux Developer) <muts@kali.org>
Mon, 19 Aug 2013 14:17:54 +0000 (10:17 -0400)
configure
configure.ac
src/crapto1.c
src/mfoc.c
src/mfoc.h
src/mifare.c
src/mifare.h
src/nfc-utils.c
src/nfc-utils.h

index 5cebe96..99b088f 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for mfoc 0.10.5.
+# Generated by GNU Autoconf 2.68 for mfoc 0.10.6.
 #
 # Report bugs to <mifare@nethemba.com>.
 #
@@ -560,8 +560,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='mfoc'
 PACKAGE_TARNAME='mfoc'
-PACKAGE_VERSION='0.10.5'
-PACKAGE_STRING='mfoc 0.10.5'
+PACKAGE_VERSION='0.10.6'
+PACKAGE_STRING='mfoc 0.10.6'
 PACKAGE_BUGREPORT='mifare@nethemba.com'
 PACKAGE_URL=''
 
@@ -1259,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.5 to adapt to many kinds of systems.
+\`configure' configures mfoc 0.10.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1325,7 +1325,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mfoc 0.10.5:";;
+     short | recursive ) echo "Configuration of mfoc 0.10.6:";;
    esac
   cat <<\_ACEOF
 
@@ -1422,7 +1422,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mfoc configure 0.10.5
+mfoc configure 0.10.6
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1898,7 +1898,7 @@ 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.5, which was
+It was created by mfoc $as_me 0.10.6, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -3575,7 +3575,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='mfoc'
- VERSION='0.10.5'
+ VERSION='0.10.6'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5267,7 +5267,7 @@ 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.5, which was
+This file was extended by mfoc $as_me 0.10.6, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5333,7 +5333,7 @@ _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.5
+mfoc config.status 0.10.6
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
index 688c7c6..e9f8f22 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT([mfoc],[0.10.5],[mifare@nethemba.com])
+AC_INIT([mfoc],[0.10.6],[mifare@nethemba.com])
 
 AC_CONFIG_MACRO_DIR([m4])
 
index b693bc3..94995f3 100644 (file)
@@ -311,7 +311,6 @@ continue2:
 \r
 uint8_t lfsr_rollback_bit(struct Crypto1State *s, uint32_t in, int fb);\r
 uint8_t lfsr_rollback_byte(struct Crypto1State *s, uint32_t in, int fb);\r
-uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb);\r
 uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd);\r
 \r
 /** lfsr_rollback_bit\r
index 5906ac2..9c3e615 100644 (file)
@@ -1,34 +1,36 @@
-/*
-
- Mifare Classic Offline Cracker
-
- Requirements: crapto1 library http://code.google.com/p/crapto1
- libnfc                        http://www.libnfc.org
-
- 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
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU General Public License for more details.
+/*-
+ * Mifare Classic Offline Cracker
+ *
+ * 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 the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ * Contact: <mifare@nethemba.com>
+ *
+ * Porting to libnfc 1.3.3: Michal Boska <boska.michal@gmail.com>
+ * Porting to libnfc 1.3.9 and upper: Romuald Conty <romuald@libnfc.org>
+ *
+ */
 
- You should have received a copy of the GNU General Public License
- along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
- Contact: <mifare@nethemba.com>
-
- Porting to libnfc 1.3.3: Michal Boska <boska.michal@gmail.com>
- Porting to libnfc 1.3.9: Romuald Conty <romuald@libnfc.org>
- Porting to libnfc 1.4.x: Romuald Conty <romuald@libnfc.org>
-
- URL http://eprint.iacr.org/2009/137.pdf
- URL http://www.sos.cs.ru.nl/applications/rfid/2008-esorics.pdf
- URL http://www.cosic.esat.kuleuven.be/rfidsec09/Papers/mifare_courtois_rfidsec09.pdf
- URL http://www.cs.ru.nl/~petervr/papers/grvw_2009_pickpocket.pdf
-*/
+/*
+ * This implementation was written based on information provided by the
+ * following documents:
+ *
+ * http://eprint.iacr.org/2009/137.pdf
+ * http://www.sos.cs.ru.nl/applications/rfid/2008-esorics.pdf
+ * http://www.cosic.esat.kuleuven.be/rfidsec09/Papers/mifare_courtois_rfidsec09.pdf
+ * http://www.cs.ru.nl/~petervr/papers/grvw_2009_pickpocket.pdf
+ */
 
 #define _XOPEN_SOURCE 1 // To enable getopt
 
@@ -249,9 +251,10 @@ int main(int argc, char *const argv[])
     t.sectors[s].foundKeyA = t.sectors[s].foundKeyB = false;
   }
 
-  print_nfc_target(t.nt, true);
+  print_nfc_target(&t.nt, true);
 
-  // Try to authenticate to all sectors with default keys
+  fprintf(stdout, "\nTry to authenticate to all sectors with default keys...\n");
+  fprintf(stdout, "Symbols: '.' no key found, '/' A key found, '\\' B key found, 'x' both keys found\n");
   // 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)
@@ -274,9 +277,12 @@ int main(int argc, char *const argv[])
       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);
+          int res;
+          if ((res = nfc_initiator_mifare_cmd(r.pdi, mc, block, &mp)) < 0) {
+            if (res != NFC_EMFCAUTHFAIL) {
+              nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+              goto error;
+            }
             mf_anticollision(t, r);
           } else {
             // Save all information about successfull keyA authentization
@@ -286,9 +292,12 @@ int main(int argc, char *const argv[])
         }
         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);
+          int res;
+          if ((res = nfc_initiator_mifare_cmd(r.pdi, mc, block, &mp)) < 0) {
+            if (res != NFC_EMFCAUTHFAIL) {
+              nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+              goto error;
+            }
             mf_anticollision(t, r);
             // No success, try next block
             t.sectors[i].trailer = block;
@@ -307,8 +316,6 @@ int main(int argc, char *const argv[])
           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;
       }
@@ -339,10 +346,13 @@ int main(int argc, char *const argv[])
         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);
+          mc = dumpKeysA ? MC_AUTH_A : MC_AUTH_B;
+          int res;
+          if ((res = nfc_initiator_mifare_cmd(r.pdi, mc, t.sectors[j].trailer, &mp)) < 0) {
+            if (res != NFC_EMFCAUTHFAIL) {
+              nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+              goto error;
+            }
             mf_anticollision(t, r);
           } else {
             // Save all information about successfull authentization
@@ -394,10 +404,13 @@ int main(int argc, char *const argv[])
               // 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);
+              mc = dumpKeysA ? MC_AUTH_A : MC_AUTH_B;
+              int res;
+              if ((res = nfc_initiator_mifare_cmd(r.pdi, mc, t.sectors[j].trailer, &mp)) < 0) {
+                if (res != NFC_EMFCAUTHFAIL) {
+                  nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+                  goto error;
+                }
                 mf_anticollision(t, r);
               } else {
                 // Save all information about successfull authentization
@@ -454,12 +467,16 @@ int main(int argc, char *const argv[])
 
       // 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");
+      int res;
+      if ((res = nfc_initiator_mifare_cmd(r.pdi, MC_AUTH_A, block, &mp)) < 0) {
+        if (res != NFC_EMFCAUTHFAIL) {
+          nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+          goto error;
+        }
         mf_configure(r.pdi);
         mf_anticollision(t, r);
       } else { // and Read
-        if (nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) {
+        if ((res = nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) >= 0) {
           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);
@@ -467,22 +484,32 @@ int main(int argc, char *const argv[])
           failure = false;
         } else {
           // Error, now try read() with B key
-          // ERR ("Error: Read A");
+          if (res != NFC_ERFTRANS) {
+            nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+            goto error;
+          }
           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");
+          if ((res = nfc_initiator_mifare_cmd(r.pdi, MC_AUTH_B, block, &mp)) < 0) {
+            if (res != NFC_EMFCAUTHFAIL) {
+              nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+              goto error;
+            }
             mf_configure(r.pdi);
             mf_anticollision(t, r);
           } else { // and Read
-            if (nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) {
+            if ((res = nfc_initiator_mifare_cmd(r.pdi, MC_READ, block, &mp)) >= 0) {
               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 {
+              if (res != NFC_ERFTRANS) {
+                nfc_perror(r.pdi, "nfc_initiator_mifare_cmd");
+                goto error;
+              }
               mf_configure(r.pdi);
               mf_anticollision(t, r);
               // ERR ("Error: Read B");
@@ -675,10 +702,11 @@ int mf_enhanced_auth(int e_sector, int a_sector, mftag t, mfreader r, denonce *d
 
   uint32_t Nt, NtLast, NtProbe, NtEnc, Ks1;
 
-  int i, m;
+  int i;
+  uint32_t m;
 
   // Prepare AUTH command
-  Auth[0] = (t.sectors[e_sector].foundKeyA) ? 0x60 : 0x61;
+  Auth[0] = (t.sectors[e_sector].foundKeyA) ? MC_AUTH_A : MC_AUTH_B;
   iso14443a_crc_append(Auth, 2);
   // fprintf(stdout, "\nAuth command:\t");
   // print_hex(Auth, 4);
@@ -824,7 +852,7 @@ int mf_enhanced_auth(int e_sector, int a_sector, mftag t, mfreader r, denonce *d
   // 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[0] = dumpKeysA ? MC_AUTH_A : MC_AUTH_B;
     Auth[1] = a_sector;
     iso14443a_crc_append(Auth, 2);
 
index db16c0f..b411670 100644 (file)
@@ -36,36 +36,36 @@ typedef struct {
   uint32_t       median;
   uint32_t       num_distances;
   uint32_t       tolerance;
-  uint8_t          parity[3];              // used for 3 bits of parity information
+  uint8_t        parity[3];              // used for 3 bits of parity information
 } denonce;                                      // Revealed information about nonce
 
 typedef struct {
-  nfc_target   nt;
+  nfc_target    nt;
   sector         *sectors;                // Allocate later, we do not know the number of sectors yet
-  sector               e_sector;               // Exploit sector
+  sector         e_sector;             // Exploit sector
   uint8_t        num_sectors;
   uint8_t        num_blocks;
-  uint32_t        authuid;
-  bool            b4K;
+  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;
+  uint32_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;
 
 
index 6c84724..ab04ac0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2009 Roel Verdult
  * Copyright (C) 2010 Romain Tartière
- * Copyright (C) 2010, 2011 Romuald Conty
+ * Copyright (C) 2010, 2011, 2013 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 mifare.c
  * @brief provide samples structs and functions to manipulate MIFARE Classic and Ultralight tags using libnfc
  */
+
+/*
+ * This implementation was written based on information provided by the
+ * following document:
+ *
+ * MIFARE Classic Specification
+ *  MF1ICS50
+ *  Functional specification
+ *  Rev. 5.3 - 29 January 2008
+ *  http://www.nxp.com/acrobat/other/identification/M001053_MF1ICS50_rev5_3.pdf
+ */
+
 #include "mifare.h"
 
 #include <string.h>
 #include <nfc/nfc.h>
 
 /**
- * @brief Execute a MIFARE Classic Command
- * @return Returns true if action was successfully performed; otherwise returns false.
+ * @brief Execute a MIFARE Classic command
+ * @return Returns NFC_SUCCESS if action was successfully performed; otherwise returns error code (negative value).
  * @param pmp Some commands need additional information. This information should be supplied in the mifare_param union.
  *
- * The specified MIFARE command will be executed on the tag. There are different commands possible, they all require the destination block number.
+ * The specified MIFARE command will be executed on the tag. There are
+ * different commands possible, they all require the destination block number.
+ *
  * @note There are three different types of information (Authenticate, Data and Value).
  *
  * First an authentication must take place using Key A or B. It requires a 48 bit Key (6 bytes) and the UID.
- * They are both used to initialize the internal cipher-state of the PN53X chip (http://libnfc.org/hardware/pn53x-chip).
  * After a successful authentication it will be possible to execute other commands (e.g. Read/Write).
- * The MIFARE Classic Specification (http://www.nxp.com/acrobat/other/identification/M001053_MF1ICS50_rev5_3.pdf) explains more about this process.
+ *
+ * Like libnfc's functions, this one returns negative value on error (libnfc's
+ * error code) but two of them need a special attention in this context (MIFARE
+ * Classic):
+ *  - NFC_EMFCAUTHFAIL, "MIFARE authentication failed", means key is not valid
+ *  on specified sector.
+ *  - NFC_ERFTRANS, "Invalid received frame", when occurs on MIFARE command
+ *  read or write after a successful authentication, means permissions allowed
+ *  by current acces bytes are not sufficient to process the command.
  */
-bool
+int
 nfc_initiator_mifare_cmd(nfc_device *pnd, const mifare_cmd mc, const uint8_t ui8Block, mifare_param *pmp)
 {
   uint8_t  abtRx[265];
   size_t  szParamLen;
   uint8_t  abtCmd[265];
-  //bool    bEasyFraming;
 
   abtCmd[0] = mc;               // The MIFARE Classic command
   abtCmd[1] = ui8Block;         // The block address (1K=0x00..0x39, 4K=0x00..0xff)
@@ -89,7 +110,7 @@ nfc_initiator_mifare_cmd(nfc_device *pnd, const mifare_cmd mc, const uint8_t ui8
 
       // Please fix your code, you never should reach this statement
     default:
-      return false;
+      return NFC_EINVARG;
       break;
   }
 
@@ -98,40 +119,23 @@ nfc_initiator_mifare_cmd(nfc_device *pnd, const mifare_cmd mc, const uint8_t ui8
     memcpy(abtCmd + 2, (uint8_t *) pmp, szParamLen);
 
   // FIXME: Save and restore bEasyFraming
-  // bEasyFraming = nfc_device_get_property_bool (pnd, NP_EASY_FRAMING, &bEasyFraming);
-  if (nfc_device_set_property_bool(pnd, NP_EASY_FRAMING, true) < 0) {
-    nfc_perror(pnd, "nfc_device_set_property_bool");
-    return false;
+  int res;
+  if ((res = nfc_device_set_property_bool(pnd, NP_EASY_FRAMING, true)) < 0) {
+    return res;
   }
   // Fire the mifare command
-  int res;
   if ((res = nfc_initiator_transceive_bytes(pnd, abtCmd, 2 + szParamLen, abtRx, sizeof(abtRx), -1))  < 0) {
-    if (res == NFC_ERFTRANS) {
-      // "Invalid received frame",  usual means we are
-      // 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 {
-      nfc_perror(pnd, "nfc_initiator_transceive_bytes");
-    }
-    // XXX nfc_device_set_property_bool (pnd, NP_EASY_FRAMING, bEasyFraming);
-    return false;
-  }
-  /* XXX
-  if (nfc_device_set_property_bool (pnd, NP_EASY_FRAMING, bEasyFraming) < 0) {
-    nfc_perror (pnd, "nfc_device_set_property_bool");
-    return false;
+    return res;
   }
-  */
 
   // When we have executed a read command, copy the received bytes into the param
   if (mc == MC_READ) {
     if (res == 16) {
       memcpy(pmp->mpd.abtData, abtRx, 16);
     } else {
-      return false;
+      return NFC_EINVARG;
     }
   }
   // Command succesfully executed
-  return true;
+  return NFC_SUCCESS;
 }
index fb90fea..0a4d2cb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2009 Roel Verdult
  * Copyright (C) 2010 Romain Tartière
- * Copyright (C) 2010, 2011 Romuald Conty
+ * Copyright (C) 2010, 2011, 2013 Romuald Conty
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
  */
 
 #ifndef _LIBNFC_MIFARE_H_
-#  define _LIBNFC_MIFARE_H_
+#define _LIBNFC_MIFARE_H_
 
-#  include <nfc/nfc-types.h>
+#include <nfc/nfc-types.h>
 
 // Compiler directive, set struct alignment to 1 uint8_t for compatibility
-#  pragma pack(1)
+#pragma pack(1)
 
 typedef enum {
   MC_AUTH_A = 0x60,
@@ -76,7 +76,7 @@ typedef union {
 // Reset struct alignment to default
 #  pragma pack()
 
-bool    nfc_initiator_mifare_cmd(nfc_device *pnd, const mifare_cmd mc, const uint8_t ui8Block, mifare_param *pmp);
+int    nfc_initiator_mifare_cmd(nfc_device *pnd, const mifare_cmd mc, const uint8_t ui8Block, mifare_param *pmp);
 
 // Compiler directive, set struct alignment to 1 uint8_t for compatibility
 #  pragma pack(1)
index deb51e7..5c0a264 100644 (file)
@@ -1,9 +1,13 @@
 /*-
- * Public platform independent Near Field Communication (NFC) library examples
+ * Free/Libre Near Field Communication (NFC) library
  *
- * Copyright (C) 2009 Roel Verdult
- * Copyright (C) 2010, 2011 Romain Tartière
- * Copyright (C) 2009, 2010, 2011, 2012 Romuald Conty
+ * Libnfc historical contributors:
+ * Copyright (C) 2009      Roel Verdult
+ * Copyright (C) 2009-2013 Romuald Conty
+ * Copyright (C) 2010-2012 Romain Tartière
+ * Copyright (C) 2010-2013 Philippe Teuwen
+ * Copyright (C) 2012-2013 Ludovic Rousseau
+ * Additional contributors of this file:
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -115,10 +119,10 @@ print_hex_par(const uint8_t *pbtData, const size_t szBits, const uint8_t *pbtDat
 }
 
 void
-print_nfc_target(const nfc_target nt, bool verbose)
+print_nfc_target(const nfc_target *pnt, bool verbose)
 {
   char *s;
-  str_nfc_target(&s, nt, verbose);
+  str_nfc_target(&s, pnt, verbose);
   printf("%s", s);
-  free(s);
+  nfc_free(s);
 }
index c92fbc2..8c52d4c 100644 (file)
@@ -1,9 +1,13 @@
 /*-
- * Public platform independent Near Field Communication (NFC) library examples
+ * Free/Libre Near Field Communication (NFC) library
  *
- * Copyright (C) 2009 Roel Verdult
- * Copyright (C) 2010 Romain Tartière
- * Copyright (C) 2010, 2011, 2012 Romuald Conty
+ * Libnfc historical contributors:
+ * Copyright (C) 2009      Roel Verdult
+ * Copyright (C) 2009-2013 Romuald Conty
+ * Copyright (C) 2010-2012 Romain Tartière
+ * Copyright (C) 2010-2013 Philippe Teuwen
+ * Copyright (C) 2012-2013 Ludovic Rousseau
+ * Additional contributors of this file:
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -94,6 +98,6 @@ 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 *pnt, bool verbose);
 
 #endif