X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/13d77ef964cefe68750873d5268299a53c9e22a5..40762506601062bb79a0a081a7b508b8e02c29fa:/common/lfdemod.c diff --git a/common/lfdemod.c b/common/lfdemod.c index 5b0bc29d..3305c8b0 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -97,6 +97,7 @@ uint8_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_ 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) return 0; if (*size>64) FmtLen = 22; if (*size<64) return 0; idx = *startIdx + 9; @@ -375,34 +376,39 @@ int cleanAskRawDemod(uint8_t *BinStream, size_t *size, int clk, int invert, int smplCnt++; } else if (BinStream[i] <= low && !waveHigh){ smplCnt++; - } else { //not high or low or a transition - if (smplCnt > clk-(clk/4)) { //full clock - if (smplCnt > clk + (clk/4)) { //too many samples - errCnt++; - BinStream[bitCnt++]=77; - } else if (waveHigh) { - BinStream[bitCnt++] = invert; - BinStream[bitCnt++] = invert; - } else if (!waveHigh) { - BinStream[bitCnt++] = invert ^ 1; - BinStream[bitCnt++] = invert ^ 1; - } - waveHigh ^= 1; - smplCnt = 0; - } else if (smplCnt > (clk/2) - (clk/5)) { - if (waveHigh) { - BinStream[bitCnt++] = invert; - } else if (!waveHigh) { - BinStream[bitCnt++] = invert ^ 1; + } else { //transition + if ((BinStream[i] >= high && !waveHigh) || (BinStream[i] <= low && waveHigh)){ + if (smplCnt > clk-(clk/4)-1) { //full clock + if (smplCnt > clk + (clk/4)+1) { //too many samples + errCnt++; + BinStream[bitCnt++]=77; + } else if (waveHigh) { + BinStream[bitCnt++] = invert; + BinStream[bitCnt++] = invert; + } else if (!waveHigh) { + BinStream[bitCnt++] = invert ^ 1; + BinStream[bitCnt++] = invert ^ 1; + } + waveHigh ^= 1; + smplCnt = 0; + } else if (smplCnt > (clk/2) - (clk/4)-1) { + if (waveHigh) { + BinStream[bitCnt++] = invert; + } else if (!waveHigh) { + BinStream[bitCnt++] = invert ^ 1; + } + waveHigh ^= 1; + smplCnt = 0; + } else if (!bitCnt) { + //first bit + waveHigh = (BinStream[i] >= high); + smplCnt = 1; + } else { + smplCnt++; + //transition bit oops } - waveHigh ^= 1; - smplCnt = 0; - } else if (!bitCnt) { - //first bit - waveHigh = (BinStream[i] >= high); - smplCnt = 1; - } else { - //transition bit? ignore + } else { //haven't hit new high or new low yet + smplCnt++; } } } @@ -888,16 +894,18 @@ int PyramiddemodFSK(uint8_t *dest, size_t *size) uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, int high, int low) { - uint8_t allPeaks=1; + uint16_t allPeaks=1; uint16_t cntPeaks=0; - for (size_t i=30; i<255; i++){ + size_t loopEnd = 572; + if (loopEnd > size) loopEnd = size; + for (size_t i=60; ilow && dest[i]210) return 1; + if (allPeaks == 0){ + if (cntPeaks > 300) return 1; } return allPeaks; } @@ -939,10 +947,12 @@ int DetectStrongAskClock(uint8_t dest[], size_t size) } } } + uint8_t tol; for (idx=8; idx>0; idx--){ - if (clk[idx] >= highCnt && clk[idx] <= highCnt+2) + tol = clk[idx]/8; + if (clk[idx] >= highCnt - tol && clk[idx] <= highCnt + tol) return clk[idx]; - if (clk[idx] >= highCnt2 && clk[idx] <= highCnt2+2) + if (clk[idx] >= highCnt2 - tol && clk[idx] <= highCnt2 + tol) return clk[idx]; } return -1; @@ -1742,22 +1752,22 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert) //find first phase shift for (i=0; i= dest[i+2]){ - waveEnd = i+1; - //PrintAndLog("DEBUG: waveEnd: %d",waveEnd); - waveLenCnt = waveEnd-waveStart; + waveEnd = i+1; + //PrintAndLog("DEBUG: waveEnd: %d",waveEnd); + waveLenCnt = waveEnd-waveStart; if (waveLenCnt > fc && waveStart > fc){ //not first peak and is a large wave lastAvgWaveVal = avgWaveVal/(waveLenCnt); - firstFullWave = waveStart; - fullWaveLen=waveLenCnt; - //if average wave value is > graph 0 then it is an up wave or a 1 + firstFullWave = waveStart; + fullWaveLen=waveLenCnt; + //if average wave value is > graph 0 then it is an up wave or a 1 if (lastAvgWaveVal > 123) curPhase^=1; //fudge graph 0 a little 123 vs 128 - break; - } + break; + } waveStart = i+1; avgWaveVal = 0; - } + } avgWaveVal+=dest[i+2]; - } + } //PrintAndLog("DEBUG: firstFullWave: %d, waveLen: %d",firstFullWave,fullWaveLen); lastClkBit = firstFullWave; //set start of wave as clock align //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit); @@ -1779,7 +1789,7 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert) waveEnd = i+1; waveLenCnt = waveEnd-waveStart; lastAvgWaveVal = avgWaveVal/waveLenCnt; - if (waveLenCnt > fc){ + if (waveLenCnt > fc){ //PrintAndLog("DEBUG: avgWaveVal: %d, waveSum: %d",lastAvgWaveVal,avgWaveVal); //if this wave is a phase shift //PrintAndLog("DEBUG: phase shift at: %d, len: %d, nextClk: %d, i: %d, fc: %d",waveStart,waveLenCnt,lastClkBit+*clock-tol,i+1,fc);