]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlft55xx.c
FIX: hf mfu dump, now reads correct memory from device-side.
[proxmark3-svn] / client / cmdlft55xx.c
index 1a0c0f584cb6b0db0762039ecc098cc860f2bd64..d4b72b3279bbbaf0844f0703334c1d016d6c4176 100644 (file)
@@ -262,37 +262,33 @@ int CmdT55xxReadBlock(const char *Cmd) {
 \r
 bool DecodeT55xxBlock(){\r
        \r
-       char buf[10] = {0x00};\r
+       char buf[30] = {0x00};\r
        char *cmdStr = buf;\r
        int ans = 0;\r
        uint8_t bitRate[8] = {8,16,32,40,50,64,100,128};\r
-\r
        DemodBufferLen = 0x00;\r
 \r
+       //trim 1/2 a clock from beginning\r
+       snprintf(cmdStr, sizeof(buf),"%d", bitRate[config.bitrate]/2 );\r
+       CmdLtrim(cmdStr);\r
        switch( config.modulation ){\r
                case DEMOD_FSK:\r
-                       snprintf(cmdStr, sizeof(buf),"%d", bitRate[config.bitrate]/2 );\r
-                       CmdLtrim(cmdStr);                       \r
                        snprintf(cmdStr, sizeof(buf),"%d %d", bitRate[config.bitrate], config.inverted );\r
                        ans = FSKrawDemod(cmdStr, FALSE);\r
                        break;\r
                case DEMOD_FSK1:\r
                case DEMOD_FSK1a:\r
-                       snprintf(cmdStr, sizeof(buf),"%d", bitRate[config.bitrate]/2 );\r
-                       CmdLtrim(cmdStr);                       \r
                        snprintf(cmdStr, sizeof(buf),"%d %d 8 5", bitRate[config.bitrate], config.inverted );\r
                        ans = FSKrawDemod(cmdStr, FALSE);\r
                        break;\r
                case DEMOD_FSK2:\r
                case DEMOD_FSK2a:\r
-                       snprintf(cmdStr, sizeof(buf),"%d", bitRate[config.bitrate]/2 );\r
-                       CmdLtrim(cmdStr);                       \r
                        snprintf(cmdStr, sizeof(buf),"%d %d 10 8", bitRate[config.bitrate], config.inverted );\r
                        ans = FSKrawDemod(cmdStr, FALSE);\r
                        break;\r
                case DEMOD_ASK:\r
                        snprintf(cmdStr, sizeof(buf),"%d %d 0", bitRate[config.bitrate], config.inverted );\r
-                       ans = ASKmanDemod(cmdStr, FALSE, FALSE);\r
+                       ans = ASKDemod(cmdStr, FALSE, FALSE, 1);\r
                        break;\r
                case DEMOD_PSK1:\r
                        snprintf(cmdStr, sizeof(buf),"%d %d 0", bitRate[config.bitrate], config.inverted );\r
@@ -339,114 +335,141 @@ bool tryDetectModulation(){
        char cmdStr[8] = {0};\r
        uint8_t hits = 0;\r
        t55xx_conf_block_t tests[15];\r
-       \r
+       int bitRate=0;\r
+       uint8_t fc1 = 0, fc2 = 0, clk=0;\r
+       save_restoreGB(1);\r
        if (GetFskClock("", FALSE, FALSE)){ \r
-               uint8_t fc1 = 0, fc2 = 0, clk=0;\r
                fskClocks(&fc1, &fc2, &clk, FALSE);\r
                sprintf(cmdStr,"%d", clk/2);\r
                CmdLtrim(cmdStr);\r
-               if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset)){\r
+               if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate)){\r
                        tests[hits].modulation = DEMOD_FSK;\r
                        if (fc1==8 && fc2 == 5)\r
                                tests[hits].modulation = DEMOD_FSK1a;\r
                        else if (fc1==10 && fc2 == 8)\r
                                tests[hits].modulation = DEMOD_FSK2;\r
-\r
+                       tests[hits].bitrate = bitRate;\r
                        tests[hits].inverted = FALSE;\r
                        tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                        ++hits;\r
                }\r
-               if ( FSKrawDemod("0 1", FALSE) && test(DEMOD_FSK, &tests[hits].offset)) {\r
+               if ( FSKrawDemod("0 1", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate)) {\r
                        tests[hits].modulation = DEMOD_FSK;\r
-                       if (fc1==8 && fc2 == 5)\r
+                       if (fc1 == 8 && fc2 == 5)\r
                                tests[hits].modulation = DEMOD_FSK1;\r
-                       else if (fc1==10 && fc2 == 8)\r
+                       else if (fc1 == 10 && fc2 == 8)\r
                                tests[hits].modulation = DEMOD_FSK2a;\r
 \r
+                       tests[hits].bitrate = bitRate;\r
                        tests[hits].inverted = TRUE;\r
                        tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                        ++hits;\r
                }\r
        } else {\r
-               if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test(DEMOD_ASK, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_ASK;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+               clk = GetAskClock("", FALSE, FALSE);\r
+               if (clk>0) {\r
+                       sprintf(cmdStr,"%d", clk/2);\r
+                       CmdLtrim(cmdStr);\r
+                       if ( ASKDemod("0 0 0", FALSE, FALSE, 1) && test(DEMOD_ASK, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_ASK;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = FALSE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
                        }\r
-\r
-               if ( ASKmanDemod("0 1 1", FALSE, FALSE)  && test(DEMOD_ASK, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_ASK;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+                       if ( ASKDemod("0 1 0", FALSE, FALSE, 1)  && test(DEMOD_ASK, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_ASK;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
+                       }\r
+                       if ( ASKbiphaseDemod("0 0 0 0", FALSE) && test(DEMOD_BI, &tests[hits].offset, &bitRate) ) {\r
+                               tests[hits].modulation = DEMOD_BI;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = FALSE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
+                       }\r
+                       if ( ASKbiphaseDemod("0 0 1 0", FALSE) && test(DEMOD_BIa, &tests[hits].offset, &bitRate) ) {\r
+                               tests[hits].modulation = DEMOD_BIa;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
                        }\r
-               \r
-               if ( NRZrawDemod("0 0 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_NRZ;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
                }\r
+               //undo trim from ask\r
+               save_restoreGB(0);\r
+               clk = GetNrzClock("", FALSE, FALSE);\r
+               if (clk>0) {\r
+                       sprintf(cmdStr,"%d", clk/2);\r
+                       CmdLtrim(cmdStr);\r
+                       if ( NRZrawDemod("0 0 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_NRZ;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = FALSE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
+                       }\r
 \r
-               if ( NRZrawDemod("0 1 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_NRZ;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+                       if ( NRZrawDemod("0 1 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_NRZ;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
                        }\r
-               \r
-               if ( PSKDemod("0 0 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_PSK1;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
                }\r
                \r
-               if ( PSKDemod("0 1 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_PSK1;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
-               }\r
-\r
-               // PSK2 - needs a call to psk1TOpsk2.\r
-               if ( PSKDemod("0 0 1", FALSE)) {\r
-                       psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
-                       if (test(DEMOD_PSK2, &tests[hits].offset)){\r
-                               tests[hits].modulation = DEMOD_PSK2;\r
+               //undo trim from nrz\r
+               save_restoreGB(0);\r
+               clk = GetPskClock("", FALSE, FALSE);\r
+               if (clk>0) {\r
+                       PrintAndLog("clk %d",clk);\r
+                       sprintf(cmdStr,"%d", clk/2);\r
+                       CmdLtrim(cmdStr);       \r
+                       if ( PSKDemod("0 0 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_PSK1;\r
+                               tests[hits].bitrate = bitRate;\r
                                tests[hits].inverted = FALSE;\r
                                tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                                ++hits;\r
                        }\r
-               } // inverse waves does not affect this demod\r
-\r
-               // PSK3 - needs a call to psk1TOpsk2.\r
-               if ( PSKDemod("0 0 1", FALSE)) {\r
-                       psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
-                       if (test(DEMOD_PSK3, &tests[hits].offset)){\r
-                               tests[hits].modulation = DEMOD_PSK3;\r
-                               tests[hits].inverted = FALSE;\r
+                       if ( PSKDemod("0 1 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_PSK1;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
                                tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                                ++hits;\r
                        }\r
-               } // inverse waves does not affect this demod\r
-       \r
-               if ( ASKbiphaseDemod("0 0 0 1", FALSE) && test(DEMOD_BI, &tests[hits].offset) ) {\r
-                       tests[hits].modulation = DEMOD_BI;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
-               }\r
-               if ( ASKbiphaseDemod("0 0 1 1", FALSE) && test(DEMOD_BIa, &tests[hits].offset) ) {\r
-                       tests[hits].modulation = DEMOD_BIa;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+                       // PSK2 - needs a call to psk1TOpsk2.\r
+                       if ( PSKDemod("0 0 1", FALSE)) {\r
+                               psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+                               if (test(DEMOD_PSK2, &tests[hits].offset, &bitRate)){\r
+                                       tests[hits].modulation = DEMOD_PSK2;\r
+                                       tests[hits].bitrate = bitRate;\r
+                                       tests[hits].inverted = FALSE;\r
+                                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                                       ++hits;\r
+                               }\r
+                       } // inverse waves does not affect this demod\r
+                       // PSK3 - needs a call to psk1TOpsk2.\r
+                       if ( PSKDemod("0 0 1", FALSE)) {\r
+                               psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+                               if (test(DEMOD_PSK3, &tests[hits].offset, &bitRate)){\r
+                                       tests[hits].modulation = DEMOD_PSK3;\r
+                                       tests[hits].bitrate = bitRate;\r
+                                       tests[hits].inverted = FALSE;\r
+                                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                                       ++hits;\r
+                               }\r
+                       } // inverse waves does not affect this demod\r
                }\r
        }               \r
        if ( hits == 1) {\r
                config.modulation = tests[0].modulation;\r
+               config.bitrate = tests[0].bitrate;\r
                config.inverted = tests[0].inverted;\r
                config.offset = tests[0].offset;\r
                config.block0 = tests[0].block0;\r
@@ -506,35 +529,27 @@ bool testBitRate(uint8_t readRate, uint8_t mod){
                case DEMOD_FSK2:\r
                case DEMOD_FSK2a:\r
                        detRate = GetFskClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate) \r
                                return TRUE;\r
-                       }\r
                        break;\r
                case DEMOD_ASK:\r
                case DEMOD_BI:\r
                case DEMOD_BIa:\r
                        detRate = GetAskClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate) \r
                                return TRUE;\r
-                       }\r
                        break;\r
                case DEMOD_PSK1:\r
                case DEMOD_PSK2:\r
                case DEMOD_PSK3:\r
                        detRate = GetPskClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate)\r
                                return TRUE;\r
-                       }\r
                        break;\r
                case DEMOD_NRZ:\r
                        detRate = GetNrzClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate)\r
                                return TRUE;\r
-                       }\r
                        break;\r
                default:\r
                        return FALSE;\r
@@ -542,9 +557,9 @@ bool testBitRate(uint8_t readRate, uint8_t mod){
        return FALSE;\r
 }\r
 \r
-bool test(uint8_t mode, uint8_t *offset){\r
+bool test(uint8_t mode, uint8_t *offset, int *fndBitRate){\r
 \r
-       if ( !DemodBufferLen) return FALSE;\r
+       if ( DemodBufferLen < 64 ) return FALSE;\r
        uint8_t si = 0;\r
        for (uint8_t idx = 0; idx < 64; idx++){\r
                si = idx;\r
@@ -557,7 +572,8 @@ bool test(uint8_t mode, uint8_t *offset){
                if ( resv > 0x00) continue;\r
 \r
                uint8_t xtRate   = PackBits(si, 3, DemodBuffer); si += 3;     //extended mode part of rate\r
-               uint8_t bitRate  = PackBits(si, 3, DemodBuffer); si += 3;     //bit rate\r
+               int bitRate  = PackBits(si, 3, DemodBuffer); si += 3;     //bit rate\r
+               if (bitRate > 7) continue;\r
                uint8_t extend   = PackBits(si, 1, DemodBuffer); si += 1;     //bit 15 extended mode\r
                uint8_t modread  = PackBits(si, 5, DemodBuffer); si += 5+2+1; \r
                //uint8_t pskcr   = PackBits(si, 2, DemodBuffer); si += 2+1;  //could check psk cr\r
@@ -573,6 +589,7 @@ bool test(uint8_t mode, uint8_t *offset){
                //test modulation\r
                if (!testModulation(mode, modread)) continue;\r
                if (!testBitRate(bitRate, mode)) continue;\r
+               *fndBitRate = bitRate;\r
                *offset = idx;\r
                return TRUE;\r
        }\r
@@ -719,7 +736,7 @@ int CmdT55xxReadTrace(const char *Cmd)
        PrintAndLog(" CID                                     : 0x%02X (%d) - %s", cid, cid, GetModelStrFromCID(cid));\r
        PrintAndLog(" ICR IC Revision                         : %d",icr );\r
        PrintAndLog(" Manufactured");\r
-       PrintAndLog("     Year/Quarter : 20?%d/%d",year, quarter);\r
+       PrintAndLog("     Year/Quarter : %d/%d",year, quarter);\r
        PrintAndLog("     Lot ID       : %d", lotid );\r
        PrintAndLog("     Wafer number : %d", wafer);\r
        PrintAndLog("     Die Number   : %d", dw);\r
@@ -762,10 +779,10 @@ int CmdT55xxInfo(const char *Cmd){
        \r
        if (strlen(Cmd)==0)\r
                AquireData( CONFIGURATION_BLOCK );\r
-       \r
+\r
        if (!DecodeT55xxBlock()) return 1;\r
 \r
-       if ( !DemodBufferLen) return 1;\r
+       if ( DemodBufferLen < 32) return 1;\r
 \r
        uint8_t si = config.offset;\r
        uint32_t bl0      = PackBits(si, 32, DemodBuffer);\r
@@ -875,7 +892,8 @@ int AquireData( uint8_t block ){
 }\r
 \r
 char * GetBitRateStr(uint32_t id){\r
-       static char buf[20];\r
+       static char buf[25];\r
+\r
        char *retStr = buf;\r
                switch (id){\r
                case 0: \r
@@ -955,7 +973,7 @@ char * GetModulationStr( uint32_t id){
                        snprintf(retStr,sizeof(buf),"%d - FSK 2a RF/10  RF/8",id);\r
                        break;\r
                case 8:\r
-                       snprintf(retStr,sizeof(buf),"%d - Manschester",id);\r
+                       snprintf(retStr,sizeof(buf),"%d - Manchester",id);\r
                        break;\r
                case 16:\r
                        snprintf(retStr,sizeof(buf),"%d - Biphase",id);\r
Impressum, Datenschutz