X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/207fc33a4252560197931244b1e888d5cc3994c7..f133389866b5749a49265eb0477540ccdcc8a73f:/common/lfdemod.c?ds=sidebyside diff --git a/common/lfdemod.c b/common/lfdemod.c index aa3586f6..46132703 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -71,7 +71,7 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p { uint32_t parityWd = 0; size_t j = 0, bitCnt = 0; - for (int word = 0; word < (bLen); word+=pLen){ + 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]); @@ -83,7 +83,7 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p case 2: if (BitStream[j]==0) { return 0; } break; //should be 1 spacer bit default: if (parityTest(parityWd, pLen, pType) == 0) { return 0; } break; //test parity } - bitCnt+=(pLen-1); + bitCnt += (pLen-1); parityWd = 0; } // if we got here then all the parities passed @@ -677,7 +677,6 @@ int IOdemodFSK(uint8_t *dest, size_t size) int VikingDemod_AM(uint8_t *dest, size_t *size) { //make sure buffer has data if (*size < 64*2) return -2; - size_t startIdx = 0; uint8_t preamble[] = {1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx); @@ -693,7 +692,7 @@ int VikingDemod_AM(uint8_t *dest, size_t *size) { if ( checkCalc != 0xA8 ) return -5; if (*size != 64) return -6; //return start position - return (int) startIdx; + return (int)startIdx; } // by iceman @@ -706,7 +705,7 @@ int Visa2kDemod_AM(uint8_t *dest, size_t *size) { if (errChk == 0) return -2; //preamble not found if (*size != 96) return -3; //wrong demoded size //return start position - return (int) startIdx; + return (int)startIdx; } // by iceman // find Noralsy preamble in already demoded data @@ -718,7 +717,7 @@ int NoralsyDemod_AM(uint8_t *dest, size_t *size) { if (errChk == 0) return -2; //preamble not found if (*size != 96) return -3; //wrong demoded size //return start position - return (int) startIdx; + return (int)startIdx; } // find presco preamble 0x10D in already demoded data int PrescoDemod(uint8_t *dest, size_t *size) { @@ -729,54 +728,41 @@ int PrescoDemod(uint8_t *dest, size_t *size) { if (errChk == 0) return -2; //preamble not found if (*size != 128) return -3; //wrong demoded size //return start position - return (int) startIdx; + return (int)startIdx; } // Ask/Biphase Demod then try to locate an ISO 11784/85 ID // BitStream must contain previously askrawdemod and biphasedemoded data -int FDXBdemodBI(uint8_t *dest, size_t *size) -{ - //make sure buffer has enough data - if (*size < 128) return -1; - +int FDXBdemodBI(uint8_t *dest, size_t *size) { + if (*size < 128*2) return -1; //make sure buffer has enough data size_t startIdx = 0; uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,1}; - uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx); if (errChk == 0) return -2; //preamble not found + if (*size != 128) return -3; //wrong demoded size + //return start position return (int)startIdx; } // ASK/Diphase fc/64 (inverted Biphase) // Note: this i s not a demod, this is only a detection // the parameter *dest needs to be demoded before call +// 0xFFFF preamble, 64bits int JablotronDemod(uint8_t *dest, size_t *size){ - //make sure buffer has enough data - if (*size < 64) return -1; - + if (*size < 64*2) return -1; //make sure buffer has enough data 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, - 0 - }; - + 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; + if (errChk == 0) return -2; //preamble not found + if (*size != 64) return -3; // wrong demoded size uint8_t checkchksum = 0; for (int i=16; i < 56; i += 8) { checkchksum += bytebits_to_byte(dest+startIdx+i,8); } checkchksum ^= 0x3A; - uint8_t crc = bytebits_to_byte(dest+startIdx+56, 8); - - if ( checkchksum != crc ) return -5; + if ( checkchksum != crc ) return -5; return (int)startIdx; } @@ -815,7 +801,7 @@ int PyramiddemodFSK(uint8_t *dest, size_t *size) *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,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 @@ -836,6 +822,19 @@ int NedapDemod(uint8_t *dest, size_t *size) { return (int) startIdx; } +// Find IDTEC PSK1, RF Preamble == 0x4944544B, Demodsize 64bits +// by iceman +int IdteckDemodPSK(uint8_t *dest, size_t *size) { + //make sure buffer has data + if (*size < 64*2) return -1; + size_t startIdx = 0; + uint8_t preamble[] = {0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,1,1}; + uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx); + if (errChk == 0) return -2; //preamble not found + if (*size != 64) return -3; // wrong demoded size + return (int) startIdx; +} + // by marshmellow // to detect a wave that has heavily clipped (clean) samples uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, uint8_t high, uint8_t low)