From: iceman1001 Date: Mon, 16 Mar 2015 13:02:08 +0000 (+0100) Subject: Merge branch 'master' of https://github.com/Proxmark/proxmark3 X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/a087e9cf40bdb4d7546a7645995624a519aef2a6?hp=-c Merge branch 'master' of https://github.com/Proxmark/proxmark3 --- a087e9cf40bdb4d7546a7645995624a519aef2a6 diff --combined common/lfdemod.c index 7ab8a388,46ac4924..12f380d5 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@@ -55,7 -55,7 +55,7 @@@ uint8_t parityTest(uint32_t bits, uint8 } //by marshmellow - //search for given preamble in given BitStream and return startIndex and length + //search for given preamble in given BitStream and return success=1 or fail=0 and startIndex and length uint8_t preambleSearch(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx) { uint8_t foundCnt=0; @@@ -78,7 -78,7 +78,7 @@@ //by marshmellow //takes 1s and 0s and searches for EM410x format - output EM ID - uint64_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx) + uint64_t Em410xDecodeOld(uint8_t *BitStream, size_t *size, size_t *startIdx) { //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future // otherwise could be a void with no arguments @@@ -120,6 -120,52 +120,52 @@@ return 0; } + //by marshmellow + //takes 1s and 0s and searches for EM410x format - output EM ID + uint8_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo) + { + //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future + // otherwise could be a void with no arguments + //set defaults + uint32_t i = 0; + if (BitStream[1]>1){ //allow only 1s and 0s + // PrintAndLog("no data found"); + return 0; + } + // 111111111 bit pattern represent start of frame + uint8_t preamble[] = {1,1,1,1,1,1,1,1,1}; + uint32_t idx = 0; + uint32_t parityBits = 0; + uint8_t errChk = 0; + uint8_t FmtLen = 10; + *startIdx = 0; + 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) FmtLen = 22; + idx = *startIdx + 9; + for (i=0; i> 63); + *lo = (*lo << 1) | (BitStream[(i*5)+ii+idx]); + } + } + if (errChk != 0) return 1; + //skip last 5 bit parity test for simplicity. + // *size = 64 | 128; + } + return 0; + } + //by marshmellow //takes 3 arguments - clock, invert, maxErr as integers //attempts to demodulate ask while decoding manchester @@@ -151,6 -197,8 +197,8 @@@ int askmandemod(uint8_t *BinStream, siz int iii = 0; uint32_t gLen = *size; if (gLen > 3000) gLen=3000; + //if 0 errors allowed then only try first 2 clock cycles as we want a low tolerance + if (!maxErr) gLen=*clk*2; uint8_t errCnt =0; uint16_t MaxBits = 500; uint32_t bestStart = *size; @@@ -305,16 -353,29 +353,29 @@@ int manrawdecode(uint8_t * BitStream, s } //by marshmellow - //take 01 or 10 = 0 and 11 or 00 = 1 + //take 01 or 10 = 1 and 11 or 00 = 0 + //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010 int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int offset, int invert) { uint16_t bitnum=0; uint32_t errCnt =0; - uint32_t i; - uint16_t MaxBits=500; - i=offset; - if (size == 0) return -1; - for (;i<*size-2; i+=2){ + size_t i=offset; + uint16_t MaxBits=512; + //if not enough samples - error + if (*size < 51) return -1; + //check for phase change faults - skip one sample if faulty + uint8_t offsetA = 1, offsetB = 1; + for (; i<48; i+=2){ + if (BitStream[i+1]==BitStream[i+2]) offsetA=0; + if (BitStream[i+2]==BitStream[i+3]) offsetB=0; + } + if (!offsetA && offsetB) offset++; + for (i=offset; i<*size-3; i+=2){ + //check for phase error + if (i<*size-3 && BitStream[i+1]==BitStream[i+2]) { + BitStream[bitnum++]=77; + errCnt++; + } if((BitStream[i]==1 && BitStream[i+1]==0) || (BitStream[i]==0 && BitStream[i+1]==1)){ BitStream[bitnum++]=1^invert; } else if((BitStream[i]==0 && BitStream[i+1]==0) || (BitStream[i]==1 && BitStream[i+1]==1)){ @@@ -381,6 -442,8 +442,8 @@@ int askrawdemod(uint8_t *BinStream, siz uint32_t iii = 0; uint32_t gLen = *size; if (gLen > 500) gLen=500; + //if 0 errors allowed then only try first 2 clock cycles as we want a low tolerance + if (!maxErr) gLen=*clk*2; uint8_t errCnt =0; uint32_t bestStart = *size; uint32_t bestErrCnt = maxErr; //(*size/1000); @@@ -1603,22 -1666,22 +1666,22 @@@ int pskRawDemod(uint8_t dest[], size_t //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); @@@ -1640,7 -1703,7 +1703,7 @@@ 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);