added mifare trailer block decoding (#726)
[proxmark3-svn] / client / cmdhfmf.c
index c382664ba44aee0b08b0c58e3087d841e6b969ad..fa952cb9be55bba7e03323476e5b17e931253325 100644 (file)
@@ -141,12 +141,26 @@ int CmdHF14AMfRdBl(const char *Cmd)
                uint8_t isOK  = resp.arg[0] & 0xff;\r
                uint8_t *data = resp.d.asBytes;\r
 \r
-               if (isOK)\r
+               if (isOK) {\r
                        PrintAndLog("isOk:%02x data:%s", isOK, sprint_hex(data, 16));\r
-               else\r
+               } else {\r
                        PrintAndLog("isOk:%02x", isOK);\r
+                       return 1;\r
+               }\r
+\r
+               if (mfIsSectorTrailer(blockNo) && (data[6] || data[7] || data[8])) {\r
+                       PrintAndLogEx(NORMAL, "Trailer decoded:");\r
+                       int bln = mfFirstBlockOfSector(mfSectorNum(blockNo));\r
+                       int blinc = (mfNumBlocksPerSector(mfSectorNum(blockNo)) > 4) ? 5 : 1;\r
+                       for (int i = 0; i < 4; i++) {\r
+                               PrintAndLogEx(NORMAL, "Access block %d%s: %s", bln, ((blinc > 1) && (i < 3) ? "+" : "") , mfGetAccessConditionsDesc(i, &data[6]));\r
+                               bln += blinc;\r
+                       }\r
+                       PrintAndLogEx(NORMAL, "UserData: %s", sprint_hex_inrow(&data[9], 1));\r
+               }\r
        } else {\r
                PrintAndLog("Command execute timeout");\r
+               return 2;\r
        }\r
 \r
   return 0;\r
@@ -2272,6 +2286,20 @@ int CmdHF14AMfCGetBlk(const char *Cmd) {
                }\r
 \r
        PrintAndLog("block data:%s", sprint_hex(memBlock, 16));\r
+       \r
+       if (mfIsSectorTrailer(blockNo)) {\r
+               PrintAndLogEx(NORMAL, "Trailer decoded:");\r
+               PrintAndLogEx(NORMAL, "Key A: %s", sprint_hex_inrow(memBlock, 6));\r
+               PrintAndLogEx(NORMAL, "Key B: %s", sprint_hex_inrow(&memBlock[10], 6));\r
+               int bln = mfFirstBlockOfSector(mfSectorNum(blockNo));\r
+               int blinc = (mfNumBlocksPerSector(mfSectorNum(blockNo)) > 4) ? 5 : 1;\r
+               for (int i = 0; i < 4; i++) {\r
+                       PrintAndLogEx(NORMAL, "Access block %d%s: %s", bln, ((blinc > 1) && (i < 3) ? "+" : "") , mfGetAccessConditionsDesc(i, &memBlock[6]));\r
+                       bln += blinc;\r
+               }\r
+               PrintAndLogEx(NORMAL, "UserData: %s", sprint_hex_inrow(&memBlock[9], 1));\r
+       }\r
+       \r
        return 0;\r
 }\r
 \r
Impressum, Datenschutz