X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/be2cf126bf74c3e0c60706dd2620c8a6d742e396..4d60f1562f0e7a042ba70a1bb8c00d1e404666bf:/common/lfdemod.c?ds=inline diff --git a/common/lfdemod.c b/common/lfdemod.c index 448195f2..a42566ad 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -25,7 +25,7 @@ uint8_t justNoise(uint8_t *BitStream, size_t size) } //by marshmellow -//get high and low with passed in fuzz factor. also return noise test = 1 for passed or 0 for only noise +//get high and low values of a wave with passed in fuzz factor. also return noise test = 1 for passed or 0 for only noise int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo) { *high=0; @@ -50,7 +50,7 @@ uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType) for (uint8_t i = 0; i < bitLen; i++){ ans ^= ((bits >> i) & 1); } - //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType); + //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType); return (ans == pType); } @@ -108,6 +108,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx) errChk = 0; break; } + //set uint64 with ID from BitStream for (uint8_t ii=0; ii<4; ii++){ lo = (lo << 1LL) | (BitStream[(i*5)+ii+idx]); } @@ -244,14 +245,14 @@ int ManchesterEncode(uint8_t *BitStream, size_t size) { size_t modIdx=20000, i=0; if (size>modIdx) return -1; - for (size_t idx=0; idx < size; idx++){ - BitStream[idx+modIdx++] = BitStream[idx]; - BitStream[idx+modIdx++] = BitStream[idx]^1; - } - for (; i<(size*2); i++){ - BitStream[i] = BitStream[i+20000]; - } - return i; + for (size_t idx=0; idx < size; idx++){ + BitStream[idx+modIdx++] = BitStream[idx]; + BitStream[idx+modIdx++] = BitStream[idx]^1; + } + for (; i<(size*2); i++){ + BitStream[i] = BitStream[i+20000]; + } + return i; } //by marshmellow @@ -331,29 +332,28 @@ int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int offset, int invert) //by marshmellow void askAmp(uint8_t *BitStream, size_t size) { - int shift = 127; - int shiftedVal=0; - for(int i = 1; i=30) //large jump up - shift=127; - else if(BitStream[i]-BitStream[i-1]<=-20) //large jump down - shift=-127; - - shiftedVal=BitStream[i]+shift; - - if (shiftedVal>255) - shiftedVal=255; - else if (shiftedVal<0) - shiftedVal=0; - BitStream[i-1] = shiftedVal; - } - return; + int shift = 127; + int shiftedVal=0; + for(int i = 1; i=30) //large jump up + shift=127; + else if(BitStream[i]-BitStream[i-1]<=-20) //large jump down + shift=-127; + + shiftedVal=BitStream[i]+shift; + + if (shiftedVal>255) + shiftedVal=255; + else if (shiftedVal<0) + shiftedVal=0; + BitStream[i-1] = shiftedVal; + } + return; } //by marshmellow //takes 3 arguments - clock, invert and maxErr as integers //attempts to demodulate ask only -//prints binary found and saves in graphbuffer for further commands int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp) { uint32_t i; @@ -500,6 +500,28 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int max } return bestErrCnt; } + +// demod gProxIIDemod +// error returns as -x +// success returns start position in BitStream +// BitStream must contain previously askrawdemod and biphasedemoded data +int gProxII_Demod(uint8_t BitStream[], size_t *size) +{ + size_t startIdx=0; + uint8_t preamble[] = {1,1,1,1,1,0}; + + uint8_t errChk = preambleSearch(BitStream, preamble, sizeof(preamble), size, &startIdx); + if (errChk == 0) return -3; //preamble not found + if (*size != 96) return -2; //should have found 96 bits + //check first 6 spacer bits to verify format + if (!BitStream[startIdx+5] && !BitStream[startIdx+10] && !BitStream[startIdx+15] && !BitStream[startIdx+20] && !BitStream[startIdx+25] && !BitStream[startIdx+30]){ + //confirmed proper separator bits found + //return start position + return (int) startIdx; + } + return -5; +} + //translate wave to 11111100000 (1 for each short wave 0 for each long wave) size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow) { @@ -712,7 +734,7 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p for (int word = 0; word < (bLen); word+=pLen){ for (int bit=0; bit < pLen; bit++){ parityWd = (parityWd << 1) | BitStream[startIdx+word+bit]; - BitStream[j++] = (BitStream[startIdx+word+bit]); + BitStream[j++] = (BitStream[startIdx+word+bit]); } j--; // if parity fails then return 0 @@ -750,17 +772,17 @@ int AWIDdemodFSK(uint8_t *dest, size_t *size) // FSK Demod then try to locate an Farpointe Data (pyramid) ID int PyramiddemodFSK(uint8_t *dest, size_t *size) { - //make sure buffer has data - if (*size < 128*50) return -5; + //make sure buffer has data + if (*size < 128*50) return -5; - //test samples are not just noise - if (justNoise(dest, *size)) return -1; + //test samples are not just noise + if (justNoise(dest, *size)) return -1; - // FSK demodulator - *size = fskdemod(dest, *size, 50, 1, 10, 8); // fsk2a RF/50 - if (*size < 128) return -2; //did we get a good demod? + // FSK demodulator + *size = fskdemod(dest, *size, 50, 1, 10, 8); // fsk2a RF/50 + if (*size < 128) return -2; //did we get a good demod? - uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; + uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; size_t startIdx = 0; uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx); if (errChk == 0) return -4; //preamble not found @@ -794,7 +816,7 @@ int DetectASKClock(uint8_t dest[], size_t size, int *clock, int maxErr) int i=0; int clk[]={8,16,32,40,50,64,100,128,256}; int loopCnt = 256; //don't need to loop through entire array... - if (size == 0) return -1; + if (size == 0) return -1; if (size0 && maxPeak < peakcnt){ - maxPeak = peakcnt; + maxPeak = peakcnt; } peakcnt=0; } @@ -1041,7 +1063,7 @@ int DetectNRZClock(uint8_t dest[], size_t size, int clock) int iii=7; int best=0; for (iii=7; iii > 0; iii--){ - if (peaksdet[iii] > peaksdet[best]){ + if (peaksdet[iii] > peaksdet[best]){ best = iii; } //PrintAndLog("DEBUG: Clk: %d, peaks: %d, errs: %d, bestClk: %d",clk[iii],peaksdet[iii],bestErr[iii],clk[best]); @@ -1067,6 +1089,21 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size) return; } +// by marshmellow +// convert psk2 demod to psk1 demod +// from only transition waves are 1s to phase shifts change bit +void psk2TOpsk1(uint8_t *BitStream, size_t size) +{ + uint8_t phase=0; + for (size_t i=0; ilastFCcnt)){ //not the same size as the last wave - start of new bit sequence @@ -1496,7 +1533,7 @@ uint8_t countPSK_FC(uint8_t *BitStream, size_t size) uint8_t fcLensFnd = 0; uint32_t fcCounter = 0; size_t i; - if (size == 0) return 0; + if (size == 0) return 0; // prime i to first up transition for (i = 1; i < size-1; i++) @@ -1548,7 +1585,7 @@ uint8_t countPSK_FC(uint8_t *BitStream, size_t size) int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert) { uint16_t loopCnt = 4096; //don't need to loop through entire array... - if (size == 0) return -1; + if (size == 0) return -1; if (*size= dest[i+2]){ if (waveStart == 0) {