]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
ADD: added the ioprox checksum test to IOdemodFSK
[proxmark3-svn] / client / cmddata.c
index a3d58523ff2d610540eedb31d6aa497b4d458e96..c83cf087293faf83c1a035d666d781a51e28761a 100644 (file)
@@ -33,6 +33,12 @@ static int CmdHelp(const char *Cmd);
 //by marshmellow
 void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx)
 {
+       if (buff == NULL) 
+               return;
+       
+       if ( size >= MAX_DEMOD_BUF_LEN)
+               size = MAX_DEMOD_BUF_LEN;
+       
        size_t i = 0;
        for (; i < size; i++){
                DemodBuffer[i]=buff[startIdx++];
@@ -277,16 +283,83 @@ void printEM410x(uint32_t hi, uint64_t id)
       PrintAndLog("EM 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("DEZ 8        : %08lld",id & 0xFFFFFF);
-      PrintAndLog("DEZ 10       : %010lld",id & 0xFFFFFF);
-      PrintAndLog("DEZ 5.5      : %05lld.%05lld",(id>>16LL) & 0xFFFF,(id & 0xFFFF));
-      PrintAndLog("DEZ 3.5A     : %03lld.%05lld",(id>>32ll),(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("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("DEZ 20/ZK    : %02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld",
+                       (id2lo & 0xf000000000) >> 36,
+                       (id2lo & 0x0f00000000) >> 32,
+                       (id2lo & 0x00f0000000) >> 28,
+                       (id2lo & 0x000f000000) >> 24,
+                       (id2lo & 0x0000f00000) >> 20,
+                       (id2lo & 0x00000f0000) >> 16,
+                       (id2lo & 0x000000f000) >> 12,
+                       (id2lo & 0x0000000f00) >> 8,
+                       (id2lo & 0x00000000f0) >> 4,
+                       (id2lo & 0x000000000f)
+                       );
+    PrintAndLog("Other        : %05lld_%03lld_%08lld",(id&0xFFFF),((id>>16LL) & 0xFF),(id & 0xFFFFFF));  
+       PrintAndLog("");                        
+       uint64_t paxton = (((id>>32) << 24) | (id & 0xffffff))  + 0x143e00;
+       PrintAndLog("Pattern Paxton  : %lld (hex %08llX)", paxton, paxton);     
+
+       uint32_t p1id = (id & 0xFFFFFF);
+       uint8_t arr[32] = {0x00};
+       int i =0; 
+       int j = 23;
+       for (; i < 24; ++i, --j ){
+               arr[i] = (p1id >> i) & 1;
+       }
+
+       uint32_t p1  = 0;       
+
+       p1 |= arr[23] << 21;
+       p1 |= arr[22] << 23;
+       p1 |= arr[21] << 20;
+       p1 |= arr[20] << 22;
+       
+       p1 |= arr[19] << 18;
+       p1 |= arr[18] << 16;
+       p1 |= arr[17] << 19;
+       p1 |= arr[16] << 17;
+       
+       p1 |= arr[15] << 13;
+       p1 |= arr[14] << 15;
+       p1 |= arr[13] << 12;
+       p1 |= arr[12] << 14;    
+
+       p1 |= arr[11] << 6;
+       p1 |= arr[10] << 2;
+       p1 |= arr[9]  << 7;
+       p1 |= arr[8]  << 1;
+       
+       p1 |= arr[7]  << 0;
+       p1 |= arr[6]  << 8;
+       p1 |= arr[5]  << 11;
+       p1 |= arr[4]  << 3;     
+       
+       p1 |= arr[3]  << 10;
+       p1 |= arr[2]  << 4;
+       p1 |= arr[1]  << 5;
+       p1 |= arr[0]  << 9;     
+       PrintAndLog("Pattern 1       : %d (hex %X)", p1, p1);
+
+       uint16_t sebury1 = id & 0xFFFF;
+       uint8_t  sebury2 = (id >> 16) & 0x7F;
+       uint32_t sebury3 = id & 0x7FFFFF;
+       PrintAndLog("Pattern Sebury  : %010d %03d %d  (hex: %X %X %X)", sebury3, sebury2, sebury1, sebury3, sebury2, sebury1);
+       }
   }
   return;
 }
@@ -668,7 +741,7 @@ int CmdG_Prox_II_Demod(const char *Cmd)
   if (ans < 0){
     if (g_debugMode) PrintAndLog("Error gProxII_Demod");
     return 0;
-  }
+    }
   //got a good demod
   uint32_t ByteStream[65] = {0x00};
   uint8_t xorKey=0;
@@ -773,7 +846,7 @@ int AutoCorrelate(int window, bool SaveGrph, bool verbose)
     } else if (sum > maxSum){
       maxSum=sum;
       lastMax = i;
-    }
+  }
   }
   if (Correlation==0){
     //try again with wider margin
@@ -789,8 +862,8 @@ int AutoCorrelate(int window, bool SaveGrph, bool verbose)
   if (verbose && Correlation > 0) PrintAndLog("Possible Correlation: %d samples",Correlation);
 
   if (SaveGrph){
-    GraphTraceLen = GraphTraceLen - window;
-    memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int));
+  GraphTraceLen = GraphTraceLen - window;
+  memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int));
     RepaintGraphWindow();  
   }
   return Correlation;
@@ -1098,7 +1171,7 @@ int FSKrawDemod(const char *Cmd, bool verbose)
     if(size > (8*32)+2) size = (8*32)+2; //only output a max of 8 blocks of 32 bits  most tags will have full bit stream inside that sample size
     if (verbose) {
       PrintAndLog("FSK decoded bitstream:");
-      printBitStream(BitStream,size);
+    printBitStream(BitStream,size);
     }
 
     return 1;
@@ -1193,6 +1266,7 @@ int CmdFSKdemodHID(const char *Cmd)
       if(fmtLen==34){
         cardnum = (lo>>1)&0xFFFF;
         fc= ((hi&1)<<15)|(lo>>17);
+               // this could also be QUADRAKEY.  Uses 34bit HID. 
       }
       if(fmtLen==35){
         cardnum = (lo>>1)&0xFFFFF;
@@ -1339,7 +1413,21 @@ 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) ? "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);
@@ -1866,7 +1954,8 @@ int NRZrawDemod(const char *Cmd, bool verbose)
     if (g_debugMode==1 && verbose) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
     return 0;
   }
-  PrintAndLog("Tried NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
+  if (verbose) 
+       PrintAndLog("Tried NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
   //prime demod buffer for output
   setDemodBuf(BitStream,BitLen,0);
 
@@ -1874,9 +1963,9 @@ int NRZrawDemod(const char *Cmd, bool verbose)
     PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
   }
   if (verbose) {
-    PrintAndLog("NRZ demoded bitstream:");
-    // Now output the bitstream to the scrollback by line of 16 bits
-    printDemodBuff();
+  PrintAndLog("NRZ demoded bitstream:");
+  // Now output the bitstream to the scrollback by line of 16 bits
+  printDemodBuff();
   }
   return 1; 
 }
Impressum, Datenschutz