]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
EM410x bug fix
[proxmark3-svn] / client / cmddata.c
index 8017d1692bb8bc022cd812525942702f68d734fc..3e23e588a53db64155e38968e3c5b61d3b8e7348 100644 (file)
@@ -280,24 +280,22 @@ void printEM410x(uint32_t hi, uint64_t id)
     }
     if (hi){
       //output 88 bit em id
-      PrintAndLog("EM TAG ID    : %06x%016llx", hi, id);
+      PrintAndLog("\nEM TAG ID      : %06x%016llx", hi, id);
     } else{
       //output 40 bit em id
-      PrintAndLog("EM TAG ID    : %010llx", id);
-      PrintAndLog("Unique TAG ID: %010llx",  id2lo);
-      PrintAndLog("");
-      PrintAndLog("Possible de-scramble patterns");
-      PrintAndLog("HoneyWell IdentKey");
-      PrintAndLog("DEZ 8        : %08lld",id & 0xFFFFFF);
-      PrintAndLog("DEZ 10       : %010lld",id & 0xFFFFFFFF);
-      PrintAndLog("DEZ 5.5      : %05lld.%05lld",(id>>16LL) & 0xFFFF,(id & 0xFFFF));
-      PrintAndLog("DEZ 3.5A     : %03lld.%05lld",(id>>32ll),(id & 0xFFFF));
-      PrintAndLog("DEZ 3.5B     : %03lld.%05lld",(id & 0xFF000000) >> 24,(id & 0xFFFF));
-      PrintAndLog("DEZ 3.5C     : %03lld.%05lld",(id & 0xFF0000) >> 16,(id & 0xFFFF));
-      PrintAndLog("DEZ 14/IK2   : %014lld",id);
-      PrintAndLog("DEZ 15/IK3   : %015lld",id2lo);
-      PrintAndLog("Other        : %05lld_%03lld_%08lld",(id&0xFFFF),((id>>16LL) & 0xFF),(id & 0xFFFFFF));  
-      PrintAndLog("DEZ 20/ZK    : %02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld",
+      PrintAndLog("\nEM TAG ID      : %010llx", id);
+      PrintAndLog("Unique TAG ID  : %010llx",  id2lo);
+      PrintAndLog("\nPossible de-scramble patterns");
+      PrintAndLog("HoneyWell IdentKey {");
+      PrintAndLog("DEZ 8          : %08lld",id & 0xFFFFFF);
+      PrintAndLog("DEZ 10         : %010lld",id & 0xFFFFFFFF);
+      PrintAndLog("DEZ 5.5        : %05lld.%05lld",(id>>16LL) & 0xFFFF,(id & 0xFFFF));
+      PrintAndLog("DEZ 3.5A       : %03lld.%05lld",(id>>32ll),(id & 0xFFFF));
+      PrintAndLog("DEZ 3.5B       : %03lld.%05lld",(id & 0xFF000000) >> 24,(id & 0xFFFF));
+      PrintAndLog("DEZ 3.5C       : %03lld.%05lld",(id & 0xFF0000) >> 16,(id & 0xFFFF));
+      PrintAndLog("DEZ 14/IK2     : %014lld",id);
+      PrintAndLog("DEZ 15/IK3     : %015lld",id2lo);
+      PrintAndLog("DEZ 20/ZK      : %02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld",
         (id2lo & 0xf000000000) >> 36,
         (id2lo & 0x0f00000000) >> 32,
         (id2lo & 0x00f0000000) >> 28,
@@ -309,10 +307,9 @@ void printEM410x(uint32_t hi, uint64_t id)
         (id2lo & 0x00000000f0) >> 4,
         (id2lo & 0x000000000f)
       );
-
-      PrintAndLog("");                 
       uint64_t paxton = (((id>>32) << 24) | (id & 0xffffff))  + 0x143e00;
-      PrintAndLog("Pattern Paxton  : %0d", paxton);    
+      PrintAndLog("}\nOther          : %05lld_%03lld_%08lld",(id&0xFFFF),((id>>16LL) & 0xFF),(id & 0xFFFFFF));  
+      PrintAndLog("Pattern Paxton : %0d", paxton);
 
       uint32_t p1id = (id & 0xFFFFFF);
       uint8_t arr[32] = {0x00};
@@ -322,7 +319,7 @@ void printEM410x(uint32_t hi, uint64_t id)
        arr[i] = (p1id >> i) & 1;
       }
 
-      uint32_t p1  = 0;        
+      uint32_t p1  = 0;
 
       p1 |= arr[23] << 21;
       p1 |= arr[22] << 23;
@@ -337,7 +334,7 @@ void printEM410x(uint32_t hi, uint64_t id)
       p1 |= arr[15] << 13;
       p1 |= arr[14] << 15;
       p1 |= arr[13] << 12;
-      p1 |= arr[12] << 14;     
+      p1 |= arr[12] << 14;
 
       p1 |= arr[11] << 6;
       p1 |= arr[10] << 2;
@@ -347,18 +344,18 @@ void printEM410x(uint32_t hi, uint64_t id)
       p1 |= arr[7]  << 0;
       p1 |= arr[6]  << 8;
       p1 |= arr[5]  << 11;
-      p1 |= arr[4]  << 3;      
+      p1 |= arr[4]  << 3;
 
       p1 |= arr[3]  << 10;
       p1 |= arr[2]  << 4;
       p1 |= arr[1]  << 5;
-      p1 |= arr[0]  << 9;      
-      PrintAndLog("Pattern 1       : 0x%X - %d", p1, p1);
+      p1 |= arr[0]  << 9;
+      PrintAndLog("Pattern 1      : 0x%X - %d", p1, p1);
 
       uint16_t sebury1 = id & 0xFFFF;
       uint8_t  sebury2 = (id >> 16) & 0x7F;
       uint32_t sebury3 = id & 0x7FFFFF;
-      PrintAndLog("Pattern Sebury  : %d %d %d  (hex: %X %X %X)", sebury1, sebury2, sebury3, sebury1, sebury2, sebury3);
+      PrintAndLog("Pattern Sebury : %d %d %d  (hex: %X %X %X)", sebury1, sebury2, sebury3, sebury1, sebury2, sebury3);
     }
   }
   return;
@@ -400,8 +397,8 @@ int CmdAskEM410xDemod(const char *Cmd)
     PrintAndLog("          : data askem410xdemod 64 1 0 = demod an EM410x Tag ID from GraphBuffer using a clock of RF/64 and inverting data and allowing 0 demod errors");
     return 0;
   }
-  uint32_t hi;
-  uint64_t lo;
+  uint32_t hi = 0;
+  uint64_t lo = 0;
   if (AskEm410xDemod(Cmd, &hi, &lo)) {
     PrintAndLog("EM410x pattern found: ");
     printEM410x(hi, lo);
@@ -558,6 +555,7 @@ int CmdBiphaseDecodeRaw(const char *Cmd)
                PrintAndLog("Usage:  data biphaserawdecode [offset] [invert] [maxErr]");
                PrintAndLog("     Converts 10 or 01 to 1 and 11 or 00 to 0");
                PrintAndLog("     --must have binary sequence in demodbuffer (run data askrawdemod first)");
+    PrintAndLog("     --invert for Conditional Dephase Encoding (CDP) AKA Differential Manchester");
                PrintAndLog("");
                PrintAndLog("     [offset <0|1>], set to 0 not to adjust start position or to 1 to adjust decode start position");
                PrintAndLog("     [invert <0|1>], set to 1 to invert output");
@@ -720,6 +718,8 @@ int Cmdaskbiphdemod(const char *Cmd)
     PrintAndLog("     NOTE: <amplify> can be entered as first, second or last argument");
     PrintAndLog("     NOTE: any other arg must have previous args set to work");
     PrintAndLog("");
+    PrintAndLog("     NOTE: --invert for Conditional Dephase Encoding (CDP) AKA Differential Manchester");
+    PrintAndLog("");
     PrintAndLog("    sample: data rawdemod ab            = demod an ask/biph tag from GraphBuffer");
     PrintAndLog("          : data rawdemod ab a          = demod an ask/biph tag from GraphBuffer, amplified");
     PrintAndLog("          : data rawdemod ab 1 32       = demod an ask/biph tag from GraphBuffer using an offset of 1 and a clock of RF/32");
@@ -1420,7 +1420,19 @@ int CmdFSKdemodIO(const char *Cmd)
   uint8_t version = bytebits_to_byte(BitStream+idx+27,8); //14,4
   uint8_t facilitycode = bytebits_to_byte(BitStream+idx+18,8) ;
   uint16_t number = (bytebits_to_byte(BitStream+idx+36,8)<<8)|(bytebits_to_byte(BitStream+idx+45,8)); //36,9
-  PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x)",version,facilitycode,number,code,code2);
+  uint8_t crc = bytebits_to_byte(BitStream+idx+54,8);
+  uint16_t calccrc = 0;
+
+  for (uint8_t i=1; i<6; ++i){
+    calccrc += bytebits_to_byte(BitStream+idx+9*i,8);
+    //PrintAndLog("%d", calccrc);
+  }
+  calccrc &= 0xff;
+  calccrc = 0xff - calccrc;
+
+  char *crcStr = (crc == calccrc) ? "crc ok": "!crc";
+
+  PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version,facilitycode,number,code,code2, crc, crcStr);
   setDemodBuf(BitStream,64,idx);
   if (g_debugMode){
     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx,64);
@@ -2056,7 +2068,7 @@ int CmdRawDemod(const char *Cmd)
                PrintAndLog("   <help> as 'h', prints the help for the specific modulation");   
                PrintAndLog("   <options> see specific modulation help for optional parameters");                               
                PrintAndLog("");
-               PrintAndLog("    sample: data rawdemod fs h         = print help for ask/raw demod");
+               PrintAndLog("    sample: data rawdemod fs h         = print help specific to fsk demod");
                PrintAndLog("          : data rawdemod fs           = demod GraphBuffer using: fsk - autodetect");
                PrintAndLog("          : data rawdemod ab           = demod GraphBuffer using: ask/biphase - autodetect");
                PrintAndLog("          : data rawdemod am           = demod GraphBuffer using: ask/manchester - autodetect");
@@ -2185,57 +2197,64 @@ uint8_t getByte(uint8_t bits_per_sample, BitstreamOut* b)
        return val;
 }
 
-int CmdSamples(const char *Cmd)
+int getSamples(const char *Cmd, bool silent)
 {
-       //If we get all but the last byte in bigbuf,
-       // we don't have to worry about remaining trash
-       // in the last byte in case the bits-per-sample
-       // does not line up on byte boundaries
-       uint8_t got[BIGBUF_SIZE-1] = { 0 };
+  //If we get all but the last byte in bigbuf,
+  // we don't have to worry about remaining trash
+  // in the last byte in case the bits-per-sample
+  // does not line up on byte boundaries
 
-       int n = strtol(Cmd, NULL, 0);
-       if (n == 0)
-               n = sizeof(got);
+  uint8_t got[BIGBUF_SIZE-1] = { 0 };
 
-       if (n > sizeof(got))
-               n = sizeof(got);
+  int n = strtol(Cmd, NULL, 0);
 
-       PrintAndLog("Reading %d bytes from device memory\n", n);
-       GetFromBigBuf(got,n,0);
-       PrintAndLog("Data fetched");
-       UsbCommand response;
-       WaitForResponse(CMD_ACK, &response);
-       uint8_t bits_per_sample = 8;
+  if (n == 0)
+    n = sizeof(got);
 
-       //Old devices without this feature would send 0 at arg[0]
-       if(response.arg[0] > 0)
-       {
-               sample_config *sc = (sample_config *) response.d.asBytes;
-               PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample
-                                       , sc->decimation);
-               bits_per_sample = sc->bits_per_sample;
-       }
-       if(bits_per_sample < 8)
-       {
-               PrintAndLog("Unpacking...");
-               BitstreamOut bout = { got, bits_per_sample * n,  0};
-               int j =0;
-               for (j = 0; j * bits_per_sample < n * 8 && j < sizeof(GraphBuffer); j++) {
-                       uint8_t sample = getByte(bits_per_sample, &bout);
-                       GraphBuffer[j] = ((int) sample )- 128;
-               }
-               GraphTraceLen = j;
-               PrintAndLog("Unpacked %d samples" , j );
-       }else
-       {
-               for (int j = 0; j < n; j++) {
-                       GraphBuffer[j] = ((int)got[j]) - 128;
-               }
-               GraphTraceLen = n;
-       }
+  if (n > sizeof(got))
+    n = sizeof(got);
 
-       RepaintGraphWindow();
-       return 0;
+  PrintAndLog("Reading %d bytes from device memory\n", n);
+  GetFromBigBuf(got,n,0);
+  PrintAndLog("Data fetched");
+  UsbCommand response;
+  WaitForResponse(CMD_ACK, &response);
+  uint8_t bits_per_sample = 8;
+
+  //Old devices without this feature would send 0 at arg[0]
+  if(response.arg[0] > 0)
+  {
+    sample_config *sc = (sample_config *) response.d.asBytes;
+    PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample
+          , sc->decimation);
+    bits_per_sample = sc->bits_per_sample;
+  }
+  if(bits_per_sample < 8)
+  {
+    PrintAndLog("Unpacking...");
+    BitstreamOut bout = { got, bits_per_sample * n,  0};
+    int j =0;
+    for (j = 0; j * bits_per_sample < n * 8 && j < sizeof(GraphBuffer); j++) {
+      uint8_t sample = getByte(bits_per_sample, &bout);
+      GraphBuffer[j] = ((int) sample )- 128;
+    }
+    GraphTraceLen = j;
+    PrintAndLog("Unpacked %d samples" , j );
+  }else
+  {
+    for (int j = 0; j < n; j++) {
+      GraphBuffer[j] = ((int)got[j]) - 128;
+    }
+    GraphTraceLen = n;
+  }
+
+  RepaintGraphWindow();
+  return 0;
+}
+
+int CmdSamples(const char *Cmd)
+{
+  return getSamples(Cmd, false);
 }
 
 int CmdTuneSamples(const char *Cmd)
Impressum, Datenschutz