X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/6c283951062aaad9d0d1ba8670b02895047be438..22f4dca88cc008287b1ef01bb4da0d46cbcf76d1:/common/lfdemod.c diff --git a/common/lfdemod.c b/common/lfdemod.c index 2f376e5f..ff80b8b3 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -84,7 +84,9 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p 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; + if (parityTest(parityWd, pLen, pType) == 0) + return 0; + break; } bitCnt+=(pLen-1); parityWd = 0; @@ -148,8 +150,11 @@ uint32_t bytebits_to_byteLSBF(uint8_t *src, size_t numbits) //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; - for (int idx=0; idx < *size - pLen; idx++){ + // Sanity check. If preamble length is bigger than bitstream length. + if ( *size <= pLen ) return 0; + + uint8_t foundCnt = 0; + for (int idx = 0; idx < *size - pLen; idx++){ if (memcmp(BitStream+idx, preamble, pLen) == 0){ //first index found foundCnt++; @@ -732,21 +737,27 @@ int JablotronDemod(uint8_t *dest, size_t *size){ size_t startIdx = 0; // 0xFFFF preamble, 64bits - uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + uint8_t preamble[] = { + 1,1,1,1, + 1,1,1,1, + 1,1,1,1, + 1,1,1,1, + 0 + }; uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx); if (errChk == 0) return -4; //preamble not found + if (*size != 64) return -3; - uint8_t checkCalc = 0; + uint8_t checkchksum = 0; for (int i=16; i < 56; i += 8) { - checkCalc += bytebits_to_byte(dest+startIdx+i,8); + checkchksum += bytebits_to_byte(dest+startIdx+i,8); } - checkCalc ^= 0x3A; + checkchksum ^= 0x3A; - uint8_t crc = bytebits_to_byte(dest+startIdx+56,8); + uint8_t crc = bytebits_to_byte(dest+startIdx+56, 8); - if ( checkCalc != crc ) return -5; - if (*size != 64) return -6; + if ( checkchksum != crc ) return -5; return (int)startIdx; }