]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
adjust pskdemod
[proxmark3-svn] / client / cmddata.c
index e6e4dc0a0f8c4f2cb485433962f35dfe8144baa3..356bfab3f715a55548c194903188ad9f866657cf 100644 (file)
@@ -22,6 +22,7 @@
 #include "cmddata.h"
 #include "lfdemod.h"
 #include "usb_cmd.h"
+#include "crc.h"
 
 uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
 uint8_t g_debugMode;
@@ -86,7 +87,24 @@ void printDemodBuff(void)
 
 int CmdPrintDemodBuff(const char *Cmd)
 {
-  printDemodBuff();
+  char hex;
+  char printBuff[512]={0x00};
+  uint8_t numBits = DemodBufferLen & 0xFFF0;
+  sscanf(Cmd, "%c", &hex);
+  if (hex == 'h'){
+    PrintAndLog("Usage: data printdemodbuffer [x]");
+    PrintAndLog("Options:        ");
+    PrintAndLog("       h       This help");
+    PrintAndLog("       x       output in hex (omit for binary output)");
+    return 0;
+  }
+  if (hex == 'x'){
+    numBits = binarraytohex(printBuff, (char *)DemodBuffer, numBits);
+    if (numBits==0) return 0;
+    PrintAndLog("DemodBuffer: %s",printBuff);
+  } else {
+    printDemodBuff();
+  }
   return 1;
 }
 int CmdAmp(const char *Cmd)
@@ -605,13 +623,13 @@ int CmdG_Prox_II_Demod(const char *Cmd)
   int ans = ASKrawDemod(Cmd, FALSE);
   if (ans <= 0) {
     if (g_debugMode) PrintAndLog("Error AskrawDemod: %d",ans);
-    return ans;
+    return 0; //ans;
   }
   size_t size = DemodBufferLen;
   ans = BiphaseRawDecode(DemodBuffer, &size, 0, 0); 
   if (ans !=0) {
     if (g_debugMode) PrintAndLog("Error BiphaseRawDecode: %d",ans);
-    return ans;
+    return 0; //ans;
   }
   //call lfdemod.c demod for gProxII
   ans = gProxII_Demod(DemodBuffer, &size);
@@ -621,7 +639,7 @@ int CmdG_Prox_II_Demod(const char *Cmd)
     ans = BiphaseRawDecode(DemodBuffer, &size, 1, 0); 
     if (ans != 0) {
       if (g_debugMode) PrintAndLog("Error BiphaseRawDecode: %d",ans);
-      return ans;
+      return 0;//ans;
     }
     ans = gProxII_Demod(DemodBuffer, &size);
     if (ans < 0) {
@@ -712,38 +730,80 @@ int Cmdaskrawdemod(const char *Cmd)
   return ASKrawDemod(Cmd, TRUE);
 }
 
-int CmdAutoCorr(const char *Cmd)
+int AutoCorrelate(int window, bool SaveGrph, bool verbose)
 {
   static int CorrelBuffer[MAX_GRAPH_TRACE_LEN];
-
-  int window = atoi(Cmd);
-
-  if (window == 0) {
-    PrintAndLog("needs a window");
-    return 0;
-  }
-  if (window >= GraphTraceLen) {
-    PrintAndLog("window must be smaller than trace (%d samples)",
-      GraphTraceLen);
-    return 0;
-  }
-
-  PrintAndLog("performing %d correlations", GraphTraceLen - window);
-
+  size_t Correlation = 0;
+  int maxSum = 0;
+  int lastMax = 0;
+  if (verbose) PrintAndLog("performing %d correlations", GraphTraceLen - window);
   for (int i = 0; i < GraphTraceLen - window; ++i) {
     int sum = 0;
     for (int j = 0; j < window; ++j) {
       sum += (GraphBuffer[j]*GraphBuffer[i + j]) / 256;
     }
     CorrelBuffer[i] = sum;
+    if (sum >= maxSum-100 && sum <= maxSum+100){
+      //another max
+      Correlation = i-lastMax;
+      lastMax = i;
+      if (sum > maxSum) maxSum = sum;
+    } else if (sum > maxSum){
+      maxSum=sum;
+      lastMax = i;
+    }
   }
-  GraphTraceLen = GraphTraceLen - window;
-  memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int));
+  if (Correlation==0){
+    //try again with wider margin
+    for (int i = 0; i < GraphTraceLen - window; i++){
+      if (CorrelBuffer[i] >= maxSum-(maxSum*0.05) && CorrelBuffer[i] <= maxSum+(maxSum*0.05)){
+        //another max
+        Correlation = i-lastMax;
+        lastMax = i;
+        //if (CorrelBuffer[i] > maxSum) maxSum = sum;
+      }
+    }
+  }
+  if (verbose && Correlation > 0) PrintAndLog("Possible Correlation: %d samples",Correlation);
 
-  RepaintGraphWindow();
+  if (SaveGrph){
+    GraphTraceLen = GraphTraceLen - window;
+    memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int));
+    RepaintGraphWindow();  
+  }
+  return Correlation;
+}
+
+int usage_data_autocorr(void)
+{
+  //print help
+  PrintAndLog("Usage: data autocorr [window] [g]");
+  PrintAndLog("Options:        ");
+  PrintAndLog("       h              This help");
+  PrintAndLog("       [window]       window length for correlation - default = 4000");
+  PrintAndLog("       g              save back to GraphBuffer (overwrite)");
   return 0;
 }
 
+int CmdAutoCorr(const char *Cmd)
+{
+  char cmdp = param_getchar(Cmd, 0);
+  if (cmdp == 'h' || cmdp == 'H') 
+    return usage_data_autocorr();
+  int window = 4000; //set default
+  char grph=0;
+  bool updateGrph = FALSE;
+  sscanf(Cmd, "%i %c", &window, &grph);
+
+  if (window >= GraphTraceLen) {
+    PrintAndLog("window must be smaller than trace (%d samples)",
+      GraphTraceLen);
+    return 0;
+  }
+  if (grph == 'g') updateGrph=TRUE;
+  return AutoCorrelate(window, updateGrph, TRUE);
+}
+
 int CmdBitsamples(const char *Cmd)
 {
   int cnt = 0;
@@ -1417,7 +1477,17 @@ int CmdFSKdemodPyramid(const char *Cmd)
   // w = wiegand parity, x = extra space for other formats
   // p = unknown checksum
   // (26 bit format shown)
-  
+
+  //get bytes for checksum calc
+  uint8_t checksum = bytebits_to_byte(BitStream + idx + 120, 8);
+  uint8_t csBuff[14] = {0x00};
+  for (uint8_t i = 0; i < 13; i++){
+    csBuff[i] = bytebits_to_byte(BitStream + idx + 16 + (i*8), 8);
+  }
+  //check checksum calc
+  //checksum calc thanks to ICEMAN!!
+  uint32_t checkCS =  CRC8Maxim(csBuff,13);
+
   //get raw ID before removing parities
   uint32_t rawLo = bytebits_to_byte(BitStream+idx+96,32);
   uint32_t rawHi = bytebits_to_byte(BitStream+idx+64,32);
@@ -1427,7 +1497,8 @@ int CmdFSKdemodPyramid(const char *Cmd)
 
   size = removeParity(BitStream, idx+8, 8, 1, 120);
   if (size != 105){
-    if (g_debugMode==1) PrintAndLog("DEBUG: Error at parity check-tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3);
+    if (g_debugMode==1) 
+      PrintAndLog("DEBUG: Error at parity check - tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3);
     return 0;
   }
 
@@ -1485,6 +1556,11 @@ int CmdFSKdemodPyramid(const char *Cmd)
       PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
     }
   }
+  if (checksum == checkCS)
+    PrintAndLog("Checksum %02x passed", checksum);
+  else
+    PrintAndLog("Checksum %02x failed - should have been %02x", checksum, checkCS);
+
   if (g_debugMode){
     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, 128);
     printDemodBuff();
@@ -1624,7 +1700,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);
@@ -1632,22 +1708,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
@@ -1662,7 +1743,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;
@@ -1803,7 +1884,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]");
@@ -1818,15 +1899,13 @@ 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();
@@ -1837,7 +1916,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]");
@@ -1852,24 +1931,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;
 }
 
@@ -2564,7 +2634,7 @@ static command_t CommandTable[] =
   {"askgproxiidemod",CmdG_Prox_II_Demod,1, "Demodulate a G Prox II tag from GraphBuffer"},
   //{"askmandemod",   Cmdaskmandemod,     1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate ASK/Manchester tags and output binary (args optional)"},
   //{"askrawdemod",   Cmdaskrawdemod,     1, "[clock] [invert<0|1>] -- Attempt to demodulate ASK tags and output bin (args optional)"},
-  {"autocorr",      CmdAutoCorr,        1, "<window length> -- Autocorrelation over window"},
+  {"autocorr",      CmdAutoCorr,        1, "[window length] [g] -- Autocorrelation over window - g to save back to GraphBuffer (overwrite)"},
   {"biphaserawdecode",CmdBiphaseDecodeRaw,1,"[offset] [invert<0|1>] Biphase decode bin stream in DemodBuffer (offset = 0|1 bits to shift the decode start)"},
   {"bitsamples",    CmdBitsamples,      0, "Get raw samples as bitstring"},
   //{"bitstream",     CmdBitstream,       1, "[clock rate] -- Convert waveform into a bitstream"},
@@ -2595,7 +2665,7 @@ static command_t CommandTable[] =
   //{"nrzrawdemod",   CmdNRZrawDemod,     1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate nrz tags and output binary (args optional)"},
   {"plot",          CmdPlot,            1, "Show graph window (hit 'h' in window for keystroke help)"},
   //{"pskdetectclock",CmdDetectPSKClockRate, 1, "Detect ASK, PSK, or NRZ clock rate"},
-  {"printdemodbuffer",CmdPrintDemodBuff,1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"},
+  {"printdemodbuffer",CmdPrintDemodBuff,1, "[x] -- print the data in the DemodBuffer - 'x' for hex output"},
   {"pskindalademod",CmdIndalaDecode,    1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"},
   //{"psk1rawdemod",  CmdPSK1rawDemod,    1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate psk1 tags and output binary (args optional)"},
   //{"psk2rawdemod",  CmdPSK2rawDemod,    1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate psk2 tags and output binary (args optional)"},
Impressum, Datenschutz