]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
ADD: started to add a offset possibility for the LF T55XX.
authoriceman1001 <iceman@iuse.se>
Sat, 14 Mar 2015 07:43:48 +0000 (08:43 +0100)
committericeman1001 <iceman@iuse.se>
Sat, 14 Mar 2015 07:43:48 +0000 (08:43 +0100)
Ie.
  lf t55xx read 0
  lf t55xx special
  lf t55xx config o 2
  lf t55xx read 0

ADD:  added @marshmellows latest changes to psk

client/cmddata.c
client/cmdlft55xx.c
client/cmdlft55xx.h
common/lfdemod.c

index cea3bcfee9a7b4c46182d1c3cfc66ef0778603f3..9b88d83230c03a54ab728ca51df339cdf6a14b5d 100644 (file)
@@ -1647,7 +1647,7 @@ int PSKDemod(const char *Cmd, bool verbose)
   }
   if (invert != 0 && invert != 1) {
     if (verbose) PrintAndLog("Invalid argument: %s", Cmd);
-    return -1;
+    return 0;
   }
   uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
   size_t BitLen = getFromGraphBuf(BitStream);
@@ -1655,22 +1655,27 @@ int PSKDemod(const char *Cmd, bool verbose)
   uint8_t carrier=countPSK_FC(BitStream, BitLen);
   if (carrier!=2 && carrier!=4 && carrier!=8){
     //invalid carrier
-    return -1;
+    return 0;
   }
   int errCnt=0;
   errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert);
   if (errCnt > maxErr){
     if (g_debugMode==1 && verbose) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
-    return -1;
+    return 0;
   } 
   if (errCnt<0|| BitLen<16){  //throw away static - allow 1 and -1 (in case of threshold command first)
     if (g_debugMode==1 && verbose) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
-    return -1;
+    return 0;
+  }
+  if (verbose) {
+         PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
+         if (errCnt>0){
+                       PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
+         }
   }
-  if (verbose) PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
   //prime demod buffer for output
   setDemodBuf(BitStream,BitLen,0);
-  return errCnt;
+  return 1;
 }
 
 // Indala 26 bit decode
@@ -1685,7 +1690,7 @@ int CmdIndalaDecode(const char *Cmd)
                ans = PSKDemod("32", 0);
        }
 
-       if (ans < 0){
+       if ( !ans ){
                if (g_debugMode==1) 
                        PrintAndLog("Error1: %d",ans);
                return 0;
@@ -1827,7 +1832,7 @@ int CmdNRZrawDemod(const char *Cmd)
 // prints binary found and saves in demodbuffer for further commands
 int CmdPSK1rawDemod(const char *Cmd)
 {
-  int errCnt;
+  int ans;
   char cmdp = param_getchar(Cmd, 0);
   if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
     PrintAndLog("Usage:  data rawdemod p1 [clock] <0|1> [maxError]");
@@ -1842,15 +1847,12 @@ int CmdPSK1rawDemod(const char *Cmd)
     PrintAndLog("          : data rawdemod p1 64 1 0 = demod a psk1 tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors");
     return 0;
   }
-  errCnt = PSKDemod(Cmd, TRUE);
+  ans = PSKDemod(Cmd, TRUE);
   //output
-  if (errCnt<0){
-    if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); 
+  if ( !ans){
+    if (g_debugMode) PrintAndLog("Error demoding: %d",ans); 
     return 0;
   }
-  if (errCnt>0){
-    PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
-  }
   PrintAndLog("PSK demoded bitstream:");
   // Now output the bitstream to the scrollback by line of 16 bits
   printDemodBuff();
@@ -1861,7 +1863,7 @@ int CmdPSK1rawDemod(const char *Cmd)
 // takes same args as cmdpsk1rawdemod
 int CmdPSK2rawDemod(const char *Cmd)
 {
-  int errCnt=0;
+  int ans=0;
   char cmdp = param_getchar(Cmd, 0);
   if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
     PrintAndLog("Usage:  data rawdemod p2 [clock] <0|1> [maxError]");
@@ -1876,24 +1878,15 @@ int CmdPSK2rawDemod(const char *Cmd)
     PrintAndLog("          : data rawdemod p2 64 1 0  = demod a psk2 tag from GraphBuffer using a clock of RF/64, inverting output and allowing 0 demod errors");
     return 0;
   }
-  errCnt=PSKDemod(Cmd, TRUE);
-  if (errCnt<0){
-    if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt);  
+  ans=PSKDemod(Cmd, TRUE);
+  if (!ans){
+    if (g_debugMode) PrintAndLog("Error demoding: %d",ans);  
     return 0;
   } 
   psk1TOpsk2(DemodBuffer, DemodBufferLen);
-  if (errCnt>0){
-    if (g_debugMode){
-      PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
-      PrintAndLog("PSK2 demoded bitstream:");
-      // Now output the bitstream to the scrollback by line of 16 bits
-      printDemodBuff();
-    }
-  }else{
-    PrintAndLog("PSK2 demoded bitstream:");
-    // Now output the bitstream to the scrollback by line of 16 bits
-    printDemodBuff();  
-  }
+  PrintAndLog("PSK2 demoded bitstream:");
+  // Now output the bitstream to the scrollback by line of 16 bits
+  printDemodBuff();  
   return 1;
 }
 
index aec47dc0accc7d9ba66beb16fc81d657f7badbbc..2a77ebcb3ce941cccf20c6273fd37d73ea77b97f 100644 (file)
 #include "data.h"\r
 #include "lfdemod.h"\r
 #include "../common/crc.h"\r
+#include "../common/iso14443crc.h"\r
 \r
-#define LF_TRACE_BUFF_SIZE 20000 // 32 x 32 x 10  (32 bit times numofblock (7), times clock skip..)\r
-#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend..  8block * 4 bytes * 8bits = \r
-\r
-// Default configuration: ASK, not inversed.\r
-t55xx_conf_block_t config = { .modulation = 2, .inversed = FALSE, .block0 = 0x00};\r
+// Default configuration\r
+t55xx_conf_block_t config = { .modulation = DEMOD_ASK, .inversed = FALSE, .offset = 0x00, .block0 = 0x00};\r
 \r
 int usage_t55xx_config(){\r
-       PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1]");\r
+       PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1] [o <offset>]");\r
        PrintAndLog("Options:        ");\r
        PrintAndLog("       h                        This help");\r
        PrintAndLog("       d <FSK|ASK|PSK|NZ|BI>    Set demodulation FSK / ASK / PSK / NZ / Biphase");\r
        PrintAndLog("       i [1]                    Inverse data signal, defaults to normal");\r
+       PrintAndLog("       o [offsett]              Set offset, where data should start decode from in bitstream");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
-       PrintAndLog("      lf t55xx config d FSK     - FSK demodulation");\r
-       PrintAndLog("      lf t55xx config d FSK i 1 - FSK demodulation, inverse data");\r
+       PrintAndLog("      lf t55xx config d FSK          - FSK demodulation");\r
+       PrintAndLog("      lf t55xx config d FSK i 1      - FSK demodulation, inverse data");\r
+       PrintAndLog("      lf t55xx config d FSK i 1 o 3  - FSK demodulation, inverse data, offset=3,start from bitpos 3 to decode data");\r
        PrintAndLog("");\r
        return 0;\r
 }\r
@@ -109,8 +109,13 @@ static int CmdHelp(const char *Cmd);
 \r
 int CmdT55xxSetConfig(const char *Cmd){\r
 \r
+       uint8_t data[] = {0x78,0x00,0x00,0x00,0x00,0x00,0x00};\r
+       uint8_t cmd[]  = {0x00,0x00};\r
+       ComputeCrc14443(CRC_14443_B, data, 7 , &cmd[0], &cmd[1]);\r
+       PrintAndLog("%02X %02X",cmd[0], cmd[1]);\r
        int len = 0;\r
        int foundModulation = 2;\r
+       uint8_t offset = 0;\r
        bool inverse = FALSE;\r
        bool errors = FALSE;\r
        uint8_t cmdp = 0;\r
@@ -146,6 +151,14 @@ int CmdT55xxSetConfig(const char *Cmd){
                        inverse = param_getchar(Cmd,cmdp+1) == '1';\r
                        cmdp+=2;\r
                        break;\r
+               case 'o':\r
+                       errors |= param_getdec(Cmd, cmdp+1,&offset);\r
+                       if ( offset >= 32 ){\r
+                               PrintAndLog("Offset must be smaller than 32");\r
+                               errors = TRUE;\r
+                       }\r
+                       cmdp+=2;\r
+                       break;\r
                default:\r
                        PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
                        errors = TRUE;\r
@@ -163,6 +176,7 @@ int CmdT55xxSetConfig(const char *Cmd){
  \r
        config.modulation = foundModulation;\r
        config.inversed = inverse;\r
+       config.offset = offset;\r
        config.block0 = 0;\r
        return 0;\r
 }\r
@@ -320,13 +334,13 @@ bool tryDetectModulation(){
                        ++hits;\r
                        }\r
                \r
-               if ( PSKDemod("0 0 1", FALSE) >= 0 && test()) {\r
+               if ( PSKDemod("0 0 1", FALSE) && test()) {\r
                        tests[hits].modulation = DEMOD_PSK;\r
                        tests[hits].inversed = FALSE;\r
                        ++hits;\r
                }\r
                \r
-               if ( PSKDemod("0 1 1", FALSE) >= 0 && test()) {\r
+               if ( PSKDemod("0 1 1", FALSE) && test()) {\r
                        tests[hits].modulation = DEMOD_PSK;\r
                        tests[hits].inversed = TRUE;\r
                        ++hits;\r
@@ -384,22 +398,48 @@ bool test(){
 void printT55xxBlock(const char *demodStr){\r
        \r
        uint32_t blockData = 0;\r
-       uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};\r
+       uint8_t bits[64] = {0x00};\r
                \r
        if ( !DemodBufferLen) \r
                return;\r
        \r
-       int i =0;\r
-    for (;i<DemodBufferLen;++i)\r
+       if ( config.offset > DemodBufferLen){\r
+               PrintAndLog("The configured offset is to big. (%d > %d)", config.offset, DemodBufferLen);\r
+               return;\r
+       }\r
+       \r
+       int i = config.offset;\r
+       int pos = 32 + config.offset;\r
+    for (; i < pos; ++i)\r
                bits[i]=DemodBuffer[i];\r
        \r
-       blockData = PackBits(1, 32, bits);\r
-       PrintAndLog("0x%08X  %s [%s]", blockData, sprint_bin(bits+1,32), demodStr);\r
+       blockData = PackBits(0, 32, bits);\r
+       PrintAndLog("0x%08X  %s [%s]", blockData, sprint_bin(bits,32), demodStr);\r
+}\r
+\r
+int special(const char *Cmd) {\r
+       uint32_t blockData = 0;\r
+       uint8_t bits[64] = {0x00};\r
+\r
+       PrintAndLog("[OFFSET] [DATA] [BINARY]");\r
+       PrintAndLog("----------------------------------------------------");\r
+       int i,j = 0;\r
+       for (; j < 32; ++j){\r
+               \r
+               for (i = 0; i < 32; ++i)\r
+                       bits[i]=DemodBuffer[j+i];\r
+       \r
+               blockData = PackBits(0, 32, bits);\r
+               PrintAndLog("[%d] 0x%08X  %s",j , blockData, sprint_bin(bits,32));      \r
+       }\r
+       \r
+       return 0;\r
 }\r
 \r
 void printConfiguration( t55xx_conf_block_t b){\r
        PrintAndLog("Modulation : %s", GetSelectedModulationStr(b.modulation) );\r
        PrintAndLog("Inverted   : %s", (b.inversed) ? "Yes" : "No" );\r
+       PrintAndLog("Offset     : %d", b.offset);\r
        PrintAndLog("Block0     : %08X", b.block0);\r
        PrintAndLog("");\r
 }\r
@@ -789,6 +829,7 @@ static command_t CommandTable[] =
   {"trace",  CmdT55xxReadTrace, 0, "[1] Show T55xx traceability data (page 1/ blk 0-1)"},\r
   {"info",   CmdT55xxInfo,      0, "[1] Show T55xx configuration data (page 0/ blk 0)"},\r
   {"dump",   CmdT55xxDump,      0, "[password] Dump T55xx card block 0-7. [optional password]"},\r
+  {"special", special,           0, "Shows how a datablock changes with 32 different offsets"},\r
   {NULL, NULL, 0, NULL}\r
 };\r
 \r
index 9362c9f43ae52f29d13818b42515806be12cf11f..e4eca17cb18cf1a941c2cbb428ba94b01c665234 100644 (file)
@@ -19,6 +19,7 @@ typedef struct {
                DEMOD_BI  = 0x05,\r
        }  modulation;\r
        bool inversed;\r
+       uint8_t offset;\r
        uint32_t block0;\r
 } t55xx_conf_block_t;\r
 \r
@@ -42,4 +43,5 @@ void printConfiguration( t55xx_conf_block_t b);
 void DecodeT55xxBlock();\r
 bool tryDetectModulation();\r
 bool test();\r
+int special(const char *Cmd);\r
 #endif\r
index a42566ada95199c20e0626edfb8376b2cbcc2f74..a14f2613fd11817bac9a7998357b23e13444205f 100644 (file)
@@ -1079,7 +1079,10 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size)
        size_t i=1;
        uint8_t lastBit=BitStream[0];
        for (; i<size; i++){
-               if (lastBit!=BitStream[i]){
+               if ( BitStream[i] == 77 ){
+                       
+               } 
+               else if (lastBit!=BitStream[i]){
                        lastBit=BitStream[i];
                        BitStream[i]=1;
                } else {
@@ -1629,7 +1632,9 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
   errCnt=0;
   size_t numBits=0;
   //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit);
-
+  //set skipped bits
+  memset(dest+numBits, curPhase^1,firstFullWave / *clock);
+  numBits += (firstFullWave / *clock);
   for (i = firstFullWave+fullWaveLen-1; i < *size-3; i++){
     //top edge of wave = start of new wave 
     if (dest[i]+fc < dest[i+1] && dest[i+1] >= dest[i+2]){
Impressum, Datenschutz