]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - common/lfdemod.c
Add @iceman1001 s presco and pyramid functions +
[proxmark3-svn] / common / lfdemod.c
index 5ed2d16ce835758fefa1b7adad9d104fe6577b45..d6c024fab9bfa872d9a210fa9dfb9334453e6aca 100644 (file)
@@ -68,7 +68,7 @@ uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType)
 
 // by marshmellow
 // takes a array of binary values, start position, length of bits per parity (includes parity bit),
-//   Parity Type (1 for odd; 0 for even; 2 Always 1's), and binary Length (length to run) 
+//   Parity Type (1 for odd; 0 for even; 2 for Always 1's; 3 for Always 0's), and binary Length (length to run) 
 size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen)
 {
        uint32_t parityWd = 0;
@@ -80,10 +80,11 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p
                }
                j--; // overwrite parity with next data
                // if parity fails then return 0
-               if (pType == 2) { // then marker bit which should be a 1
-                       if (!BitStream[j]) return 0;
-               } else {
-                       if (parityTest(parityWd, pLen, pType) == 0) return 0;                   
+               switch (pType) {
+                       case 3: if (BitStream[j]==1) return 0; break; //should be 0 spacer bit
+                       case 2: if (BitStream[j]==0) return 0; break; //should be 1 spacer bit
+                       default: //test parity
+                               if (parityTest(parityWd, pLen, pType) == 0) return 0; break;
                }
                bitCnt+=(pLen-1);
                parityWd = 0;
@@ -95,7 +96,8 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p
 
 // by marshmellow
 // takes a array of binary values, length of bits per parity (includes parity bit),
-//   Parity Type (1 for odd; 0 for even; 2 Always 1's), and binary Length (length to run)
+//   Parity Type (1 for odd; 0 for even; 2 Always 1's; 3 Always 0's), and binary Length (length to run)
+//   Make sure *dest is long enough to store original sourceLen + #_of_parities_to_be_added
 size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t pLen, uint8_t pType)
 {
        uint32_t parityWd = 0;
@@ -106,10 +108,12 @@ size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t p
                        dest[j++] = (BitSource[word+bit]);
                }
                // if parity fails then return 0
-               if (pType == 2) { // then marker bit which should be a 1
-                       dest[j++]=1;
-               } else {
-                       dest[j++] = parityTest(parityWd, pLen-1, pType) ^ 1;
+               switch (pType) {
+                       case 3: dest[j++]=0; break; // marker bit which should be a 0
+                       case 2: dest[j++]=1; break; // marker bit which should be a 1
+                       default: 
+                               dest[j++] = parityTest(parityWd, pLen-1, pType) ^ 1;
+                               break;
                }
                bitCnt += pLen;
                parityWd = 0;
@@ -485,7 +489,7 @@ size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow
 
        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
+       // or 10 (fc/10) cycles but in practice due to noise etc we may end up with anywhere
        // between 7 to 11 cycles so fuzz it by treat anything <9 as 8 and anything else as 10
        for(idx = 161; idx < size-20; idx++) {
                // threshold current value
@@ -680,6 +684,19 @@ int VikingDemod_AM(uint8_t *dest, size_t *size) {
        return (int) startIdx;
 }
 
+// find presco preamble 0x10D in already demoded data
+int PrescoDemod(uint8_t *dest, size_t *size) {
+       //make sure buffer has data
+       if (*size < 64*2) return -2;
+
+       size_t startIdx = 0;
+       uint8_t preamble[] = {1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0};
+       uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
+       if (errChk == 0) return -4; //preamble not found
+       //return start position
+       return (int) startIdx;
+}
+
 // Ask/Biphase Demod then try to locate an ISO 11784/85 ID
 // BitStream must contain previously askrawdemod and biphasedemoded data
 int FDXBdemodBI(uint8_t *dest, size_t *size)
@@ -1529,11 +1546,12 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
        uint8_t fndClk[] = {8,16,32,40,50,64,128};
        int clk = 0; 
        int tol = 0;
-       int i, j, skip, start, end, low, high, minClk;
+       int i, j, skip, start, end, low, high, minClk, waveStart;
        bool complete = false;
        int tmpbuff[bufsize / 64];
+       int waveLen[bufsize / 64];
        size_t testsize = (bufsize < 512) ? bufsize : 512;
-       //int phaseoff = 0;
+       int phaseoff = 0;
        high = low = 128;
        memset(tmpbuff, 0, sizeof(tmpbuff));
 
@@ -1541,7 +1559,6 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
                if (g_debugMode==2) prnt("DEBUG STT: just noise detected - quitting");
                return false; //just noise
        }
-
        i = 0;
        j = 0;
        minClk = 255;
@@ -1560,11 +1577,14 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
                start= i;
                while ((buffer[i] < high) && (i < bufsize))
                        ++i;
+               //first high point for this wave
+               waveStart = i;
                while ((buffer[i] > low) && (i < bufsize))
                        ++i;
                if (j >= (bufsize/64)) {
                        break;
                }
+               waveLen[j] = i - waveStart; //first high to first low
                tmpbuff[j++] = i - start;
                if (i-start < minClk && i < bufsize) {
                        minClk = i - start;
@@ -1592,10 +1612,10 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
        start = -1;
        for (i = 0; i < j - 4; ++i) {
                skip += tmpbuff[i];
-               if (tmpbuff[i] >= clk*1-tol && tmpbuff[i] <= (clk*2)+tol) {           //1 to 2 clocks depending on 2 bits prior
-                       if (tmpbuff[i+1] >= clk*2-tol && tmpbuff[i+1] <= clk*2+tol) {       //2 clocks
-                               if (tmpbuff[i+2] >= (clk*3)/2-tol && tmpbuff[i+2] <= clk*2+tol) { //1 1/2 to 2 clocks
-                                       if (tmpbuff[i+3] >= clk*1-tol && tmpbuff[i+3] <= (clk*3)/2+tol) { //1 to 1 1/2 clocks for end of ST + first bit
+               if (tmpbuff[i] >= clk*1-tol && tmpbuff[i] <= (clk*2)+tol && waveLen[i] < clk+tol) {           //1 to 2 clocks depending on 2 bits prior
+                       if (tmpbuff[i+1] >= clk*2-tol && tmpbuff[i+1] <= clk*2+tol && waveLen[i+1] > clk*3/2-tol) {       //2 clocks and wave size is 1 1/2
+                               if (tmpbuff[i+2] >= (clk*3)/2-tol && tmpbuff[i+2] <= clk*2+tol && waveLen[i+2] > clk-tol) { //1 1/2 to 2 clocks and at least one full clock wave
+                                       if (tmpbuff[i+3] >= clk*1-tol && tmpbuff[i+3] <= clk*2+tol) { //1 to 2 clocks for end of ST + first bit
                                                start = i + 3;
                                                break;
                                        }
@@ -1608,7 +1628,11 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
                if (g_debugMode==2) prnt("DEBUG STT: first STT not found - quitting");
                return false;
        }
-
+       if (waveLen[i+2] > clk*1+tol)
+               phaseoff = 0;
+       else
+               phaseoff = clk/2;
+       
        // skip over the remainder of ST
        skip += clk*7/2; //3.5 clocks from tmpbuff[i] = end of st - also aligns for ending point
 
@@ -1617,9 +1641,9 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
        for (i += 3; i < j - 4; ++i) {
                end += tmpbuff[i];
                if (tmpbuff[i] >= clk*1-tol && tmpbuff[i] <= (clk*2)+tol) {           //1 to 2 clocks depending on 2 bits prior
-                       if (tmpbuff[i+1] >= clk*2-tol && tmpbuff[i+1] <= clk*2+tol) {       //2 clocks
-                               if (tmpbuff[i+2] >= (clk*3)/2-tol && tmpbuff[i+2] <= clk*2+tol) { //1 1/2 to 2 clocks
-                                       if (tmpbuff[i+3] >= clk*1-tol && tmpbuff[i+3] <= (clk*3)/2+tol) { //1 to 1 1/2 clocks for end of ST + first bit
+                       if (tmpbuff[i+1] >= clk*2-tol && tmpbuff[i+1] <= clk*2+tol && waveLen[i+1] > clk*3/2-tol) {       //2 clocks and wave size is 1 1/2
+                               if (tmpbuff[i+2] >= (clk*3)/2-tol && tmpbuff[i+2] <= clk*2+tol && waveLen[i+2] > clk-tol) { //1 1/2 to 2 clocks and at least one full clock wave
+                                       if (tmpbuff[i+3] >= clk*1-tol && tmpbuff[i+3] <= clk*2+tol) { //1 to 2 clocks for end of ST + first bit
                                                complete = true;
                                                break;
                                        }
@@ -1627,12 +1651,13 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
                        }
                }
        }
+       end -= phaseoff;
        //didn't find second ST - ERROR
        if (!complete) {
                if (g_debugMode==2) prnt("DEBUG STT: second STT not found - quitting");
                return false;
        }
-       if (g_debugMode==2) prnt("DEBUG STT: start of data: %d end of data: %d, datalen: %d, clk: %d, bits: %d", skip, end, end-skip, clk, (end-skip)/clk);
+       if (g_debugMode==2) prnt("DEBUG STT: start of data: %d end of data: %d, datalen: %d, clk: %d, bits: %d, phaseoff: %d", skip, end, end-skip, clk, (end-skip)/clk, phaseoff);
        //now begin to trim out ST so we can use normal demod cmds
        start = skip;
        size_t datalen = end - start;
Impressum, Datenschutz