]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
FIXED: lf t55xx fsk now demods but only to binary.
authoriceman1001 <iceman@iuse.se>
Thu, 23 Oct 2014 16:36:44 +0000 (18:36 +0200)
committericeman1001 <iceman@iuse.se>
Thu, 23 Oct 2014 16:36:44 +0000 (18:36 +0200)
ADD:  holimans lf io / hid fskdemod  changes.

armsrc/appmain.c
armsrc/apps.h
armsrc/lfops.c
client/cmdhf15.c
client/cmdhw.c
client/cmdlft55xx.c
client/cmdlft55xx.h
client/cmdmain.c
client/proxmark3.c
client/ui.c

index afed56b77b5a7f2b4b2792e0ed9823d6f0839db5..b9ad1abd84005f7a54a6c854f4bcd02bbbdddd3a 100644 (file)
@@ -24,6 +24,7 @@
 #include "legicrf.h"
 #include "../include/hitag2.h"
 
 #include "legicrf.h"
 #include "../include/hitag2.h"
 
+
 #ifdef WITH_LCD
  #include "LCD.h"
 #endif
 #ifdef WITH_LCD
  #include "LCD.h"
 #endif
@@ -359,6 +360,7 @@ void SamyRun()
 
        int selected = 0;
        int playing = 0;
 
        int selected = 0;
        int playing = 0;
+       int cardRead = 0;
 
        // Turn on selected LED
        LED(selected + 1, 0);
 
        // Turn on selected LED
        LED(selected + 1, 0);
@@ -374,7 +376,7 @@ void SamyRun()
                SpinDelay(300);
 
                // Button was held for a second, begin recording
                SpinDelay(300);
 
                // Button was held for a second, begin recording
-               if (button_pressed > 0)
+               if (button_pressed > 0 && cardRead == 0)
                {
                        LEDsoff();
                        LED(selected + 1, 0);
                {
                        LEDsoff();
                        LED(selected + 1, 0);
@@ -400,6 +402,40 @@ void SamyRun()
                        // If we were previously playing, set playing off
                        // so next button push begins playing what we recorded
                        playing = 0;
                        // If we were previously playing, set playing off
                        // so next button push begins playing what we recorded
                        playing = 0;
+                       
+                       cardRead = 1;
+       
+               }
+
+               else if (button_pressed > 0 && cardRead == 1)
+               {
+                                       LEDsoff();
+                                       LED(selected + 1, 0);
+                                       LED(LED_ORANGE, 0);
+
+                                       // record
+                                       Dbprintf("Cloning %x %x %x", selected, high[selected], low[selected]);
+
+                                       // wait for button to be released
+                                       while(BUTTON_PRESS())
+                                               WDT_HIT();
+
+                                       /* need this delay to prevent catching some weird data */
+                                       SpinDelay(500);
+
+                                       CopyHIDtoT55x7(high[selected], low[selected], 0, 0);
+                                       Dbprintf("Cloned %x %x %x", selected, high[selected], low[selected]);
+
+                                       LEDsoff();
+                                       LED(selected + 1, 0);
+                                       // Finished recording
+
+                                       // If we were previously playing, set playing off
+                                       // so next button push begins playing what we recorded
+                                       playing = 0;
+                                       
+                                       cardRead = 0;
+                       
                }
 
                // Change where to record (or begin playing)
                }
 
                // Change where to record (or begin playing)
index 6f96875bc23e3dd10d9e4a7141c5e4ae91784b07..a4dd3d0843a73c8012d73076a1749612a0af9385 100644 (file)
@@ -72,7 +72,10 @@ void ToSendReset(void);
 void ListenReaderField(int limit);
 void AcquireRawAdcSamples125k(int at134khz);
 void SnoopLFRawAdcSamples(int divisor, int trigger_threshold);
 void ListenReaderField(int limit);
 void AcquireRawAdcSamples125k(int at134khz);
 void SnoopLFRawAdcSamples(int divisor, int trigger_threshold);
-void DoAcquisition125k(int trigger_threshold);
+void DoAcquisition125k_internal(int trigger_threshold, bool silent);
+void DoAcquisition125k_threshold(int trigger_threshold);
+void DoAcquisition125k();
+
 extern int ToSendMax;
 extern uint8_t ToSend[];
 extern uint32_t BigBuf[];
 extern int ToSendMax;
 extern uint8_t ToSend[];
 extern uint32_t BigBuf[];
index e086a7174d3e252bf21909ab46fc764e9bc6b121..136a1567c7b630d2f919b8b5d9180e9a05f472e9 100644 (file)
@@ -42,17 +42,17 @@ void LFSetupFPGAForADC(int divisor, bool lf_field)
 void AcquireRawAdcSamples125k(int divisor)
 {
        LFSetupFPGAForADC(divisor, true);
 void AcquireRawAdcSamples125k(int divisor)
 {
        LFSetupFPGAForADC(divisor, true);
-       DoAcquisition125k(-1);
+       DoAcquisition125k();
 }
 
 void SnoopLFRawAdcSamples(int divisor, int trigger_threshold)
 {
        LFSetupFPGAForADC(divisor, false);
 }
 
 void SnoopLFRawAdcSamples(int divisor, int trigger_threshold)
 {
        LFSetupFPGAForADC(divisor, false);
-       DoAcquisition125k(trigger_threshold);
+       DoAcquisition125k_threshold(trigger_threshold);
 }
 
 // split into two routines so we can avoid timing issues after sending commands //
 }
 
 // split into two routines so we can avoid timing issues after sending commands //
-void DoAcquisition125k(int trigger_threshold)
+void DoAcquisition125k_internal(int trigger_threshold, bool silent)
 {
        uint8_t *dest =  mifare_get_bigbufptr();
        int n = 8000;
 {
        uint8_t *dest =  mifare_get_bigbufptr();
        int n = 8000;
@@ -75,11 +75,18 @@ void DoAcquisition125k(int trigger_threshold)
                        if (++i >= n) break;
                }
        }
                        if (++i >= n) break;
                }
        }
-       Dbprintf("buffer samples: %02x %02x %02x %02x %02x %02x %02x %02x ...",
+       if (!silent){
+               Dbprintf("buffer samples: %02x %02x %02x %02x %02x %02x %02x %02x ...",
                        dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
                        dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
-                       
+       }
 }
 }
-
+void DoAcquisition125k_threshold(int trigger_threshold) {
+        DoAcquisition125k_internal(trigger_threshold, true);
+}
+void DoAcquisition125k() {
+        DoAcquisition125k_internal(-1, true);
+}      
+       
 void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, uint8_t *command)
 {
        int at134khz;
 void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, uint8_t *command)
 {
        int at134khz;
@@ -138,7 +145,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1,
        FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
 
        // now do the read
        FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
 
        // now do the read
-       DoAcquisition125k(-1);
+       DoAcquisition125k();
 }
 
 /* blank r/w tag data stream
 }
 
 /* blank r/w tag data stream
@@ -614,331 +621,206 @@ void CmdHIDsimTAG(int hi, int lo, int ledcontrol)
                LED_A_OFF();
 }
 
                LED_A_OFF();
 }
 
-
-// loop to capture raw HID waveform then FSK demodulate the TAG ID from it
-void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
+size_t fsk_demod(uint8_t * dest, size_t size)
 {
 {
-       uint8_t *dest = (uint8_t *)BigBuf;
-       int m=0, n=0, i=0, idx=0, found=0, lastval=0;
-  uint32_t hi2=0, hi=0, lo=0;
+       uint32_t last_transition = 0;
+       uint32_t idx = 1;
 
 
-       FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
-       FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
+       // we don't care about actual value, only if it's more or less than a
+       // threshold essentially we capture zero crossings for later analysis
+       uint8_t threshold_value = 127;
 
 
-       // Connect the A/D to the peak-detected low-frequency path.
-       SetAdcMuxFor(GPIO_MUXSEL_LOPKD);
+       // sync to first lo-hi transition, and threshold
 
 
-       // Give it a bit of time for the resonant antenna to settle.
-       SpinDelay(50);
+       //Need to threshold first sample
+       dest[0] = (dest[0] < threshold_value) ? 0 : 1;
 
 
-       // Now set up the SSC to get the ADC samples that are now streaming at us.
-       FpgaSetupSsc();
+       size_t numBits = 0;
+       // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)
+       // or 10 (fc/10) cycles but in practice due to noise etc we may end up with with anywhere
+       // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10
+       for(idx = 1; idx < size; idx++) {
+               // threshold current value
+               dest[idx] = (dest[idx] < threshold_value) ? 0 : 1;
 
 
-       for(;;) {
-               WDT_HIT();
-               if (ledcontrol)
-                       LED_A_ON();
-               if(BUTTON_PRESS()) {
-                       DbpString("Stopped");
-                       if (ledcontrol)
-                               LED_A_OFF();
-                       return;
-               }
+               // Check for 0->1 transition
+               if (dest[idx-1] < dest[idx]) { // 0 -> 1 transition
 
 
-               i = 0;
-               m = sizeof(BigBuf);
-               memset(dest,128,m);
-               for(;;) {
-                       if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
-                               AT91C_BASE_SSC->SSC_THR = 0x43;
-                               if (ledcontrol)
-                                       LED_D_ON();
-                       }
-                       if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
-                               dest[i] = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
-                               // we don't care about actual value, only if it's more or less than a
-                               // threshold essentially we capture zero crossings for later analysis
-                               if(dest[i] < 127) dest[i] = 0; else dest[i] = 1;
-                               i++;
-                               if (ledcontrol)
-                                       LED_D_OFF();
-                               if(i >= m) {
-                                       break;
-                               }
-                       }
+                       dest[numBits] =  (idx-last_transition <  9) ? 1 : 0;
+                       last_transition = idx;
+                       numBits++;
                }
                }
+       }
+       return numBits; //Actually, it returns the number of bytes, but each byte represents a bit: 1 or 0
+}
 
 
-               // FSK demodulator
 
 
-               // sync to first lo-hi transition
-               for( idx=1; idx<m; idx++) {
-                       if (dest[idx-1]<dest[idx])
-                               lastval=idx;
-                               break;
+size_t aggregate_bits(uint8_t *dest,size_t size, uint8_t h2l_crossing_value,uint8_t l2h_crossing_value, uint8_t maxConsequtiveBits )
+{
+       uint8_t lastval=dest[0];
+       uint32_t idx=0;
+       size_t numBits=0;
+       uint32_t n=1;
+
+       for( idx=1; idx < size; idx++) {
+
+               if (dest[idx]==lastval) {
+                       n++;
+                       continue;
+               }
+               //if lastval was 1, we have a 1->0 crossing
+               if ( dest[idx-1] ) {
+                       n=(n+1) / h2l_crossing_value;
+               } else {// 0->1 crossing
+                       n=(n+1) / l2h_crossing_value;
+               }
+               if (n == 0) n = 1;
+
+               if(n < maxConsequtiveBits)
+               {
+                       memset(dest+numBits, dest[idx-1] , n);
+                       numBits += n;
                }
                }
+               n=0;
+               lastval=dest[idx];
+       }//end for
+
+       return numBits;
+
+}
+// loop to capture raw HID waveform then FSK demodulate the TAG ID from it
+void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
+{
+       uint8_t *dest = (uint8_t *)BigBuf;
+
+       size_t size=0,idx=0; //, found=0;
+  uint32_t hi2=0, hi=0, lo=0;
+
+
+       while(!BUTTON_PRESS()) {
+
+               // Configure to go in 125Khz listen mode
+               LFSetupFPGAForADC(0,true);
+
                WDT_HIT();
                WDT_HIT();
+               if (ledcontrol) LED_A_ON();
 
 
-               // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)
-               // or 10 (fc/10) cycles but in practice due to noise etc we may end up with with anywhere
-               // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10
-               for( i=0; idx<m; idx++) {
-                       if (dest[idx-1]<dest[idx]) {
-                               dest[i]=idx-lastval;
-                               if (dest[i] <= 8) {
-                                               dest[i]=1;
-                               } else {
-                                               dest[i]=0;
-                               }
+               DoAcquisition125k();
+               size  = sizeof(BigBuf);
 
 
-                               lastval=idx;
-                               i++;
-                       }
-               }
-               m=i;
+               // FSK demodulator
+               size = fsk_demod(dest, size);
                WDT_HIT();
 
                // we now have a set of cycle counts, loop over previous results and aggregate data into bit patterns
                WDT_HIT();
 
                // we now have a set of cycle counts, loop over previous results and aggregate data into bit patterns
-               lastval=dest[0];
-               idx=0;
-               i=0;
-               n=0;
-               for( idx=0; idx<m; idx++) {
-                       if (dest[idx]==lastval) {
-                               n++;
-                       } else {
-                               // a bit time is five fc/10 or six fc/8 cycles so figure out how many bits a pattern width represents,
-                               // an extra fc/8 pattern preceeds every 4 bits (about 200 cycles) just to complicate things but it gets
-                               // swallowed up by rounding
-                               // expected results are 1 or 2 bits, any more and it's an invalid manchester encoding
-                               // special start of frame markers use invalid manchester states (no transitions) by using sequences
-                               // like 111000
-                               if (dest[idx-1]) {
-                                       n=(n+1)/6;                      // fc/8 in sets of 6
-                               } else {
-                                       n=(n+1)/5;                      // fc/10 in sets of 5
-                               }
-                               switch (n) {                    // stuff appropriate bits in buffer
-                                       case 0:
-                                       case 1: // one bit
-                                               dest[i++]=dest[idx-1];
-                                               break;
-                                       case 2: // two bits
-                                               dest[i++]=dest[idx-1];
-                                               dest[i++]=dest[idx-1];
-                                               break;
-                                       case 3: // 3 bit start of frame markers
-                                               dest[i++]=dest[idx-1];
-                                               dest[i++]=dest[idx-1];
-                                               dest[i++]=dest[idx-1];
-                                               break;
-                                       // When a logic 0 is immediately followed by the start of the next transmisson
-                                       // (special pattern) a pattern of 4 bit duration lengths is created.
-                                       case 4:
-                                               dest[i++]=dest[idx-1];
-                                               dest[i++]=dest[idx-1];
-                                               dest[i++]=dest[idx-1];
-                                               dest[i++]=dest[idx-1];
-                                               break;
-                                       default:        // this shouldn't happen, don't stuff any bits
-                                               break;
-                               }
-                               n=0;
-                               lastval=dest[idx];
-                       }
-               }
-               m=i;
+               // 1->0 : fc/8 in sets of 6
+               // 0->1 : fc/10 in sets of 5
+               size = aggregate_bits(dest,size, 6,5,5);
+
                WDT_HIT();
 
                // final loop, go over previously decoded manchester data and decode into usable tag ID
                // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0
                WDT_HIT();
 
                // final loop, go over previously decoded manchester data and decode into usable tag ID
                // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0
-               for( idx=0; idx<m-6; idx++) {
+               uint8_t frame_marker_mask[] = {1,1,1,0,0,0};
+               int numshifts = 0;
+               idx = 0;
+               while( idx + sizeof(frame_marker_mask) < size) {
                        // search for a start of frame marker
                        // search for a start of frame marker
-                       if ( dest[idx] && dest[idx+1] && dest[idx+2] && (!dest[idx+3]) && (!dest[idx+4]) && (!dest[idx+5]) )
-                       {
-                               found=1;
-                               idx+=6;
-        if (found && (hi2|hi|lo)) {
-          if (hi2 != 0){
-            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);
-          }
-                                       /* if we're only looking for one tag */
-                                       if (findone)
-                                       {
-                                               *high = hi;
-                                               *low = lo;
-                                               return;
-                                       }
-          hi2=0;
-                                       hi=0;
-                                       lo=0;
-                                       found=0;
-                               }
-                       }
-                       if (found) {
-                               if (dest[idx] && (!dest[idx+1]) ) {
+                       if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0)
+                       { // frame marker found
+                               idx+=sizeof(frame_marker_mask);
+
+                               while(dest[idx] != dest[idx+1] && idx < size-2)
+                               {       // Keep going until next frame marker (or error)
+                                       // Shift in a bit. Start by shifting high registers
           hi2=(hi2<<1)|(hi>>31);
                                        hi=(hi<<1)|(lo>>31);
           hi2=(hi2<<1)|(hi>>31);
                                        hi=(hi<<1)|(lo>>31);
+                                       //Then, shift in a 0 or one into low
+                                       if (dest[idx] && !dest[idx+1])  // 1 0
                                        lo=(lo<<1)|0;
                                        lo=(lo<<1)|0;
-                               } else if ( (!dest[idx]) && dest[idx+1]) {
-          hi2=(hi2<<1)|(hi>>31);
-                                       hi=(hi<<1)|(lo>>31);
-                                       lo=(lo<<1)|1;
-                               } else {
-                                       found=0;
-          hi2=0;
-                                       hi=0;
-                                       lo=0;
+                                       else // 0 1
+                                               lo=(lo<<1)|
+                                                               1;
+                                       numshifts ++;
+                                       idx += 2;
                                }
                                }
-                               idx++;
-                       }
-                       if ( dest[idx] && dest[idx+1] && dest[idx+2] && (!dest[idx+3]) && (!dest[idx+4]) && (!dest[idx+5]) )
-                       {
-                               found=1;
-                               idx+=6;
-                               if (found && (hi|lo)) {
-          if (hi2 != 0){
-            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);
-          }
-                                       /* if we're only looking for one tag */
-                                       if (findone)
-                                       {
-                                               *high = hi;
-                                               *low = lo;
-                                               return;
+                               //Dbprintf("Num shifts: %d ", numshifts);
+                               // Hopefully, we read a tag and  hit upon the next frame marker
+                               if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0)
+                               {
+                                       if (hi2 != 0){
+                                               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);
                                        }
                                        }
-          hi2=0;
-                                       hi=0;
-                                       lo=0;
-                                       found=0;
                                }
                                }
+
+                               // reset
+                               hi2 = hi = lo = 0;
+                               numshifts = 0;
+                       }else
+                       {
+                               idx++;
                        }
                }
                WDT_HIT();
                        }
                }
                WDT_HIT();
+
        }
        }
+       DbpString("Stopped");
+       if (ledcontrol) LED_A_OFF();
 }
 
 }
 
+uint32_t bytebits_to_byte(uint8_t* src, int numbits)
+{
+       uint32_t num = 0;
+       for(int i = 0 ; i < numbits ; i++)
+       {
+               num = (num << 1) | (*src);
+               src++;
+       }
+       return num;
+}
+
+
 void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
 {
 void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
 {
-       uint8_t *dest =  mifare_get_bigbufptr();
-       int m=0, n=0, i=0, idx=0, lastval=0;
-       int found=0;
-       uint32_t code=0, code2=0;
+       uint8_t *dest = (uint8_t *)BigBuf;
 
 
-       LFSetupFPGAForADC(0, true);
+       size_t size=0, idx=0;
+       uint32_t code=0, code2=0;
 
 
-       for(;;) {
-               WDT_HIT();
-               if (ledcontrol)
-                       LED_A_ON();
-               if(BUTTON_PRESS()) {
-                       DbpString("Stopped");
-                       if (ledcontrol)
-                               LED_A_OFF();
-                       return;
-               }
 
 
-               i = 0;
-               m = 30000;
-               memset(dest,128,m);
-               for(;;) {
-                       if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
-                               AT91C_BASE_SSC->SSC_THR = 0x43;
-                               if (ledcontrol)
-                                       LED_D_ON();
-                       }
-                       if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
-                               dest[i] = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
-                               // we don't care about actual value, only if it's more or less than a
-                               // threshold essentially we capture zero crossings for later analysis
-                               dest[i] = (dest[i] < 127) ? 0 : 1;
-                               ++i;
-                               if (ledcontrol)
-                                       LED_D_OFF();
-                               if(i >= m)      
-                                       break;
-                       }
-               }
+       while(!BUTTON_PRESS()) {
 
 
-               // FSK demodulator
+               // Configure to go in 125Khz listen mode
+               LFSetupFPGAForADC(0,true);
 
 
-               // sync to first lo-hi transition
-               for( idx=1; idx<m; idx++) {
-                       if (dest[idx-1]<dest[idx])
-                               lastval=idx;
-                               break;
-               }
                WDT_HIT();
                WDT_HIT();
+               if (ledcontrol) LED_A_ON();
 
 
-               // count cycles between consecutive lo-hi transitions, there should be either 8 (fc/8)
-               // or 10 (fc/10) cycles but in practice due to noise etc we may end up with with anywhere
-               // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10
-               for( i=0; idx<m; idx++) {
-                       if (dest[idx-1]<dest[idx]) {
-                               dest[i]=idx-lastval;
-                               dest[i] = (dest[i] <= 8) ? 1:0;
-                               lastval=idx;
-                               i++;
-                       }
-               }
-               m=i;
+               DoAcquisition125k(true);
+               size  = sizeof(BigBuf);
+
+               // FSK demodulator
+               size = fsk_demod(dest, size);
                WDT_HIT();
 
                // we now have a set of cycle counts, loop over previous results and aggregate data into bit patterns
                WDT_HIT();
 
                // we now have a set of cycle counts, loop over previous results and aggregate data into bit patterns
-               lastval=dest[0];
-               idx=0;
-               i=0;
-               n=0;
-               for( idx=0; idx<m; idx++) {
-                       if (dest[idx]==lastval) {
-                               n++;
-                       } else {
-                               // a bit time is five fc/10 or six fc/8 cycles so figure out how many bits a pattern width represents,
-                               // an extra fc/8 pattern preceeds every 4 bits (about 200 cycles) just to complicate things but it gets
-                               // swallowed up by rounding
-                               // expected results are 1 or 2 bits, any more and it's an invalid manchester encoding
-                               // special start of frame markers use invalid manchester states (no transitions) by using sequences
-                               // like 111000
-                               if (dest[idx-1]) {
-                                       n=(n+1)/7;                      // fc/8 in sets of 7
-                               } else {
-                                       n=(n+1)/6;                      // fc/10 in sets of 6
-                               }
-
-                               // stuff appropriate bits in buffer
-                               if ( n==0 )
-                                       dest[i++]=dest[idx-1]^1;
-                               else {
-                                       if ( n < 13){
-                                               for(int j=0; j<n; j++){
-                                                       dest[i++]=dest[idx-1]^1;
-                                               }
-                                       }
-                               }
-                               
-                               n=0;
-                               lastval=dest[idx];
-                       }
-               }//end for
+               // 1->0 : fc/8 in sets of 7
+               // 0->1 : fc/10 in sets of 6
+               size = aggregate_bits(dest, size, 7,6,13);
 
 
-               m=i;
                WDT_HIT();
                
                WDT_HIT();
                
-        for( idx=0; idx<m-9; idx++) {
-         if ( !(dest[idx]) && !(dest[idx+1]) && !(dest[idx+2]) && !(dest[idx+3]) && !(dest[idx+4]) && !(dest[idx+5]) && !(dest[idx+6]) && !(dest[idx+7]) && !(dest[idx+8])&& (dest[idx+9])){
-               found=1;
-               //idx+=9;
-               if (found) {
+               //Handle the data
+           uint8_t mask[] = {0,0,0,0,0,0,0,0,0,1};
+               for( idx=0; idx < size - 64; idx++) {
+
+               if ( memcmp(dest + idx, mask, sizeof(mask)) ) continue;
+
                    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]);
                    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]);
@@ -948,54 +830,26 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx+48],dest[idx+49],dest[idx+50],dest[idx+51],dest[idx+52],dest[idx+53],dest[idx+54],dest[idx+55]);
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx+56],dest[idx+57],dest[idx+58],dest[idx+59],dest[idx+60],dest[idx+61],dest[idx+62],dest[idx+63]);
                
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx+48],dest[idx+49],dest[idx+50],dest[idx+51],dest[idx+52],dest[idx+53],dest[idx+54],dest[idx+55]);
                    Dbprintf("%d%d%d%d%d%d%d%d",dest[idx+56],dest[idx+57],dest[idx+58],dest[idx+59],dest[idx+60],dest[idx+61],dest[idx+62],dest[idx+63]);
                
-                   short version='\x00';
-                   char unknown='\x00';
-                   uint16_t number=0;
-                   for(int j=14;j<18;j++){
-                      //Dbprintf("%d",dest[idx+j]);
-                      version <<=1;
-                      if (dest[idx+j]) version |= 1;
-                   }
-                   for(int j=19;j<27;j++){
-                      //Dbprintf("%d",dest[idx+j]);
-                      unknown <<=1;
-                      if (dest[idx+j]) unknown |= 1;
-                   }
-                   for(int j=37;j<45;j++){
-                      //Dbprintf("%d",dest[idx+j]);
-                      number <<=1;
-                      if (dest[idx+j]) number |= 1;
-                   }
-                   for(int j=46;j<53;j++){
-                      //Dbprintf("%d",dest[idx+j]);
-                      number <<=1;
-                      if (dest[idx+j]) number |= 1;
-                   }
+                   code = bytebits_to_byte(dest+idx,32);
+                   code2 = bytebits_to_byte(dest+idx+32,32); 
                        
                        
-                   for(int j=0; j<32; j++){
-                               code <<=1;
-                               if(dest[idx+j]) code |= 1;
-                   }
-                   for(int j=32; j<64; j++){
-                               code2 <<=1;
-                               if(dest[idx+j]) code2 |= 1;
-                   }
+                   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); 
                    
                    Dbprintf("XSF(%02d)%02x:%d (%08x%08x)",version,unknown,number,code,code2);
                    
                    Dbprintf("XSF(%02d)%02x:%d (%08x%08x)",version,unknown,number,code,code2);
-                   if (ledcontrol)
-                       LED_D_OFF();
-               }
+                   if (ledcontrol)     LED_D_OFF();
+               
                // if we're only looking for one tag 
                if (findone){
                        LED_A_OFF();
                        return;
                }
                // if we're only looking for one tag 
                if (findone){
                        LED_A_OFF();
                        return;
                }
-
-               found=0;
-         }
-       }
        }
        WDT_HIT();
        }
        WDT_HIT();
+       }
+       DbpString("Stopped");
+       if (ledcontrol) LED_A_OFF();
 }
 
 /*------------------------------
 }
 
 /*------------------------------
index 55a33de7617a7cd0f0b2a4bc5025e1dc7763308d..1ee04e1b773081e52a52f0c8cc6f60713deeacfc 100644 (file)
@@ -347,7 +347,7 @@ int CmdHF15DumpMem(const char*Cmd) {
                                if (!(recv[0] & ISO15_RES_ERROR)) {
                                        retry=0;
                                        *output=0; // reset outputstring
                                if (!(recv[0] & ISO15_RES_ERROR)) {
                                        retry=0;
                                        *output=0; // reset outputstring
-                                       sprintf(output, "Block %2i   ",blocknum);
+                                       sprintf(output, "Block %02x   ",blocknum);
                                        for ( int i=1; i<resp.arg[0]-2; i++) { // data in hex
                                                sprintf(output+strlen(output),"%02X ",recv[i]);
                                        }                                       
                                        for ( int i=1; i<resp.arg[0]-2; i++) { // data in hex
                                                sprintf(output+strlen(output),"%02X ",recv[i]);
                                        }                                       
index a526fe86b85f51c83a8cc484596402a7a69f3289..68e992765a4ea4c92a3578c12a25d72754a04aed 100644 (file)
@@ -418,7 +418,7 @@ static command_t CommandTable[] =
   {"setlfdivisor",  CmdSetDivisor,  0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
   {"setmux",        CmdSetMux,      0, "<loraw|hiraw|lopkd|hipkd> -- Set the ADC mux to a specific value"},
   {"tune",          CmdTune,        0, "Measure antenna tuning"},
   {"setlfdivisor",  CmdSetDivisor,  0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
   {"setmux",        CmdSetMux,      0, "<loraw|hiraw|lopkd|hipkd> -- Set the ADC mux to a specific value"},
   {"tune",          CmdTune,        0, "Measure antenna tuning"},
-  {"version",       CmdVersion,     0, "Show version inforation about the connected Proxmark"},
+  {"version",       CmdVersion,     0, "Show version information about the connected Proxmark"},
   {NULL, NULL, 0, NULL}
 };
 
   {NULL, NULL, 0, NULL}
 };
 
index 9206fd2ad946e635ef70d82efee8ef83a0b1d902..8420465b93f231734436d40b902801fbf86a0152 100644 (file)
@@ -28,9 +28,7 @@ static int CmdHelp(const char *Cmd);
 \r
 int CmdReadBlk(const char *Cmd)\r
 {\r
 \r
 int CmdReadBlk(const char *Cmd)\r
 {\r
-       //default to invalid block\r
        int Block = -1;\r
        int Block = -1;\r
-       UsbCommand c;\r
 \r
        sscanf(Cmd, "%d", &Block);\r
 \r
 \r
        sscanf(Cmd, "%d", &Block);\r
 \r
@@ -39,10 +37,8 @@ int CmdReadBlk(const char *Cmd)
                return 1;\r
        }       \r
 \r
                return 1;\r
        }       \r
 \r
-       //PrintAndLog(" Reading page 0 block : %d", Block);\r
-\r
        // this command fills up BigBuff\r
        // this command fills up BigBuff\r
-       // \r
+       UsbCommand c;\r
        c.cmd = CMD_T55XX_READ_BLOCK;\r
        c.d.asBytes[0] = 0x00;\r
        c.arg[0] = 0;\r
        c.cmd = CMD_T55XX_READ_BLOCK;\r
        c.d.asBytes[0] = 0x00;\r
        c.arg[0] = 0;\r
@@ -57,10 +53,10 @@ int CmdReadBlk(const char *Cmd)
        WaitForResponseTimeout(CMD_ACK,NULL, 1500);\r
 \r
        for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {\r
        WaitForResponseTimeout(CMD_ACK,NULL, 1500);\r
 \r
        for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {\r
-               GraphBuffer[j] = ((int)data[j]) ;\r
+               GraphBuffer[j] = (int)data[j];\r
        }\r
        GraphTraceLen = LF_TRACE_BUFF_SIZE;\r
        }\r
        GraphTraceLen = LF_TRACE_BUFF_SIZE;\r
-       CmdIceManchester(Cmd);\r
+       CmdIceManchester(Block);\r
        RepaintGraphWindow();\r
   return 0;\r
 }\r
        RepaintGraphWindow();\r
   return 0;\r
 }\r
@@ -97,9 +93,7 @@ int CmdReadBlkPWD(const char *Cmd)
                GraphBuffer[j] = ((int)data[j]) - 128;\r
        }\r
        GraphTraceLen = LF_TRACE_BUFF_SIZE;\r
                GraphBuffer[j] = ((int)data[j]) - 128;\r
        }\r
        GraphTraceLen = LF_TRACE_BUFF_SIZE;\r
-\r
-       CmdIceManchester(Cmd);\r
-       \r
+       CmdIceManchester(Block);        \r
        RepaintGraphWindow();\r
   return 0;\r
 }\r
        RepaintGraphWindow();\r
   return 0;\r
 }\r
@@ -349,6 +343,10 @@ int CmdIceFsk(const char *Cmd){
        return 0;\r
 }\r
 int CmdIceManchester(const char *Cmd){\r
        return 0;\r
 }\r
 int CmdIceManchester(const char *Cmd){\r
+       ManchesterDemod( -1);\r
+       return 0;\r
+}\r
+int ManchesterDemod(int block){\r
 \r
        int  blockNum = -1;\r
        uint32_t blockData;\r
 \r
        int  blockNum = -1;\r
        uint32_t blockData;\r
@@ -357,9 +355,9 @@ int CmdIceManchester(const char *Cmd){
        \r
        manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);  \r
     blockData = PackBits(5, 32, bitstream);\r
        \r
        manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);  \r
     blockData = PackBits(5, 32, bitstream);\r
-       sscanf(Cmd, "%d", &blockNum);\r
+\r
        if ( blockNum > -1){\r
        if ( blockNum > -1){\r
-               PrintAndLog("   Block %d  : 0x%08X  %s", blockNum, blockData, sprint_bin(bitstream+5,32) );\r
+               PrintAndLog("   Block %d : 0x%08X  %s", blockNum, blockData, sprint_bin(bitstream+5,32) );\r
        }else{\r
                PrintAndLog("   Decoded : 0x%08X  %s", blockData, sprint_bin(bitstream+5,32) );\r
        }\r
        }else{\r
                PrintAndLog("   Decoded : 0x%08X  %s", blockData, sprint_bin(bitstream+5,32) );\r
        }\r
@@ -484,7 +482,7 @@ static command_t CommandTable[] =
   {"info",   CmdInfo,        0, "[1] Read T55xx configuration data (page0 /blk 0)"},\r
   {"dump",   CmdDump,        0, "[password] Dump T55xx card block 0-7. optional with password"},\r
   {"fsk",    CmdIceFsk,      0, "FSK demod"},\r
   {"info",   CmdInfo,        0, "[1] Read T55xx configuration data (page0 /blk 0)"},\r
   {"dump",   CmdDump,        0, "[password] Dump T55xx card block 0-7. optional with password"},\r
   {"fsk",    CmdIceFsk,      0, "FSK demod"},\r
-  {"man",    CmdIceManchester,      0, "Manchester demod"},\r
+  {"man",    CmdIceManchester,      0, "Manchester demod (with SST)"},\r
   {NULL, NULL, 0, NULL}\r
 };\r
 \r
   {NULL, NULL, 0, NULL}\r
 };\r
 \r
index d5c55f114774824b1cf0cc4c4fb6f2a2b3be4f7a..8c0cdf58b8e87e534ea683b0ef37e6c099f18886 100644 (file)
@@ -20,6 +20,7 @@ int CmdReadTrace(const char *Cmd);
 int CmdInfo(const char *Cmd);\r
 int CmdIceFsk(const char *Cmd);\r
 int CmdIceManchester(const char *Cmd);\r
 int CmdInfo(const char *Cmd);\r
 int CmdIceFsk(const char *Cmd);\r
 int CmdIceManchester(const char *Cmd);\r
+int ManchesterDemod(int block);\r
 char * GetBitRateStr(uint32_t id);\r
 char * GetSaferStr(uint32_t id);\r
 char * GetModulationStr( uint32_t id);\r
 char * GetBitRateStr(uint32_t id);\r
 char * GetSaferStr(uint32_t id);\r
 char * GetModulationStr( uint32_t id);\r
index c56aaa63317903a37c9f99027b11871806462043..bf69c5ad83a7d3493399dfe4bfd7a2284bb73482 100644 (file)
 #include "util.h"
 #include "cmdscript.h"
 
 #include "util.h"
 #include "cmdscript.h"
 
+int delta125[2];
+int delta134[2];
+int deltahf[2];
+int deltaReset = 0;
 
 unsigned int current_command = CMD_UNKNOWN;
 //unsigned int received_command = CMD_UNKNOWN;
 
 unsigned int current_command = CMD_UNKNOWN;
 //unsigned int received_command = CMD_UNKNOWN;
@@ -210,13 +214,30 @@ void UsbCommandReceived(UsbCommand *UC)
       int vLf125, vLf134, vHf;
       vLf125 = UC->arg[0] & 0xffff;
       vLf134 = UC->arg[0] >> 16;
       int vLf125, vLf134, vHf;
       vLf125 = UC->arg[0] & 0xffff;
       vLf134 = UC->arg[0] >> 16;
-      vHf = UC->arg[1] & 0xffff;;
-      peakf = UC->arg[2] & 0xffff;
-      peakv = UC->arg[2] >> 16;
+      vHf    = UC->arg[1] & 0xffff;;
+      peakf  = UC->arg[2] & 0xffff;
+      peakv  = UC->arg[2] >> 16;
+         
+         //Reset delta trigger every 3:d time
+         
+         if ( deltaReset == 4){
+               delta125[0] = vLf125;
+               delta134[0] = vLf134; 
+               deltahf[0]  = vHf;
+         } else if ( deltaReset == 2){
+               delta125[1] = vLf125;
+               delta134[1] = vLf134; 
+               deltahf[1]  = vHf;  
+         }
+         
+         if ( deltaReset == 0){
+               
+         }
+         
       PrintAndLog("");
       PrintAndLog("# LF antenna: %5.2f V @   125.00 kHz", vLf125/1000.0);
       PrintAndLog("# LF antenna: %5.2f V @   134.00 kHz", vLf134/1000.0);
       PrintAndLog("");
       PrintAndLog("# LF antenna: %5.2f V @   125.00 kHz", vLf125/1000.0);
       PrintAndLog("# LF antenna: %5.2f V @   134.00 kHz", vLf134/1000.0);
-      PrintAndLog("# LF optimal: %5.2f V @%9.2f kHz", peakv/1000.0, 12000.0/(peakf+1));
+      PrintAndLog("# LF optimal: %5.2f V @    %9.2f kHz", peakv/1000.0, 12000.0/(peakf+1));
       PrintAndLog("# HF antenna: %5.2f V @    13.56 MHz", vHf/1000.0);
       if (peakv<2000)
         PrintAndLog("# Your LF antenna is unusable.");
       PrintAndLog("# HF antenna: %5.2f V @    13.56 MHz", vHf/1000.0);
       if (peakv<2000)
         PrintAndLog("# Your LF antenna is unusable.");
@@ -226,7 +247,10 @@ void UsbCommandReceived(UsbCommand *UC)
         PrintAndLog("# Your HF antenna is unusable.");
       else if (vHf<5000)
         PrintAndLog("# Your HF antenna is marginal.");
         PrintAndLog("# Your HF antenna is unusable.");
       else if (vHf<5000)
         PrintAndLog("# Your HF antenna is marginal.");
-    } break;
+    } 
+       
+       deltaReset = (deltaReset == 0)  ? 4 :  deltaReset>>1;     
+       break;
       
     case CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K: {
 //      printf("received samples: ");
       
     case CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K: {
 //      printf("received samples: ");
index a9819b542da04302e0741085e5b2d1e99f967625..d2bb2011249f5d04ad3cf9bdf9e9c04be98bb5a5 100644 (file)
@@ -48,6 +48,11 @@ void SendCommand(UsbCommand *c) {
       return;
     }
 
       return;
     }
 
+       /**
+       The while-loop below causes hangups at times, when the pm3 unit is unresponsive
+       or disconnected. The main console thread is alive, but comm thread just spins here.
+       Not good.../holiman
+       **/
   while(txcmd_pending);
   txcmd = *c;
   txcmd_pending = true;
   while(txcmd_pending);
   txcmd = *c;
   txcmd_pending = true;
index 094b8e56e5814210c133b638adb34f4c18940b2b..59ca72dcdc5496b497b2afb4a9a946a1f1c3a2aa 100644 (file)
@@ -116,8 +116,8 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
        clock = GetT55x7Clock( data, len, high );       
        startindex = DetectFirstTransition(data, len, high);
   
        clock = GetT55x7Clock( data, len, high );       
        startindex = DetectFirstTransition(data, len, high);
   
-       // PrintAndLog(" Clock       : %d", clock);
-       // PrintAndLog(" startindex  : %d", startindex);
+       PrintAndLog(" Clock       : %d", clock);
+       PrintAndLog(" startindex  : %d", startindex);
        
        if (high != 1)
                bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex);
        
        if (high != 1)
                bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex);
@@ -579,25 +579,21 @@ void iceFsk3(int * data, const size_t len){
        
        printf("000111 position: %d \n", startPos);
 
        
        printf("000111 position: %d \n", startPos);
 
-       startPos += 6*fieldlen+1;
+       startPos += 6*fieldlen+5;
        
        
+       int bit =0;
        printf("BINARY\n");
        printf("R/40 :  ");
        for (i =startPos ; i < len; i += 40){
        printf("BINARY\n");
        printf("R/40 :  ");
        for (i =startPos ; i < len; i += 40){
-               if ( data[i] > 0 ) 
-                       printf("1");
-               else
-                       printf("0");
+               bit = data[i]>0 ? 1:0;
+               printf("%d", bit );
        }
        printf("\n");   
        
        printf("R/50 :  ");
        for (i =startPos ; i < len; i += 50){
        }
        printf("\n");   
        
        printf("R/50 :  ");
        for (i =startPos ; i < len; i += 50){
-               if ( data[i] > 0 ) 
-                       printf("1");
-               else
-                       printf("0");
-       }
+               bit = data[i]>0 ? 1:0;
+               printf("%d", bit );     }
        printf("\n");   
        
 }
        printf("\n");   
        
 }
Impressum, Datenschutz