]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlft55xx.c
Cleanup Code
[proxmark3-svn] / client / cmdlft55xx.c
index 8ab1892daf715ad18c64a01e0991c64d781c916d..ed980f9b783f1af639f94c24ca843c13d1ff1029 100644 (file)
@@ -7,24 +7,24 @@
 // Low frequency T55xx commands\r
 //-----------------------------------------------------------------------------\r
 \r
+#include "cmdlft55xx.h"\r
+\r
 #include <stdio.h>\r
 #include <string.h>\r
 #include <inttypes.h>\r
 #include <ctype.h>\r
 #include <time.h>\r
-#include "proxmark3.h"\r
+#include "comms.h"\r
 #include "ui.h"\r
 #include "graph.h"\r
 #include "cmdmain.h"\r
 #include "cmdparser.h"\r
 #include "cmddata.h"\r
 #include "cmdlf.h"\r
-#include "cmdlft55xx.h"\r
 #include "util.h"\r
-#include "data.h"\r
 #include "lfdemod.h"\r
-#include "cmdhf14a.h" //for getTagInfo\r
 #include "protocols.h"\r
+#include "taginfo.h"\r
 \r
 #define T55x7_CONFIGURATION_BLOCK 0x00\r
 #define T55x7_PAGE0 0x00\r
@@ -67,6 +67,8 @@ int usage_t55xx_read(){
        PrintAndLog("     p <password> - OPTIONAL password (8 hex characters)");\r
        PrintAndLog("     o            - OPTIONAL override safety check");\r
        PrintAndLog("     1            - OPTIONAL read Page 1 instead of Page 0");\r
+       PrintAndLog("     r <mode>     - OPTIONAL downlink encoding '0' fixed bit length (default), '1' long leading reference");\r
+       PrintAndLog("                                               '2' leading zero,               '3' 1 of 4 coding reference"); \r
        PrintAndLog("     ****WARNING****");\r
        PrintAndLog("     Use of read with password on a tag not configured for a pwd");\r
        PrintAndLog("     can damage the tag");\r
@@ -86,6 +88,8 @@ int usage_t55xx_write(){
        PrintAndLog("     p <password> - OPTIONAL password 4bytes (8 hex characters)");\r
        PrintAndLog("     1            - OPTIONAL write Page 1 instead of Page 0");\r
        PrintAndLog("     t            - OPTIONAL test mode write - ****DANGER****");   \r
+       PrintAndLog("     r <mode>     - OPTIONAL downlink encoding '0' fixed bit length (default), '1' long leading reference");\r
+       PrintAndLog("                                               '2' leading zero,               '3' 1 of 4 coding reference"); \r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx write b 3 d 11223344            - write 11223344 to block 3");\r
@@ -132,6 +136,8 @@ int usage_t55xx_detect(){
        PrintAndLog("Options:");\r
        PrintAndLog("     1             - if set, use Graphbuffer otherwise read data from tag.");\r
        PrintAndLog("     p <password>  - OPTIONAL password (8 hex characters)");\r
+       PrintAndLog("     r <mode>      - OPTIONAL downlink encoding '0' fixed bit length (default), '1' long leading reference");\r
+       PrintAndLog("                                                '2' leading zero,               '3' 1 of 4 coding reference"); \r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx detect");\r
@@ -162,7 +168,7 @@ int usage_t55xx_wakup(){
        PrintAndLog("     <password>  - [required] password 4bytes (8 hex symbols)");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
-               PrintAndLog("      lf t55xx wakeup 11223344  - send wakeup password");\r
+       PrintAndLog("      lf t55xx wakeup 11223344  - send wakeup password");\r
        return 0;\r
 }\r
 int usage_t55xx_bruteforce(){\r
@@ -172,13 +178,16 @@ int usage_t55xx_bruteforce(){
        PrintAndLog("       password must be 4 bytes (8 hex symbols)");\r
        PrintAndLog("Options:");\r
        PrintAndLog("     h           - this help");\r
+       PrintAndLog("     r <mode>    - OPTIONAL downlink encoding '0' fixed bit length (default)"); \r
+       PrintAndLog("                                  '1' long leading reference,  '2' leading zero ");\r
+       PrintAndLog("                                  '3' 1 of 4 coding reference, '4' special - try all downlink modes");\r
        PrintAndLog("     <start_pwd> - 4 byte hex value to start pwd search at");\r
        PrintAndLog("     <end_pwd>   - 4 byte hex value to end pwd search at");\r
        PrintAndLog("     i <*.dic>   - loads a default keys dictionary file <*.dic>");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
-       PrintAndLog("       lf t55xx bruteforce aaaaaaaa bbbbbbbb");\r
-       PrintAndLog("       lf t55xx bruteforce i default_pwd.dic");\r
+       PrintAndLog("       lf t55xx bruteforce [r 2] aaaaaaaa bbbbbbbb");\r
+       PrintAndLog("       lf t55xx bruteforce [r 2] i default_pwd.dic");\r
        PrintAndLog("");\r
        return 0;\r
 }\r
@@ -207,7 +216,7 @@ void printT5xxHeader(uint8_t page){
 int CmdT55xxSetConfig(const char *Cmd) {\r
 \r
        uint8_t offset = 0;\r
-       char modulation[5] = {0x00};\r
+       char modulation[6] = {0x00};\r
        char tmp = 0x00;\r
        uint8_t bitRate = 0;\r
        uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};\r
@@ -236,7 +245,7 @@ int CmdT55xxSetConfig(const char *Cmd) {
                        cmdp+=2;\r
                        break;\r
                case 'd':\r
-                       param_getstr(Cmd, cmdp+1, modulation);\r
+                       param_getstr(Cmd, cmdp+1, modulation, sizeof(modulation));\r
                        cmdp += 2;\r
 \r
                        if ( strcmp(modulation, "FSK" ) == 0) {\r
@@ -311,12 +320,12 @@ int CmdT55xxSetConfig(const char *Cmd) {
        return printConfiguration ( config );\r
 }\r
 \r
-int T55xxReadBlock(uint8_t block, bool page1, bool usepwd, bool override, uint32_t password){\r
+int T55xxReadBlock(uint8_t block, bool page1, bool usepwd, bool override, uint32_t password, uint8_t downlink_mode){\r
        //Password mode\r
        if ( usepwd ) {\r
                // try reading the config block and verify that PWD bit is set before doing this!\r
                if ( !override ) {\r
-                       if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, false, 0 ) ) return 0;\r
+                       if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, false, 0,downlink_mode ) ) return 0;\r
                        if ( !tryDetectModulation() ) {\r
                                PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits.");\r
                                return 0;\r
@@ -330,7 +339,7 @@ int T55xxReadBlock(uint8_t block, bool page1, bool usepwd, bool override, uint32
                }\r
        }\r
 \r
-       if (!AquireData(page1, block, usepwd, password) )       return 0;\r
+       if (!AquireData(page1, block, usepwd, password,downlink_mode) ) return 0;\r
        if (!DecodeT55xxBlock()) return 0;\r
 \r
        char blk[10]={0};\r
@@ -342,6 +351,8 @@ int T55xxReadBlock(uint8_t block, bool page1, bool usepwd, bool override, uint32
 int CmdT55xxReadBlock(const char *Cmd) {\r
        uint8_t block = REGULAR_READ_MODE_BLOCK;\r
        uint32_t password = 0; //default to blank Block 7\r
+       uint8_t downlink_mode = 0;\r
+       \r
        bool usepwd = false;\r
        bool override = false;\r
        bool page1 = false;\r
@@ -372,6 +383,12 @@ int CmdT55xxReadBlock(const char *Cmd) {
                        page1 = true;\r
                        cmdp++;\r
                        break;\r
+               case 'r':\r
+               case 'R':\r
+                       downlink_mode = param_getchar(Cmd, cmdp+1) - '0';\r
+                       if (downlink_mode > 3) downlink_mode = 0;\r
+                       cmdp +=2;\r
+                       break;\r
                default:\r
                        PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
                        errors = true;\r
@@ -386,7 +403,7 @@ int CmdT55xxReadBlock(const char *Cmd) {
        }\r
 \r
        printT5xxHeader(page1);\r
-       return T55xxReadBlock(block, page1, usepwd, override, password);\r
+       return T55xxReadBlock(block, page1, usepwd, override, password, downlink_mode);\r
 }\r
 \r
 bool DecodeT55xxBlock(){\r
@@ -419,23 +436,23 @@ bool DecodeT55xxBlock(){
                        break;\r
                case DEMOD_PSK1:\r
                        // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
-                       save_restoreGB(1);\r
+                       save_restoreGB(GRAPH_SAVE);\r
                        CmdLtrim("160");\r
                        snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );\r
                        ans = PSKDemod(cmdStr, false);\r
                        //undo trim samples\r
-                       save_restoreGB(0);\r
+                       save_restoreGB(GRAPH_RESTORE);\r
                        break;\r
                case DEMOD_PSK2: //inverted won't affect this\r
                case DEMOD_PSK3: //not fully implemented\r
                        // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
-                       save_restoreGB(1);\r
+                       save_restoreGB(GRAPH_SAVE);\r
                        CmdLtrim("160");\r
                        snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );\r
                        ans = PSKDemod(cmdStr, false);\r
                        psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
                        //undo trim samples\r
-                       save_restoreGB(0);\r
+                       save_restoreGB(GRAPH_RESTORE);\r
                        break;\r
                case DEMOD_NRZ:\r
                        snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );\r
@@ -465,6 +482,7 @@ int CmdT55xxDetect(const char *Cmd){
        bool usepwd = false;\r
        uint32_t password = 0;\r
        uint8_t cmdp = 0;\r
+       uint8_t downlink_mode = 0;\r
 \r
        while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {\r
                switch(param_getchar(Cmd, cmdp)) {\r
@@ -482,6 +500,12 @@ int CmdT55xxDetect(const char *Cmd){
                        useGB = true;\r
                        cmdp++;\r
                        break;\r
+               case 'r':\r
+               case 'R':\r
+                       downlink_mode = param_getchar(Cmd, cmdp+1) - '0';\r
+                       if (downlink_mode > 3) downlink_mode = 0;\r
+                       cmdp +=2;\r
+                       break;                  \r
                default:\r
                        PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
                        errors = true;\r
@@ -491,13 +515,21 @@ int CmdT55xxDetect(const char *Cmd){
        if (errors) return usage_t55xx_detect();\r
        \r
        if ( !useGB) {\r
-               if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, usepwd, password) )\r
+               if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, usepwd, password,downlink_mode) )\r
                        return 0;\r
        }\r
        \r
        if ( !tryDetectModulation() )\r
                PrintAndLog("Could not detect modulation automatically. Try setting it manually with \'lf t55xx config\'");\r
-\r
+       else {\r
+               // Add downlink mode to reference.\r
+               switch (downlink_mode) {\r
+                       case  0 :       PrintAndLog ("Downlink   : r 0 - default/fixed bit length"); break;\r
+                       case  1 :   PrintAndLog ("Downlink   : r 1 - long leading reference"); break;\r
+                       case  2 :   PrintAndLog ("Downlink   : r 2 - leading zero reference"); break;\r
+                       case  3 :   PrintAndLog ("Downlink   : r 3 - 1 of 4 coding reference"); break;\r
+               }\r
+       }\r
        return 1;\r
 }\r
 \r
@@ -507,8 +539,8 @@ bool tryDetectModulation(){
        t55xx_conf_block_t tests[15];\r
        int bitRate=0;\r
        uint8_t fc1 = 0, fc2 = 0, ans = 0;\r
-       int clk=0;\r
-       ans = fskClocks(&fc1, &fc2, (uint8_t *)&clk, false);\r
+       int clk = 0, firstClockEdge = 0;\r
+       ans = fskClocks(&fc1, &fc2, (uint8_t *)&clk, false, &firstClockEdge);\r
        if (ans && ((fc1==10 && fc2==8) || (fc1==8 && fc2==5))) {\r
                if ( FSKrawDemod("0 0", false) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
                        tests[hits].modulation = DEMOD_FSK;\r
@@ -594,7 +626,7 @@ bool tryDetectModulation(){
                clk = GetPskClock("", false, false);\r
                if (clk>0) {\r
                        // allow undo\r
-                       save_restoreGB(1);\r
+                       save_restoreGB(GRAPH_SAVE);\r
                        // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
                        CmdLtrim("160");\r
                        if ( PSKDemod("0 0 6", false) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
@@ -638,7 +670,7 @@ bool tryDetectModulation(){
                                }\r
                        } // inverse waves does not affect this demod\r
                        //undo trim samples\r
-                       save_restoreGB(0);\r
+                       save_restoreGB(GRAPH_RESTORE);\r
                }\r
        }       \r
        if ( hits == 1) {\r
@@ -898,6 +930,8 @@ int CmdT55xxWriteBlock(const char *Cmd) {
        uint8_t block = 0xFF; //default to invalid block\r
        uint32_t data = 0; //default to blank Block \r
        uint32_t password = 0; //default to blank Block 7\r
+       uint32_t downlink_mode = 0;\r
+       \r
        bool usepwd = false;\r
        bool page1 = false;     \r
        bool gotdata = false;\r
@@ -935,6 +969,12 @@ int CmdT55xxWriteBlock(const char *Cmd) {
                        page1 = true;\r
                        cmdp++;\r
                        break;\r
+               case 'r':\r
+               case 'R':\r
+                       downlink_mode = param_getchar(Cmd, cmdp+1) - '0';\r
+                       if (downlink_mode > 3) downlink_mode = 0;\r
+                       cmdp +=2;\r
+                       break;\r
                default:\r
                        PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
                        errors = true;\r
@@ -952,17 +992,19 @@ int CmdT55xxWriteBlock(const char *Cmd) {
        UsbCommand resp;\r
        c.d.asBytes[0] = (page1) ? 0x2 : 0; \r
        c.d.asBytes[0] |= (testMode) ? 0x4 : 0; \r
-\r
+       c.d.asBytes[0] |= (downlink_mode << 3);\r
+       \r
        char pwdStr[16] = {0};\r
        snprintf(pwdStr, sizeof(pwdStr), "pwd: 0x%08X", password);\r
 \r
        PrintAndLog("Writing page %d  block: %02d  data: 0x%08X %s", page1, block, data,  (usepwd) ? pwdStr : "" );\r
-\r
+       \r
        //Password mode\r
        if (usepwd) {\r
                c.arg[2] = password;\r
                c.d.asBytes[0] |= 0x1; \r
        }\r
+       \r
        clearCommandBuffer();\r
        SendCommand(&c);\r
        if (!WaitForResponseTimeout(CMD_ACK, &resp, 1000)){\r
@@ -980,7 +1022,7 @@ int CmdT55xxReadTrace(const char *Cmd) {
                return usage_t55xx_trace();\r
 \r
        if (strlen(Cmd)==0)\r
-               if ( !AquireData( T55x7_PAGE1, REGULAR_READ_MODE_BLOCK, pwdmode, password ) )\r
+               if ( !AquireData( T55x7_PAGE1, REGULAR_READ_MODE_BLOCK, pwdmode, password,0 ) )\r
                        return 0;\r
 \r
        if ( config.Q5 ) {\r
@@ -1070,7 +1112,7 @@ void printT55x7Trace( t55x7_tracedata_t data, uint8_t repeat ){
        PrintAndLog("-- T55x7 Trace Information ----------------------------------");\r
        PrintAndLog("-------------------------------------------------------------");\r
        PrintAndLog(" ACL Allocation class (ISO/IEC 15963-1)  : 0x%02X (%d)", data.acl, data.acl);\r
-       PrintAndLog(" MFC Manufacturer ID (ISO/IEC 7816-6)    : 0x%02X (%d) - %s", data.mfc, data.mfc, getTagInfo(data.mfc));\r
+       PrintAndLog(" MFC Manufacturer ID (ISO/IEC 7816-6)    : 0x%02X (%d) - %s", data.mfc, data.mfc, getManufacturerName(data.mfc));\r
        PrintAndLog(" CID                                     : 0x%02X (%d) - %s", data.cid, data.cid, GetModelStrFromCID(data.cid));\r
        PrintAndLog(" ICR IC Revision                         : %d", data.icr );\r
        PrintAndLog(" Manufactured");\r
@@ -1144,7 +1186,7 @@ int CmdT55xxInfo(const char *Cmd){
                return usage_t55xx_info();\r
        \r
        if (strlen(Cmd)==0)\r
-               if ( !AquireData( T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, pwdmode, password ) )\r
+               if ( !AquireData( T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, pwdmode, password,0 ) )\r
                        return 1;\r
 \r
        if (!DecodeT55xxBlock()) return 1;\r
@@ -1212,20 +1254,21 @@ int CmdT55xxDump(const char *Cmd){
        \r
        printT5xxHeader(0);\r
        for ( uint8_t i = 0; i <8; ++i)\r
-               T55xxReadBlock(i, 0, usepwd, override, password);\r
+               T55xxReadBlock(i, 0, usepwd, override, password,0);\r
 \r
        printT5xxHeader(1);\r
        for ( uint8_t   i = 0; i<4; i++)\r
-               T55xxReadBlock(i, 1, usepwd, override, password);               \r
+               T55xxReadBlock(i, 1, usepwd, override, password,0);             \r
 \r
        return 1;\r
 }\r
 \r
-int AquireData( uint8_t page, uint8_t block, bool pwdmode, uint32_t password ){\r
+int AquireData( uint8_t page, uint8_t block, bool pwdmode, uint32_t password, uint8_t downlink_mode ){\r
        // arg0 bitmodes:\r
        // bit0 = pwdmode\r
        // bit1 = page to read from\r
        uint8_t arg0 = (page<<1) | pwdmode;\r
+       arg0 |= (downlink_mode << 3);\r
        UsbCommand c = {CMD_T55XX_READ_BLOCK, {arg0, block, password}};\r
 \r
        clearCommandBuffer();\r
@@ -1355,8 +1398,7 @@ int CmdResetRead(const char *Cmd) {
        }\r
 \r
        uint8_t got[BIGBUF_SIZE-1];\r
-       GetFromBigBuf(got,sizeof(got),0);\r
-       WaitForResponse(CMD_ACK,NULL);\r
+       GetFromBigBuf(got, sizeof(got), 0, NULL, -1 , 0);\r
        setGraphBuf(got, sizeof(got));\r
        return 1;\r
 }\r
@@ -1404,9 +1446,23 @@ int CmdT55xxBruteForce(const char *Cmd) {
        uint32_t start_password = 0x00000000; //start password\r
        uint32_t end_password   = 0xFFFFFFFF; //end   password\r
        bool found = false;\r
-\r
+       uint8_t downlink_mode = 0;\r
+       bool try_all_dl_modes = false;\r
+       uint8_t dl_mode = 0;\r
+       uint8_t cmd_offset = 0;\r
+       int cmd_opt = 0;\r
+               \r
        char cmdp = param_getchar(Cmd, 0);\r
+       \r
        if (cmdp == 'h' || cmdp == 'H') return usage_t55xx_bruteforce();\r
+       if (cmdp == 'r' || cmdp == 'R') {\r
+               downlink_mode = param_getchar(Cmd, 1) - '0'; // get 2nd option, as this is fixed order.\r
+               if (downlink_mode == 4) try_all_dl_modes = true;\r
+               if (downlink_mode > 3) downlink_mode = 0;\r
+               cmd_opt += 2;    // To help start/end passwords for range to be found\r
+               cmd_offset += 4; // r <sp> x <sp> To help the string offset for filename start position in cmd\r
+               cmdp = param_getchar(Cmd, 2); // get 3rd option, as this is fixed order.\r
+       }\r
 \r
        keyBlock = calloc(stKeyBlock, 6);\r
        if (keyBlock == NULL) return 1;\r
@@ -1415,7 +1471,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
 \r
                int len = strlen(Cmd+2);\r
                if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
-               memcpy(filename, Cmd+2, len);\r
+               memcpy(filename, Cmd+2+cmd_offset, len);\r
 \r
                FILE * f = fopen( filename , "r");\r
 \r
@@ -1433,7 +1489,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
                        //The line start with # is comment, skip\r
                        if( buf[0]=='#' ) continue;\r
 \r
-                       if (!isxdigit(buf[0])) {\r
+                       if (!isxdigit((unsigned char)buf[0])) {\r
                                PrintAndLog("File content error. '%s' must include 8 HEX symbols", buf);\r
                                continue;\r
                        }\r
@@ -1480,20 +1536,32 @@ int CmdT55xxBruteForce(const char *Cmd) {
                        testpwd = bytes_to_num(keyBlock + 4*c, 4);\r
 \r
                        PrintAndLog("Testing %08X", testpwd);\r
+                       \r
+                       // Try each downlink_mode if asked to \r
+                       // donwlink_mode will = 0 if > 3 or set to 0, so loop from 0 - 3\r
+                       for (dl_mode = downlink_mode; dl_mode <= 3; dl_mode++){\r
+                               if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, testpwd, dl_mode)) {\r
+                                       PrintAndLog("Aquireing data from device failed. Quitting");\r
+                                       free(keyBlock);\r
+                                       return 0;\r
+                               }\r
 \r
-                       if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, testpwd)) {\r
-                               PrintAndLog("Aquireing data from device failed. Quitting");\r
-                               free(keyBlock);\r
-                               return 0;\r
-                       }\r
-\r
-                       found = tryDetectModulation();\r
+                               found = tryDetectModulation();\r
 \r
-                       if ( found ) {\r
-                               PrintAndLog("Found valid password: [%08X]", testpwd);\r
-                               free(keyBlock);\r
-                               return 0;\r
-                       }\r
+                               if ( found ) {\r
+                                       PrintAndLog("Found valid password: [%08X]", testpwd);\r
+                                       free(keyBlock);\r
+                                       switch (dl_mode) {\r
+                                               case  0 :       PrintAndLog ("Downlink   : r 0 - default/fixed bit length"); break;\r
+                                               case  1 :   PrintAndLog ("Downlink   : r 1 - long leading reference"); break;\r
+                                               case  2 :   PrintAndLog ("Downlink   : r 2 - leading zero reference"); break;\r
+                                               case  3 :   PrintAndLog ("Downlink   : r 3 - 1 of 4 coding reference"); break;\r
+                                       }                                       \r
+                                       return 0;\r
+                               }\r
+                               if (!try_all_dl_modes) // Exit loop if not trying all downlink modes\r
+                                       dl_mode = 4;\r
+                       }       \r
                }\r
                PrintAndLog("Password NOT found.");\r
                free(keyBlock);\r
@@ -1503,8 +1571,8 @@ int CmdT55xxBruteForce(const char *Cmd) {
        // Try to read Block 7, first :)\r
 \r
        // incremental pwd range search\r
-       start_password = param_get32ex(Cmd, 0, 0, 16);\r
-       end_password = param_get32ex(Cmd, 1, 0, 16);\r
+       start_password = param_get32ex(Cmd, cmd_opt , 0, 16);\r
+       end_password = param_get32ex(Cmd, cmd_opt+1 , 0, 16);\r
 \r
        if ( start_password >= end_password ) {\r
                free(keyBlock);\r
@@ -1525,29 +1593,41 @@ int CmdT55xxBruteForce(const char *Cmd) {
                        free(keyBlock);\r
                        return 0;\r
                }\r
+               // Try each downlink_mode if asked to \r
+               // donwlink_mode will = 0 if > 3 or set to 0, so loop from 0 - 3\r
+               for (dl_mode = downlink_mode; dl_mode <= 3; dl_mode++){\r
+                       if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, i,dl_mode)) {\r
+                               PrintAndLog("Aquireing data from device failed. Quitting");\r
+                               free(keyBlock);\r
+                               return 0;\r
+                       }\r
+                       found = tryDetectModulation();\r
 \r
-               if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, i)) {\r
-                       PrintAndLog("Aquireing data from device failed. Quitting");\r
-                       free(keyBlock);\r
-                       return 0;\r
+                       if (found) break;\r
+                       if (!try_all_dl_modes) // Exit loop if not trying all downlink modes\r
+                               dl_mode = 4;                    \r
                }\r
-               found = tryDetectModulation();\r
-\r
                if (found) break;\r
                i++;\r
        }\r
 \r
-       PrintAndLog("");\r
-\r
-       if (found)\r
+       if (found){\r
                PrintAndLog("Found valid password: [%08x]", i);\r
-       else\r
+               switch (dl_mode) {\r
+                       case  0 :       PrintAndLog ("Downlink   : r 0 - default/fixed bit length"); break;\r
+                       case  1 :   PrintAndLog ("Downlink   : r 1 - long leading reference"); break;\r
+                       case  2 :   PrintAndLog ("Downlink   : r 2 - leading Zero reference"); break;\r
+                       case  3 :   PrintAndLog ("Downlink   : r 3 - 1 of 4 coding reference"); break;\r
+               }\r
+       }\r
+       else{\r
+               PrintAndLog("");\r
                PrintAndLog("Password NOT found. Last tried: [%08x]", --i);\r
+       }\r
 \r
        free(keyBlock);\r
        return 0;\r
 }\r
-\r
 // note length of data returned is different for different chips.  \r
 //   some return all page 1 (64 bits) and others return just that block (32 bits) \r
 //   unfortunately the 64 bits makes this more likely to get a false positive...\r
@@ -1555,16 +1635,16 @@ bool tryDetectP1(bool getData) {
        uint8_t preamble[] = {1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,1};\r
        size_t startIdx = 0;\r
        uint8_t fc1 = 0, fc2 = 0, ans = 0;\r
-       int clk = 0;\r
+       int clk = 0, firstClockEdge = 0;\r
        bool st = true;\r
 \r
        if ( getData ) {\r
-               if ( !AquireData(T55x7_PAGE1, 1, false, 0) )\r
+               if ( !AquireData(T55x7_PAGE1, 1, false, 0,0) )\r
                        return false;\r
        }\r
 \r
        // try fsk clock detect. if successful it cannot be any other type of modulation...  (in theory...)\r
-       ans = fskClocks(&fc1, &fc2, (uint8_t *)&clk, false);\r
+       ans = fskClocks(&fc1, &fc2, (uint8_t *)&clk, false, &firstClockEdge);\r
        if (ans && ((fc1==10 && fc2==8) || (fc1==8 && fc2==5))) {\r
                if ( FSKrawDemod("0 0", false) && \r
                          preambleSearchEx(DemodBuffer,preamble,sizeof(preamble),&DemodBufferLen,&startIdx,false) && \r
@@ -1688,7 +1768,7 @@ int CmdT55xxDetectPage1(const char *Cmd){
        if (errors) return usage_t55xx_detectP1();\r
 \r
        if ( !useGB ) {\r
-               if ( !AquireData(T55x7_PAGE1, 1, usepwd, password) )\r
+               if ( !AquireData(T55x7_PAGE1, 1, usepwd, password,0) )\r
                        return false;\r
        }\r
        bool success = tryDetectP1(false);\r
@@ -1698,7 +1778,7 @@ int CmdT55xxDetectPage1(const char *Cmd){
 \r
 static command_t CommandTable[] = {\r
   {"help",      CmdHelp,           1, "This help"},\r
-       {"bruteforce",CmdT55xxBruteForce,0, "<start password> <end password> [i <*.dic>] Simple bruteforce attack to find password"},\r
+  {"bruteforce",CmdT55xxBruteForce,0, "<start password> <end password> [i <*.dic>] Simple bruteforce attack to find password"},\r
   {"config",    CmdT55xxSetConfig, 1, "Set/Get T55XX configuration (modulation, inverted, offset, rate)"},\r
   {"detect",    CmdT55xxDetect,    1, "[1] Try detecting the tag modulation from reading the configuration block."},\r
   {"p1detect",  CmdT55xxDetectPage1,1, "[1] Try detecting if this is a t55xx tag by reading page 1"},\r
Impressum, Datenschutz