]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/mifarecmd.c
CHG: some magic generation1 tags is not following protocol and answers to the "halt...
[proxmark3-svn] / armsrc / mifarecmd.c
index 102887e45b3dcbfa2ccf59f205d1a05612ac0e3a..e51ae18b9cc728d318fac9d147195c097930ba05 100644 (file)
@@ -637,8 +637,8 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
        // free eventually allocated BigBuf memory\r
        BigBuf_free();\r
 \r
-       clear_trace();\r
-       set_tracing(false);\r
+       if (calibrate) clear_trace();\r
+       set_tracing(true);\r
 \r
        // statistics on nonce distance\r
        int16_t isOK = 0;\r
@@ -723,7 +723,6 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
                dmax = davg + 2;\r
                \r
                LED_B_OFF();\r
-       \r
        }\r
 //  -------------------------------------------------------------------------------------------------  \r
        \r
@@ -815,18 +814,19 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 \r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
-       set_tracing(TRUE);\r
+       set_tracing(FALSE);\r
 }\r
 \r
 //-----------------------------------------------------------------------------\r
 // MIFARE check keys. key count up to 85. \r
 // \r
 //-----------------------------------------------------------------------------\r
-void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)\r
+void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)\r
 {\r
   // params\r
-       uint8_t blockNo = arg0;\r
-       uint8_t keyType = arg1;\r
+       uint8_t blockNo = arg0 & 0xff;\r
+       uint8_t keyType = (arg0 >> 8) & 0xff;\r
+       bool clearTrace = arg1;\r
        uint8_t keyCount = arg2;\r
        uint64_t ui64Key = 0;\r
        \r
@@ -848,7 +848,7 @@ void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
        LED_C_OFF();\r
        iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
 \r
-       clear_trace();\r
+       if (clearTrace) clear_trace();\r
        set_tracing(TRUE);\r
 \r
        for (i = 0; i < keyCount; i++) {\r
@@ -879,7 +879,8 @@ void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 \r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
-\r
+       set_tracing(FALSE);\r
+       \r
        // restore debug level\r
        MF_DBGLEVEL = OLD_MF_DBGLEVEL;  \r
 }\r
@@ -908,7 +909,8 @@ void MifareEMemClr(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
 \r
 void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){\r
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);\r
-       emlSetMem(datain, arg0, arg1); // data, block num, blocks count\r
+       //emlSetMem(datain, arg0, arg1); // data, block num, blocks count        \r
+       emlSetMem_xt(datain, arg0, arg1, arg2); // data, block num, blocks count, block byte width\r
 }\r
 \r
 void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){\r
@@ -945,7 +947,7 @@ void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
        \r
        clear_trace();\r
-       set_tracing(false);\r
+       set_tracing(TRUE);\r
        \r
        bool isOK = true;\r
 \r
@@ -1001,6 +1003,7 @@ void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        \r
        if (MF_DBGLEVEL >= 2) DbpString("EMUL FILL SECTORS FINISHED");\r
 \r
+       set_tracing(FALSE);\r
 }\r
 \r
 \r
@@ -1075,7 +1078,7 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
                        };\r
 \r
                        if(mifare_classic_halt(NULL, cuid)) {\r
-                               if (MF_DBGLEVEL >= 1)   Dbprintf("Halt error");\r
+                               if (MF_DBGLEVEL >= 4)   Dbprintf("INFO - Tag answered the 'Halt' command");\r
                                break;\r
                        };\r
                };      \r
@@ -1111,7 +1114,7 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        \r
                if (workFlags & 0x04) {\r
                        if (mifare_classic_halt(NULL, cuid)) {\r
-                               if (MF_DBGLEVEL >= 1)   Dbprintf("Halt error");\r
+                               if (MF_DBGLEVEL >= 4)   Dbprintf("INFO - Tag answered the 'Halt' command");\r
                                break;\r
                        };\r
                }\r
@@ -1127,6 +1130,7 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        if ((workFlags & 0x10) || (!isOK)) {\r
                FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
                LEDsoff();\r
+               set_tracing(FALSE);\r
        }\r
 }\r
 \r
@@ -1138,6 +1142,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        // bit 2 - need HALT after sequence\r
        // bit 3 - need init FPGA and field before sequence\r
        // bit 4 - need reset FPGA and LED\r
+       // bit 5 - need to set datain instead of issuing USB reply (called via ARM for StandAloneMode14a)\r
        uint8_t workFlags = arg0;\r
        uint8_t blockNo = arg2;\r
        \r
@@ -1187,7 +1192,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
                \r
                if (workFlags & 0x04) {\r
                        if (mifare_classic_halt(NULL, cuid)) {\r
-                               if (MF_DBGLEVEL >= 1)   Dbprintf("Halt error");\r
+                               if (MF_DBGLEVEL >= 4)   Dbprintf("INFO - Tag answered the 'Halt' command");\r
                                break;\r
                        };\r
                }\r
@@ -1197,12 +1202,18 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        }\r
        \r
        LED_B_ON();\r
+       if (workFlags & 0x20) {\r
+               if (isOK)\r
+                       memcpy(datain, data, 18);\r
+       }\r
+       else\r
        cmd_send(CMD_ACK,isOK,0,0,data,18);\r
        LED_B_OFF();\r
 \r
        if ((workFlags & 0x10) || (!isOK)) {\r
                FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
                LEDsoff();\r
+               set_tracing(FALSE);\r
        }\r
 }\r
 \r
@@ -1228,9 +1239,8 @@ void MifareCIdent(){
                isOK = 0;\r
        };\r
 \r
-       if (mifare_classic_halt(NULL, 0)) {\r
-               isOK = 0;\r
-       };\r
+       // removed the if,  since some magic tags misbehavies and send an answer to it.\r
+       mifare_classic_halt(NULL, 0);\r
 \r
        cmd_send(CMD_ACK,isOK,0,0,0,0);\r
 }\r
@@ -1254,11 +1264,10 @@ void MifareCollectNonces(uint32_t arg0, uint32_t arg1){
        LED_B_OFF();\r
        LED_C_OFF();\r
        \r
-iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+       iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
        clear_trace();\r
        set_tracing(TRUE);\r
-       \r
-       \r
+               \r
        for (int i = 0; i < iterations; i++) {\r
                                                \r
                WDT_HIT();\r
@@ -1301,6 +1310,7 @@ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
        }\r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
+       set_tracing(FALSE);\r
 }\r
 \r
 //\r
Impressum, Datenschutz