]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlft55xx.c
ADD: some more keys found on a pastebin
[proxmark3-svn] / client / cmdlft55xx.c
index 564ad29dbeb3ba29ccd98cb1c2c79f83a0d7a804..3b56881b7247cf459b47fab12492956bb99ba58d 100644 (file)
@@ -28,6 +28,7 @@
 \r
 #define CONFIGURATION_BLOCK 0x00\r
 #define TRACE_BLOCK 0x01\r
+#define T55x7_PWD      0x00000010\r
 \r
 // Default configuration\r
 t55xx_conf_block_t config = { .modulation = DEMOD_ASK, .inverted = FALSE, .offset = 0x00, .block0 = 0x00};\r
@@ -37,7 +38,7 @@ int usage_t55xx_config(){
        PrintAndLog("Options:        ");\r
        PrintAndLog("       h                        This help");\r
        PrintAndLog("       b <8|16|32|40|50|64|100|128>     Set bitrate");\r
-       PrintAndLog("       d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NZ|BI|BIa>  Set demodulation FSK / ASK / PSK / NZ / Biphase / Biphase A");\r
+       PrintAndLog("       d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NRZ|BI|BIa>  Set demodulation FSK / ASK / PSK / NRZ / Biphase / Biphase A");\r
        PrintAndLog("       i [1]                            Invert data signal, defaults to normal");\r
        PrintAndLog("       o [offset]                       Set offset, where data should start decode in bitstream");\r
        PrintAndLog("");\r
@@ -61,13 +62,13 @@ int usage_t55xx_read(){
 }\r
 int usage_t55xx_write(){\r
        PrintAndLog("Usage:  lf t55xx wr <block> <data> [password]");\r
-    PrintAndLog("     <block>, block number to read. Between 0-7");\r
+       PrintAndLog("     <block>, block number to write. Between 0-7");\r
        PrintAndLog("     <data>,  4 bytes of data to write (8 hex characters)");\r
     PrintAndLog("     [password], OPTIONAL password 4bytes (8 hex characters)");\r
     PrintAndLog("");\r
        PrintAndLog("Examples:");\r
-    PrintAndLog("      lf t55xx wd 3 11223344           - write 11223344 to block 3");\r
-       PrintAndLog("      lf t55xx wd 3 11223344 feedbeef  - write 11223344 to block 3 password feedbeef");\r
+       PrintAndLog("      lf t55xx wr 3 11223344           - write 11223344 to block 3");\r
+       PrintAndLog("      lf t55xx wr 3 11223344 feedbeef  - write 11223344 to block 3 password feedbeef");\r
        PrintAndLog("");\r
        return 0;\r
 }\r
@@ -219,14 +220,11 @@ int CmdT55xxReadBlock(const char *Cmd) {
        int password = 0xFFFFFFFF; //default to blank Block 7\r
 \r
        char cmdp = param_getchar(Cmd, 0);\r
-       if (cmdp == 'h' || cmdp == 'H')\r
-               return usage_t55xx_read();\r
+       if (cmdp == 'h' || cmdp == 'H') return usage_t55xx_read();\r
 \r
        int res = sscanf(Cmd, "%d %x", &block, &password);\r
 \r
-       if ( res < 1 || res > 2 )\r
-               return usage_t55xx_read();\r
-\r
+       if ( res < 1 || res > 2 ) return usage_t55xx_read();\r
        \r
        if ((block < 0) | (block > 7)) {\r
                PrintAndLog("Block must be between 0 and 7");\r
@@ -238,10 +236,23 @@ int CmdT55xxReadBlock(const char *Cmd) {
 \r
        //Password mode\r
        if ( res == 2 ) {\r
-               c.arg[2] = password;\r
-               c.d.asBytes[0] = 0x1; \r
+               \r
+               // try reading the config block and verify that PWD bit is set before doing this!\r
+               AquireData( CONFIGURATION_BLOCK );\r
+               if ( !tryDetectModulation() ) {\r
+                       PrintAndLog("Could not detect is PWD bit is set in config block. Exits.");\r
+                       return 1;\r
+               }\r
+               //if PWD bit is set,  allow to execute read command with password.\r
+               if (( config.block0 & T55x7_PWD ) == 1) {\r
+                       c.arg[2] = password;\r
+                       c.d.asBytes[0] = 0x1;                   \r
+               } else {                \r
+                       PrintAndLog("PWD bit is NOT set in config block. Reading without password...");\r
+               }\r
        }\r
 \r
+       clearCommandBuffer();\r
        SendCommand(&c);\r
        if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {\r
                PrintAndLog("command execution time out");\r
@@ -251,8 +262,8 @@ int CmdT55xxReadBlock(const char *Cmd) {
        uint8_t got[12000];\r
        GetFromBigBuf(got,sizeof(got),0);\r
        WaitForResponse(CMD_ACK,NULL);\r
-       setGraphBuf(got, 12000);\r
-       DemodBufferLen=0;\r
+       setGraphBuf(got, sizeof(got));\r
+       //DemodBufferLen=0;\r
        if (!DecodeT55xxBlock()) return 3;\r
        char blk[10]={0};\r
        sprintf(blk,"%d", block);\r
@@ -269,9 +280,8 @@ bool DecodeT55xxBlock(){
        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
-\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 %d", bitRate[config.bitrate], config.inverted );\r
@@ -333,15 +343,16 @@ int CmdT55xxDetect(const char *Cmd){
 \r
 // detect configuration?\r
 bool tryDetectModulation(){\r
-       char cmdStr[8] = {0};\r
+       //char cmdStr[8] = {0};\r
        uint8_t hits = 0;\r
        t55xx_conf_block_t tests[15];\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
+               //sprintf(cmdStr,"%d", clk/2);\r
+               //CmdLtrim(cmdStr);\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
@@ -366,91 +377,105 @@ bool tryDetectModulation(){
                        ++hits;\r
                }\r
        } else {\r
-               if ( ASKDemod("0 0 1", 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 ( ASKDemod("0 1 1", 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
-               \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
+               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
+                       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
+               //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, &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, &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
+                       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
                \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
-\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
+               //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, &bitRate)){\r
-                               tests[hits].modulation = DEMOD_PSK3;\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 = FALSE;\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, &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 1", 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
+                       // 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
@@ -656,6 +681,7 @@ int CmdT55xxWriteBlock(const char *Cmd)
        }\r
        \r
        UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {data, block, 0}};\r
+       UsbCommand resp;\r
        c.d.asBytes[0] = 0x0; \r
 \r
        PrintAndLog("Writing to block: %d  data  : 0x%08X", block, data);\r
@@ -666,7 +692,12 @@ int CmdT55xxWriteBlock(const char *Cmd)
                c.d.asBytes[0] = 0x1; \r
                PrintAndLog("pwd   : 0x%08X", password);\r
        }\r
+       clearCommandBuffer();\r
        SendCommand(&c);\r
+       if (!WaitForResponseTimeout(CMD_ACK, &resp, 1000)){\r
+               PrintAndLog("Error occurred, device did not ACK write operation. (May be due to old firmware)");\r
+               return -1;\r
+       }\r
        return 0;\r
 }\r
 \r
@@ -864,6 +895,7 @@ int AquireData( uint8_t block ){
                // c.d.asBytes[0] = 0x1; \r
        // }\r
 \r
+       clearCommandBuffer();\r
        SendCommand(&c);\r
        if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {\r
                PrintAndLog("command execution time out");\r
@@ -1036,6 +1068,13 @@ char * GetSelectedModulationStr( uint8_t id){
        return buf;\r
 }\r
 \r
+void t55x7_create_config_block( int tagtype ){\r
+       //switch?\r
+       \r
+       \r
+}\r
+\r
+/*\r
 uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits){\r
        \r
        int i = start;\r
@@ -1049,7 +1088,7 @@ uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits){
 \r
        return tmp;\r
 }\r
-\r
+*/\r
 static command_t CommandTable[] =\r
 {\r
   {"help",   CmdHelp,           1, "This help"},\r
Impressum, Datenschutz