]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge pull request #84 from marshmellow42/master
authorMartin Holst Swende <martin@swende.se>
Wed, 25 Mar 2015 10:10:51 +0000 (11:10 +0100)
committerMartin Holst Swende <martin@swende.se>
Wed, 25 Mar 2015 10:10:51 +0000 (11:10 +0100)
EM410x bug fix

armsrc/lfops.c
client/cmddata.c
common/lfdemod.c

index 7bbc739d45991e063fd40980112f457c11481a1b..3042b80a7684a1a4f946cdaa9fa40e146d5244bf 100644 (file)
@@ -896,6 +896,7 @@ void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol)
             //Dbprintf("DEBUG: No Tag");
         }
         WDT_HIT();
+        hi = 0;
         lo = 0;
         clk=0;
         invert=0;
index 7854fa51d743191c2c2c297810f9f927cc7b0161..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);
index c7acb404bac93319c4176eafb494654200a96cf6..92ad633e7e8e200abf8214da1c9ffd5c8b3e3ae4 100644 (file)
@@ -88,37 +88,34 @@ uint8_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_
     return 0;
   }
   // 111111111 bit pattern represent start of frame
-  uint8_t preamble[] = {1,1,1,1,1,1,1,1,1};
+  //  include 0 in front to help get start pos
+  uint8_t preamble[] = {0,1,1,1,1,1,1,1,1,1};
   uint32_t idx = 0;
   uint32_t parityBits = 0;
   uint8_t errChk = 0;
   uint8_t FmtLen = 10;
   *startIdx = 0;
-  for (uint8_t extraBitChk=0; extraBitChk<5; extraBitChk++){
-    errChk = preambleSearch(BitStream+extraBitChk+*startIdx, preamble, sizeof(preamble), size, startIdx);
-    if (errChk == 0) return 0;
-    if (*size>64) FmtLen = 22;
-    if (*size<64) return 0;
-    idx = *startIdx + 9;
-    for (i=0; i<FmtLen; i++){ //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)
-      parityBits = bytebits_to_byte(BitStream+(i*5)+idx,5);
-      //check even parity
-      if (parityTest(parityBits, 5, 0) == 0){
-        //parity failed try next bit (in the case of 1111111111) but last 9 = preamble
-        startIdx++;
-        errChk = 0;
-        break;
-      }
-      //set uint64 with ID from BitStream
-      for (uint8_t ii=0; ii<4; ii++){
-        *hi = (*hi << 1) | (*lo >> 63);
-        *lo = (*lo << 1) | (BitStream[(i*5)+ii+idx]);
-      }
+  errChk = preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx);
+  if (errChk == 0 || *size < 64) return 0;
+  if (*size > 64) FmtLen = 22;
+  *startIdx += 1; //get rid of 0 from preamble
+  idx = *startIdx + 9;
+  for (i=0; i<FmtLen; i++){ //loop through 10 or 22 sets of 5 bits (50-10p = 40 bits or 88 bits)
+    parityBits = bytebits_to_byte(BitStream+(i*5)+idx,5);
+    //check even parity
+    if (parityTest(parityBits, 5, 0) == 0){
+      //parity failed quit
+       return 0;
+    }
+    //set uint64 with ID from BitStream
+    for (uint8_t ii=0; ii<4; ii++){
+      *hi = (*hi << 1) | (*lo >> 63);
+      *lo = (*lo << 1) | (BitStream[(i*5)+ii+idx]);
     }
-    if (errChk != 0) return 1;
-    //skip last 5 bit parity test for simplicity.
-    // *size = 64 | 128;
   }
+  if (errChk != 0) return 1;
+  //skip last 5 bit parity test for simplicity.
+  // *size = 64 | 128;
   return 0;
 }
 
Impressum, Datenschutz