X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/6c283951062aaad9d0d1ba8670b02895047be438..e619ddc071e882bb9de75d2e0905c4eda2b11516:/common/lfdemod.c?ds=sidebyside diff --git a/common/lfdemod.c b/common/lfdemod.c index 2f376e5f..f231cd69 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -148,8 +148,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 +735,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; }