]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
LF HID & IO prox demod translation addons
authormarshmellow42 <marshmellowrf@gmail.com>
Sun, 14 Dec 2014 01:23:59 +0000 (20:23 -0500)
committermarshmellow42 <marshmellowrf@gmail.com>
Sun, 14 Dec 2014 01:23:59 +0000 (20:23 -0500)
lf hid fskdemod - add bit format length, facility code and card numbers
for different formats

armsrc/lfops.c

index 7d497e3cc42c411ed83a02d9d59aa106fc90d4a4..a3cef485c228e26fcb6b7067ac0312a86c1827c6 100644 (file)
@@ -755,22 +755,71 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
                                        else // 0 1
                                                lo=(lo<<1)|
                                                                1;
-                                       numshifts ++;
+                                       numshifts++;
                                        idx += 2;
                                }
+
                                //Dbprintf("Num shifts: %d ", numshifts);
                                // Hopefully, we read a tag and  hit upon the next frame marker
                                if(idx + sizeof(frame_marker_mask) < size)
                                {
                                        if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0)
                                        {
-                                               if (hi2 != 0){
+                                               if (hi2 != 0){ //should be large enough for the largest HID tags
                                                        Dbprintf("TAG ID: %x%08x%08x (%d)",
                                                                 (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
                                                }
-                                               else {
-                                                       Dbprintf("TAG ID: %x%08x (%d)",
-                                                        (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
+                                               else {  //standard bits
+                                                       //Dbprintf("TAG ID: %x%08x (%d)",
+                                                       // (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
+                                                       uint8_t bitlen = 0;
+                                                       uint32_t fc = 0;
+                                                       uint32_t cardnum = 0;
+
+                                                       if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
+                                                               uint32_t lo2=0;
+                                                               lo2=(((hi & 31) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
+                                                               uint8_t idx3 = 1;
+                                                               while(lo2>1){ //find last bit set to 1 (format len bit)
+                                                                       lo2=lo2>>1;
+                                                                       idx3++;
+                                                               }
+                                                               bitlen =idx3+19;
+                                                               fc =0;
+                                                               cardnum=0;
+                                                               if(bitlen==26){
+                                                                       cardnum = (lo>>1)&0xFFFF;
+                                                                       fc = (lo>>17)&0xFF;
+                                                               }
+                                                               if(bitlen==37){
+                                                                       cardnum = (lo>>1)&0x7FFFF;
+                                                                       fc = ((hi&0xF)<<12)|(lo>>20);
+                                                               }
+                                                               if(bitlen==34){
+                                                                       cardnum = (lo>>1)&0xFFFF;
+                                                                       fc= ((hi&1)<<15)|(lo>>17);
+                                                               }
+                                                               if(bitlen==35){
+                                                                       cardnum = (lo>>1)&0xFFFFF;
+                                                                       fc = ((hi&1)<<11)|(lo>>21);
+                                                               }
+                                                               //Dbprintf("Format Len: %d bit - FC: %d - Card: %d",(unsigned int) bitlen, (unsigned int) fc, (unsigned int) cardnum);
+                                                       }
+                                                       else { //if bit 38 is not set then 37 bit format is used
+                                                               bitlen= 37;
+                                                               fc =0;
+                                                               cardnum=0;
+                                                               if(bitlen==37){
+                                                                       cardnum = (lo>>1)&0x7FFFF;
+                                                                       fc = ((hi&0xF)<<12)|(lo>>20);
+                                                               }
+                                                       }
+                                                                       //Dbprintf("TAG ID: %x%08x (%d)",
+                                                       // (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
+                               
+                                                       Dbprintf("TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
+                                                               (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF,
+                                                               (unsigned int) bitlen, (unsigned int) fc, (unsigned int) cardnum);
                                                }
                                        }
 
@@ -837,7 +886,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
                for( idx=0; idx < size - 64; idx++) {
 
                if ( memcmp(dest + idx, mask, sizeof(mask)) ) continue;
-
+               Dbprintf("%b",bytebits_to_byte(dest+idx,32));
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx],   dest[idx+1],   dest[idx+2],dest[idx+3],dest[idx+4],dest[idx+5],dest[idx+6],dest[idx+7]);
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx+8], dest[idx+9], dest[idx+10],dest[idx+11],dest[idx+12],dest[idx+13],dest[idx+14],dest[idx+15]);                         
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx+16],dest[idx+17],dest[idx+18],dest[idx+19],dest[idx+20],dest[idx+21],dest[idx+22],dest[idx+23]);
@@ -850,11 +899,11 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
                    code = bytebits_to_byte(dest+idx,32);
                    code2 = bytebits_to_byte(dest+idx+32,32); 
 
-                   short version = bytebits_to_byte(dest+idx+14,4); 
-                   char unknown = bytebits_to_byte(dest+idx+19,8) ;
-                   uint16_t number = bytebits_to_byte(dest+idx+36,9); 
+                   short version = bytebits_to_byte(dest+idx+28,8); //14,4
+                   char facilitycode = bytebits_to_byte(dest+idx+19,8) ;
+                   uint16_t number = (bytebits_to_byte(dest+idx+37,8)<<8)|(bytebits_to_byte(dest+idx+46,8)); //36,9
                    
-                   Dbprintf("XSF(%02d)%02x:%d (%08x%08x)",version,unknown,number,code,code2);
+                   Dbprintf("XSF(%02d)%02x:%d (%08x%08x)",version,facilitycode,number,code,code2);
                    if (ledcontrol)     LED_D_OFF();
                
                        // if we're only looking for one tag 
@@ -950,7 +999,8 @@ void T55xxWriteBit(int bit)
 // Write one card block in page 0, no lock
 void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMode)
 {
-       unsigned int i;
+       //unsigned int i;  //enio adjustment 12/10/14
+       uint32_t i;
 
        FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
        FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
@@ -995,8 +1045,8 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod
 void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode)
 {
        uint8_t *dest = (uint8_t *)BigBuf;
-       int m=0, i=0;
-  
+       //int m=0, i=0; //enio adjustment 12/10/14
+       uint32_t m=0, i=0;
        FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
        m = sizeof(BigBuf);
   // Clear destination buffer before sending the command
Impressum, Datenschutz