From: marshmellow42 Date: Tue, 20 Jan 2015 22:28:51 +0000 (-0500) Subject: lf Bug Fixes and lf demod additions X-Git-Tag: v2.0.0-rc1~43^2~4 X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/ec75f5c10a91211e50b74af181b827fc93a6dcd5 lf Bug Fixes and lf demod additions added data fskparadoxdemod added data setdebugmode (for demods) added data shiftgraphzero (to help clean weak reads) fixed a few bugs with the data detectaskclock added data fskfcdetect to detect FSK clocks adjusted most of my demods to put raw tag binary to demod buffer for future sim and clone commands (psk still needs work) --- diff --git a/armsrc/lfops.c b/armsrc/lfops.c index f5040850..8ea9b317 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -633,7 +633,7 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol) { uint8_t *dest = (uint8_t *)BigBuf; - size_t size=0; //, found=0; + size_t size=sizeof(BigBuf), idx=0; //, found=0; uint32_t hi2=0, hi=0, lo=0; // Configure to go in 125Khz listen mode @@ -646,11 +646,11 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol) DoAcquisition125k_internal(-1,true); // FSK demodulator - size = HIDdemodFSK(dest, sizeof(BigBuf), &hi2, &hi, &lo); + idx = HIDdemodFSK(dest, &size, &hi2, &hi, &lo); WDT_HIT(); - if (size>0 && lo>0){ + if (idx>0 && lo>0){ // final loop, go over previously decoded manchester data and decode into usable tag ID // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0 if (hi2 != 0){ //extra large HID tags @@ -721,7 +721,7 @@ void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol) { uint8_t *dest = (uint8_t *)BigBuf; - size_t size=0; + size_t size=0, idx=0; int clk=0, invert=0, errCnt=0; uint64_t lo=0; // Configure to go in 125Khz listen mode @@ -741,7 +741,7 @@ void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol) WDT_HIT(); if (errCnt>=0){ - lo = Em410xDecode(dest,size); + lo = Em410xDecode(dest, &size, &idx); //Dbprintf("DEBUG: EM GOT"); if (lo>0){ Dbprintf("EM TAG ID: %02x%08x - (%05d_%03d_%08d)", diff --git a/client/cmddata.c b/client/cmddata.c index 60d0d875..578587bc 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -22,21 +22,30 @@ #include "cmddata.h" #include "lfdemod.h" uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; +uint8_t g_debugMode; int DemodBufferLen; static int CmdHelp(const char *Cmd); //set the demod buffer with given array of binary (one bit per byte) //by marshmellow -void setDemodBuf(uint8_t *buff,int size) +void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx) { - int i=0; - for (; i < size; ++i){ - DemodBuffer[i]=buff[i]; + size_t i = 0; + for (; i < size; i++){ + DemodBuffer[i]=buff[startIdx++]; } DemodBufferLen=size; return; } +int CmdSetDebugMode(const char *Cmd) +{ + int demod=0; + sscanf(Cmd, "%i", &demod); + g_debugMode=(uint8_t)demod; + return 1; +} + //by marshmellow void printDemodBuff() { @@ -206,7 +215,7 @@ void printEM410x(uint64_t id) { if (id !=0){ uint64_t iii=1; - uint64_t id2lo=0; //id2hi=0, + uint64_t id2lo=0; uint32_t ii=0; uint32_t i=0; for (ii=5; ii>0;ii--){ @@ -216,7 +225,7 @@ void printEM410x(uint64_t id) } //output em id PrintAndLog("EM TAG ID : %010llx", id); - PrintAndLog("Unique TAG ID: %010llx", id2lo); //id2hi, + PrintAndLog("Unique TAG ID: %010llx", id2lo); PrintAndLog("DEZ 8 : %08lld",id & 0xFFFFFF); PrintAndLog("DEZ 10 : %010lld",id & 0xFFFFFF); PrintAndLog("DEZ 5.5 : %05lld.%05lld",(id>>16LL) & 0xFFFF,(id & 0xFFFF)); @@ -233,12 +242,17 @@ void printEM410x(uint64_t id) int CmdEm410xDecode(const char *Cmd) { uint64_t id=0; - // uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; - // uint32_t i=0; - // i=getFromGraphBuf(BitStream); - id = Em410xDecode(DemodBuffer,DemodBufferLen); - printEM410x(id); - if (id>0) return 1; + size_t size = DemodBufferLen, idx=0; + id = Em410xDecode(DemodBuffer, &size, &idx); + if (id>0){ + setDemodBuf(DemodBuffer, size, idx); + if (g_debugMode){ + PrintAndLog("DEBUG: Printing demod buffer:"); + printDemodBuff(); + } + printEM410x(id); + return 1; + } return 0; } @@ -249,7 +263,7 @@ int CmdEm410xDecode(const char *Cmd) //prints binary found and saves in graphbuffer for further commands int Cmdaskmandemod(const char *Cmd) { - int invert=0; + int invert=0; int clk=0; uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; sscanf(Cmd, "%i %i", &clk, &invert); @@ -259,11 +273,11 @@ int Cmdaskmandemod(const char *Cmd) } size_t BitLen = getFromGraphBuf(BitStream); - // PrintAndLog("DEBUG: Bitlen from grphbuff: %d",BitLen); + if (g_debugMode==1) PrintAndLog("DEBUG: Bitlen from grphbuff: %d",BitLen); int errCnt=0; errCnt = askmandemod(BitStream, &BitLen,&clk,&invert); if (errCnt<0||BitLen<16){ //if fatal error (or -1) - // PrintAndLog("no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk); + if (g_debugMode==1) PrintAndLog("no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk); return 0; } PrintAndLog("\nUsing Clock: %d - Invert: %d - Bits Found: %d",clk,invert,BitLen); @@ -274,17 +288,22 @@ int Cmdaskmandemod(const char *Cmd) } PrintAndLog("ASK/Manchester decoded bitstream:"); // Now output the bitstream to the scrollback by line of 16 bits - setDemodBuf(BitStream,BitLen); + setDemodBuf(BitStream,BitLen,0); printDemodBuff(); uint64_t lo =0; - lo = Em410xDecode(BitStream,BitLen); + size_t idx=0; + lo = Em410xDecode(BitStream, &BitLen, &idx); if (lo>0){ //set GraphBuffer for clone or sim command + setDemodBuf(BitStream, BitLen, idx); + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen); + printDemodBuff(); + } PrintAndLog("EM410x pattern found: "); printEM410x(lo); return 1; } - //if (BitLen>16) return 1; return 0; } @@ -317,9 +336,14 @@ int Cmdmandecoderaw(const char *Cmd) printBitStream(BitStream, size); if (errCnt==0){ uint64_t id = 0; - id = Em410xDecode(BitStream, size); - if (id>0) setDemodBuf(BitStream, size); - printEM410x(id); + size_t idx=0; + id = Em410xDecode(BitStream, &size, &idx); + if (id>0){ + //need to adjust to set bitstream back to manchester encoded data + //setDemodBuf(BitStream, size, idx); + + printEM410x(id); + } } return 1; } @@ -366,7 +390,6 @@ int CmdBiphaseDecodeRaw(const char *Cmd) return 1; } - //by marshmellow //takes 2 arguments - clock and invert both as integers //attempts to demodulate ask only @@ -386,14 +409,15 @@ int Cmdaskrawdemod(const char *Cmd) errCnt = askrawdemod(BitStream, &BitLen,&clk,&invert); if (errCnt==-1||BitLen<16){ //throw away static - allow 1 and -1 (in case of threshold command first) PrintAndLog("no data found"); + if (g_debugMode==1) PrintAndLog("errCnt: %d, BitLen: %d, clk: %d, invert: %d", errCnt, BitLen, clk, invert); return 0; } PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen); - //PrintAndLog("Data start pos:%d, lastBit:%d, stop pos:%d, numBits:%d",iii,lastBit,i,bitnum); - //move BitStream back to DemodBuffer - setDemodBuf(BitStream,BitLen); + + //move BitStream back to DemodBuffer + setDemodBuf(BitStream,BitLen,0); - //output + //output if (errCnt>0){ PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); } @@ -541,6 +565,27 @@ int CmdDec(const char *Cmd) return 0; } +//by marshmellow +//shift graph zero up or down based on input + or - +int CmdGraphShiftZero(const char *Cmd) +{ + + int shift=0; + //set options from parameters entered with the command + sscanf(Cmd, "%i", &shift); + int shiftedVal=0; + for(int i = 0; i127) + shiftedVal=127; + else if (shiftedVal<-127) + shiftedVal=-127; + GraphBuffer[i]= shiftedVal; + } + CmdNorm(""); + return 0; +} + /* Print our clock rate */ // uses data from graphbuffer int CmdDetectClockRate(const char *Cmd) @@ -567,7 +612,6 @@ int CmdFSKrawdemod(const char *Cmd) sscanf(Cmd, "%i %i %i %i", &rfLen, &invert, &fchigh, &fclow); if (strlen(Cmd)>0 && strlen(Cmd)<=2) { - //rfLen=param_get8(Cmd, 0); //if rfLen option only is used if (rfLen==1){ invert=1; //if invert option only is used rfLen = 50; @@ -579,7 +623,7 @@ int CmdFSKrawdemod(const char *Cmd) int size = fskdemod(BitStream,BitLen,(uint8_t)rfLen,(uint8_t)invert,(uint8_t)fchigh,(uint8_t)fclow); if (size>0){ PrintAndLog("FSK decoded bitstream:"); - setDemodBuf(BitStream,size); + setDemodBuf(BitStream,size,0); // Now output the bitstream to the scrollback by line of 16 bits if(size > (8*32)+2) size = (8*32)+2; //only output a max of 8 blocks of 32 bits most tags will have full bit stream inside that sample size @@ -601,20 +645,20 @@ int CmdFSKdemodHID(const char *Cmd) uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; size_t BitLen = getFromGraphBuf(BitStream); //get binary from fsk wave - size_t size = HIDdemodFSK(BitStream,BitLen,&hi2,&hi,&lo); - if (size<0){ - PrintAndLog("Error demoding fsk"); + size_t idx = HIDdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo); + if (idx<0){ + if (g_debugMode) PrintAndLog("DEBUG: Error demoding fsk"); + return 0; + } + if (hi2==0 && hi==0 && lo==0) { + if (g_debugMode) PrintAndLog("DEBUG: Error - no values found"); return 0; } - if (hi2==0 && hi==0 && lo==0) return 0; if (hi2 != 0){ //extra large HID tags PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)", (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); - setDemodBuf(BitStream,BitLen); - return 1; } else { //standard HID tags <38 bits - //Dbprintf("TAG ID: %x%08x (%d)",(unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); //old print cmd uint8_t fmtLen = 0; uint32_t fc = 0; uint32_t cardnum = 0; @@ -654,12 +698,49 @@ int CmdFSKdemodHID(const char *Cmd) PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d", (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF, (unsigned int) fmtLen, (unsigned int) fc, (unsigned int) cardnum); - setDemodBuf(BitStream,BitLen); - return 1; } - return 0; + setDemodBuf(BitStream,BitLen,idx); + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen); + printDemodBuff(); + } + return 1; +} + +//by marshmellow (based on existing demod + holiman's refactor) +//Paradox Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded) +//print full Paradox Prox ID and some bit format details if found +int CmdFSKdemodParadox(const char *Cmd) +{ + //raw fsk demod no manchester decoding no start bit finding just get binary from wave + uint32_t hi2=0, hi=0, lo=0; + + uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; + size_t BitLen = getFromGraphBuf(BitStream); + //get binary from fsk wave + size_t idx = ParadoxdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo); + if (idx<0){ + if (g_debugMode) PrintAndLog("DEBUG: Error demoding fsk"); + return 0; + } + if (hi2==0 && hi==0 && lo==0){ + if (g_debugMode) PrintAndLog("DEBUG: Error - no value found"); + return 0; + } + uint32_t fc = ((hi & 0x3)<<6) | (lo>>26); + uint32_t cardnum = (lo>>10)&0xFFFF; + + PrintAndLog("Paradox TAG ID: %x%08x - FC: %d - Card: %d - Checksum: %02x", + hi>>10, (hi & 0x3)<<26 | (lo>>10), fc, cardnum, (lo>>2) & 0xFF ); + setDemodBuf(BitStream,BitLen,idx); + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, len: %d, Printing Demod Buffer:", idx, BitLen); + printDemodBuff(); + } + return 1; } + //by marshmellow //IO-Prox demod - FSK RF/64 with preamble of 000000001 //print ioprox ID and some format details @@ -668,21 +749,25 @@ int CmdFSKdemodIO(const char *Cmd) //raw fsk demod no manchester decoding no start bit finding just get binary from wave //set defaults int idx=0; - //something in graphbuffer - if (GraphTraceLen < 65) return 0; + //something in graphbuffer? + if (GraphTraceLen < 65) { + if (g_debugMode)PrintAndLog("DEBUG: not enough samples in GraphBuffer"); + return 0; + } uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; size_t BitLen = getFromGraphBuf(BitStream); + //get binary from fsk wave - // PrintAndLog("DEBUG: got buff"); idx = IOdemodFSK(BitStream,BitLen); if (idx<0){ - //PrintAndLog("Error demoding fsk"); + if (g_debugMode==1) PrintAndLog("DEBUG: demoding fsk error: %d", idx); return 0; } - // PrintAndLog("DEBUG: Got IOdemodFSK"); if (idx==0){ - //PrintAndLog("IO Prox Data not found - FSK Data:"); - //if (BitLen > 92) printBitStream(BitStream,92); + if (g_debugMode==1){ + PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen); + if (BitLen > 92) printBitStream(BitStream,92); + } return 0; } //Index map @@ -694,7 +779,10 @@ int CmdFSKdemodIO(const char *Cmd) // //XSF(version)facility:codeone+codetwo (raw) //Handle the data - if (idx+64>BitLen) return 0; + if (idx+64>BitLen) { + if (g_debugMode==1) PrintAndLog("not enough bits found - bitlen: %d",BitLen); + return 0; + } PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx], BitStream[idx+1], BitStream[idx+2], BitStream[idx+3], BitStream[idx+4], BitStream[idx+5], BitStream[idx+6], BitStream[idx+7], BitStream[idx+8]); PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+9], BitStream[idx+10], BitStream[idx+11],BitStream[idx+12],BitStream[idx+13],BitStream[idx+14],BitStream[idx+15],BitStream[idx+16],BitStream[idx+17]); PrintAndLog("%d%d%d%d%d%d%d%d %d facility",BitStream[idx+18], BitStream[idx+19], BitStream[idx+20],BitStream[idx+21],BitStream[idx+22],BitStream[idx+23],BitStream[idx+24],BitStream[idx+25],BitStream[idx+26]); @@ -709,12 +797,12 @@ int CmdFSKdemodIO(const char *Cmd) uint8_t facilitycode = bytebits_to_byte(BitStream+idx+18,8) ; uint16_t number = (bytebits_to_byte(BitStream+idx+36,8)<<8)|(bytebits_to_byte(BitStream+idx+45,8)); //36,9 PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x)",version,facilitycode,number,code,code2); - int i; - for (i=0;i<64;++i) - DemodBuffer[i]=BitStream[idx++]; - - DemodBufferLen=64; - return 1; + setDemodBuf(BitStream,64,idx); + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx,64); + printDemodBuff(); + } + return 1; } @@ -724,8 +812,8 @@ int CmdFSKdemodIO(const char *Cmd) int CmdFSKdemodAWID(const char *Cmd) { - int verbose=1; - sscanf(Cmd, "%i", &verbose); + //int verbose=1; + //sscanf(Cmd, "%i", &verbose); //raw fsk demod no manchester decoding no start bit finding just get binary from wave uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; @@ -734,17 +822,21 @@ int CmdFSKdemodAWID(const char *Cmd) //get binary from fsk wave int idx = AWIDdemodFSK(BitStream, size); if (idx<=0){ - if (verbose){ + if (g_debugMode==1){ if (idx == -1) - PrintAndLog("Error: not enough samples"); + PrintAndLog("DEBUG: Error - not enough samples"); else if (idx == -2) - PrintAndLog("Error: only noise found - no waves"); + PrintAndLog("DEBUG: Error - only noise found - no waves"); else if (idx == -3) - PrintAndLog("Error: problem during FSK demod"); + PrintAndLog("DEBUG: Error - problem during FSK demod"); // else if (idx == -3) // PrintAndLog("Error: thought we had a tag but the parity failed"); else if (idx == -4) - PrintAndLog("Error: AWID preamble not found"); + PrintAndLog("DEBUG: Error - AWID preamble not found"); + else if (idx == -5) + PrintAndLog("DEBUG: Error - Second AWID preamble not found"); + else + PrintAndLog("DEBUG: Error %d",idx); } return 0; } @@ -766,9 +858,11 @@ int CmdFSKdemodAWID(const char *Cmd) uint32_t rawLo = bytebits_to_byte(BitStream+idx+64,32); uint32_t rawHi = bytebits_to_byte(BitStream+idx+32,32); uint32_t rawHi2 = bytebits_to_byte(BitStream+idx,32); + setDemodBuf(BitStream,96,idx); + size = removeParity(BitStream, idx+8, 4, 1, 88); if (size != 66){ - if (verbose) PrintAndLog("Error: at parity check-tag size does not match AWID format"); + if (g_debugMode==1) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format"); return 0; } // ok valid card found! @@ -807,9 +901,11 @@ int CmdFSKdemodAWID(const char *Cmd) PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo); } } - + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, Len: %d Printing Demod Buffer:", idx, 96); + printDemodBuff(); + } //todo - convert hi2, hi, lo to demodbuffer for future sim/clone commands - return 1; } @@ -818,10 +914,6 @@ int CmdFSKdemodAWID(const char *Cmd) //print full Farpointe Data/Pyramid Prox ID and some bit format details if found int CmdFSKdemodPyramid(const char *Cmd) { - - int verbose=1; - sscanf(Cmd, "%i", &verbose); - //raw fsk demod no manchester decoding no start bit finding just get binary from wave uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; size_t size = getFromGraphBuf(BitStream); @@ -829,23 +921,22 @@ int CmdFSKdemodPyramid(const char *Cmd) //get binary from fsk wave int idx = PyramiddemodFSK(BitStream, size); if (idx < 0){ - if (verbose){ + if (g_debugMode==1){ if (idx == -5) - PrintAndLog("Error: not enough samples"); + PrintAndLog("DEBUG: Error - not enough samples"); else if (idx == -1) - PrintAndLog("Error: only noise found - no waves"); + PrintAndLog("DEBUG: Error - only noise found - no waves"); else if (idx == -2) - PrintAndLog("Error: problem during FSK demod"); - //else if (idx == -3) - // PrintAndLog("Error: thought we had a tag but the parity failed"); + PrintAndLog("DEBUG: Error - problem during FSK demod"); + else if (idx == -3) + PrintAndLog("DEBUG: Error - Second Pyramid preamble not found"); else if (idx == -4) - PrintAndLog("Error: AWID preamble not found"); + PrintAndLog("DEBUG: Error - Pyramid preamble not found"); + else + PrintAndLog("DEBUG: Error - idx: %d",idx); } - PrintAndLog("idx: %d",idx); return 0; } - //PrintAndLog("DEBUG: idx: %d",idx); - // Index map // 0 10 20 30 40 50 60 // | | | | | | | @@ -872,9 +963,11 @@ int CmdFSKdemodPyramid(const char *Cmd) uint32_t rawHi = bytebits_to_byte(BitStream+idx+64,32); uint32_t rawHi2 = bytebits_to_byte(BitStream+idx+32,32); uint32_t rawHi3 = bytebits_to_byte(BitStream+idx,32); + setDemodBuf(BitStream,128,idx); + size = removeParity(BitStream, idx+8, 8, 1, 120); if (size != 105){ - if (verbose) PrintAndLog("Error: at parity check-tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3); + if (g_debugMode==1) PrintAndLog("DEBUG: Error at parity check-tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3); return 0; } @@ -902,10 +995,9 @@ int CmdFSKdemodPyramid(const char *Cmd) // (26 bit format shown) //find start bit to get fmtLen - idx = 0; int j; for (j=0; j32){ //code1 = bytebits_to_byte(BitStream+(size-fmtLen),fmtLen-32); //code2 = bytebits_to_byte(BitStream+(size-32),32); - PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d), Raw: %x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo); + PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo); } else{ //code1 = bytebits_to_byte(BitStream+(size-fmtLen),fmtLen); - PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d), Raw: %x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo); + PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo); } } //todo - convert hi2, hi, lo to demodbuffer for future sim/clone commands - + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, 128); + printDemodBuff(); + } return 1; } @@ -1057,6 +1152,8 @@ int CmdFSKdemod(const char *Cmd) //old CmdFSKdemod needs updating return 0; } +//by marshmellow +//attempt to detect the field clock and bit clock for FSK int CmdFSKfcDetect(const char *Cmd) { uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; @@ -1078,7 +1175,8 @@ int CmdDetectNRZpskClockRate(const char *Cmd) return 0; } -int PSKnrzDemod(const char *Cmd){ +int PSKnrzDemod(const char *Cmd) +{ int invert=0; int clk=0; sscanf(Cmd, "%i %i", &clk, &invert); @@ -1091,13 +1189,13 @@ int PSKnrzDemod(const char *Cmd){ int errCnt=0; errCnt = pskNRZrawDemod(BitStream, &BitLen,&clk,&invert); if (errCnt<0|| BitLen<16){ //throw away static - allow 1 and -1 (in case of threshold command first) - //PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt); + if (g_debugMode==1) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt); return -1; } PrintAndLog("Tried PSK/NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen); //prime demod buffer for output - setDemodBuf(BitStream,BitLen); + setDemodBuf(BitStream,BitLen,0); return errCnt; } // Indala 26 bit decode @@ -1105,35 +1203,30 @@ int PSKnrzDemod(const char *Cmd){ // optional arguments - same as CmdpskNRZrawDemod (clock & invert) int CmdIndalaDecode(const char *Cmd) { - uint8_t verbose = 1; int ans; if (strlen(Cmd)>0){ - if (Cmd[0]=='0'){ - verbose=0; - ans = PSKnrzDemod("32"); - }else{ - ans = PSKnrzDemod(Cmd); - } + ans = PSKnrzDemod(Cmd); } else{ //default to RF/32 ans = PSKnrzDemod("32"); } if (ans < 0){ - if (verbose) + if (g_debugMode==1) PrintAndLog("Error1: %d",ans); return 0; } uint8_t invert=0; ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert); if (ans < 1) { - if (verbose) + if (g_debugMode==1) PrintAndLog("Error2: %d",ans); return -1; } char showbits[251]; if (invert) - if (verbose) + if (g_debugMode==1) PrintAndLog("Had to invert bits"); + //convert UID to HEX uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7; int idx; @@ -1197,25 +1290,28 @@ int CmdPskClean(const char *Cmd) //prints binary found and saves in graphbuffer for further commands int CmdpskNRZrawDemod(const char *Cmd) { - uint8_t verbose = 1; int errCnt; - if (strlen(Cmd)>0){ - if (Cmd[0]=='0') - verbose=0; - } - + errCnt = PSKnrzDemod(Cmd); //output - if (errCnt<0) return 0; + if (errCnt<0){ + if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); + return 0; + } if (errCnt>0){ - if (verbose) + if (g_debugMode){ PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); - } - PrintAndLog("PSK or NRZ demoded bitstream:"); - // Now output the bitstream to the scrollback by line of 16 bits - printDemodBuff(); - - return 1; + PrintAndLog("PSK or NRZ demoded bitstream:"); + // Now output the bitstream to the scrollback by line of 16 bits + printDemodBuff(); + } + }else{ + PrintAndLog("PSK or NRZ demoded bitstream:"); + // Now output the bitstream to the scrollback by line of 16 bits + printDemodBuff(); + return 1; + } + return 0; } int CmdGrid(const char *Cmd) @@ -1367,14 +1463,14 @@ int CmdTuneSamples(const char *Cmd) int CmdLoad(const char *Cmd) { - char filename[FILE_PATH_SIZE] = {0x00}; - int len = 0; + char filename[FILE_PATH_SIZE] = {0x00}; + int len = 0; - len = strlen(Cmd); - if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE; - memcpy(filename, Cmd, len); + len = strlen(Cmd); + if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE; + memcpy(filename, Cmd, len); - FILE *f = fopen(filename, "r"); + FILE *f = fopen(filename, "r"); if (!f) { PrintAndLog("couldn't open '%s'", filename); return 0; @@ -1403,6 +1499,8 @@ int CmdLtrim(const char *Cmd) RepaintGraphWindow(); return 0; } + +// trim graph to input argument length int CmdRtrim(const char *Cmd) { int ds = atoi(Cmd); @@ -1683,12 +1781,12 @@ int CmdPlot(const char *Cmd) int CmdSave(const char *Cmd) { - char filename[FILE_PATH_SIZE] = {0x00}; - int len = 0; + char filename[FILE_PATH_SIZE] = {0x00}; + int len = 0; - len = strlen(Cmd); - if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE; - memcpy(filename, Cmd, len); + len = strlen(Cmd); + if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE; + memcpy(filename, Cmd, len); FILE *f = fopen(filename, "w"); @@ -1814,6 +1912,7 @@ static command_t CommandTable[] = {"fskhiddemod", CmdFSKdemodHID, 1, "Demodulate graph window as a HID FSK tag using raw"}, {"fskiodemod", CmdFSKdemodIO, 1, "Demodulate graph window as an IO Prox tag FSK using raw"}, {"fskpyramiddemod",CmdFSKdemodPyramid,1, "Demodulate graph window as a Pyramid FSK tag using raw"}, + {"fskparadoxdemod",CmdFSKdemodParadox,1, "Demodulate graph window as a Paradox FSK tag using raw"}, {"fskrawdemod", CmdFSKrawdemod, 1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to bin (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"}, {"grid", CmdGrid, 1, " -- overlay grid on graph window, use zero value to turn off either"}, {"hexsamples", CmdHexsamples, 0, " [] -- Dump big buffer as hex bytes"}, @@ -1834,6 +1933,8 @@ static command_t CommandTable[] = {"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window"}, {"save", CmdSave, 1, " -- Save trace (from graph window)"}, {"scale", CmdScale, 1, " -- Set cursor display scale"}, + {"setdebugmode", CmdSetDebugMode, 1, "<0|1> -- Turn on or off Debugging Mode for demods"}, + {"shiftgraphzero",CmdGraphShiftZero, 1, " -- Shift 0 for Graphed wave + or - shift value"}, {"threshold", CmdThreshold, 1, " -- Maximize/minimize every value in the graph window depending on threshold"}, {"dirthreshold", CmdDirectionalThreshold, 1, " -- Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."}, {"tune", CmdTuneSamples, 0, "Get hw tune samples for graph window"}, diff --git a/client/cmddata.h b/client/cmddata.h index ffd6b983..d87c8b82 100644 --- a/client/cmddata.h +++ b/client/cmddata.h @@ -30,6 +30,7 @@ int CmdFSKdemodAWID(const char *Cmd); int CmdFSKdemod(const char *Cmd); int CmdFSKdemodHID(const char *Cmd); int CmdFSKdemodIO(const char *Cmd); +int CmdFSKdemodParadox(const char *Cmd); int CmdFSKdemodPyramid(const char *Cmd); int CmdFSKrawdemod(const char *Cmd); int CmdDetectNRZpskClockRate(const char *Cmd); diff --git a/client/cmdlf.c b/client/cmdlf.c index 945b4557..9fc6b999 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -575,36 +575,41 @@ int CmdLFfind(const char *Cmd) } PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag"); - PrintAndLog("Checking for known tags:"); + PrintAndLog("\nChecking for known tags:\n"); ans=CmdFSKdemodIO(""); if (ans>0) { - PrintAndLog("Valid IO Prox ID Found!"); + PrintAndLog("\nValid IO Prox ID Found!"); return 1; } - ans=CmdFSKdemodPyramid("0"); + ans=CmdFSKdemodPyramid(""); if (ans>0) { - PrintAndLog("Valid Pyramid ID Found!"); + PrintAndLog("\nValid Pyramid ID Found!"); return 1; } - ans=CmdFSKdemodAWID("0"); + ans=CmdFSKdemodParadox(""); if (ans>0) { - PrintAndLog("Valid AWID ID Found!"); + PrintAndLog("\nValid Paradox ID Found!"); + return 1; + } + ans=CmdFSKdemodAWID(""); + if (ans>0) { + PrintAndLog("\nValid AWID ID Found!"); return 1; } ans=CmdFSKdemodHID(""); if (ans>0) { - PrintAndLog("Valid HID Prox ID Found!"); + PrintAndLog("\nValid HID Prox ID Found!"); return 1; } //add psk and indala - ans=CmdIndalaDecode("0"); + ans=CmdIndalaDecode(""); if (ans>0) { - PrintAndLog("Valid Indala ID Found!"); + PrintAndLog("\nValid Indala ID Found!"); return 1; } ans=Cmdaskmandemod(""); if (ans>0) { - PrintAndLog("Valid EM410x ID Found!"); + PrintAndLog("\nValid EM410x ID Found!"); return 1; } PrintAndLog("No Known Tags Found!\n"); diff --git a/client/graph.c b/client/graph.c index 6362c8fe..174e4a5f 100644 --- a/client/graph.c +++ b/client/graph.c @@ -69,6 +69,8 @@ size_t getFromGraphBuf(uint8_t *buff) } return i; } + + // Get or auto-detect clock rate int GetClock(const char *str, int peak, int verbose) { diff --git a/common/lfdemod.c b/common/lfdemod.c index 4a80a10c..8f1a3764 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -31,7 +31,7 @@ int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi //by marshmellow //takes 1s and 0s and searches for EM410x format - output EM ID -uint64_t Em410xDecode(uint8_t *BitStream, size_t size) +uint64_t Em410xDecode(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 @@ -48,17 +48,18 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) uint32_t idx = 0; uint32_t ii=0; uint8_t resetCnt = 0; - while( (idx + 64) < size) { + while( (idx + 64) < *size) { restart: // search for a start of frame marker if ( memcmp(BitStream+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0) { // frame marker found + *startIdx=idx; idx+=9; for (i=0; i<10;i++){ for(ii=0; ii<5; ++ii){ parityTest ^= BitStream[(i*5)+ii+idx]; } - if (!parityTest){ + if (!parityTest){ //even parity parityTest=0; for (ii=0; ii<4;++ii){ lo=(lo<<1LL)|(BitStream[(i*5)+ii+idx]); @@ -74,6 +75,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) } } //skip last 5 bit parity test for simplicity. + *size = 64; return lo; }else{ idx++; @@ -89,10 +91,12 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) { int i; + int clk2=*clk; *clk=DetectASKClock(BinStream, *size, *clk); //clock default - if (*clk<8) *clk =64; - if (*clk<32) *clk=32; + // if autodetected too low then adjust //MAY NEED ADJUSTMENT + if (clk2==0 && *clk<8) *clk =64; + if (clk2==0 && *clk<32) *clk=32; if (*invert != 0 && *invert != 1) *invert=0; uint32_t initLoopMax = 200; if (initLoopMax > *size) initLoopMax=*size; @@ -106,7 +110,7 @@ int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) int lastBit = 0; //set first clock check uint32_t bitnum = 0; //output counter int tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave - if (*clk==32)tol=1; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely + if (*clk<=32)tol=1; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely int iii = 0; uint32_t gLen = *size; if (gLen > 3000) gLen=3000; @@ -198,6 +202,22 @@ int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) return bestErrCnt; } +//by marshmellow +//encode binary data into binary manchester +int ManchesterEncode(uint8_t *BitStream, size_t size) +{ + size_t modIdx=20000, i=0; + if (size>modIdx) return -1; + for (size_t idx=0; idx < size; idx++){ + BitStream[idx+modIdx++] = BitStream[idx]; + BitStream[idx+modIdx++] = BitStream[idx]^1; + } + for (; i<(size*2); i++){ + BitStream[i] = BitStream[i+20000]; + } + return i; +} + //by marshmellow //take 10 and 01 and manchester decode //run through 2 times and take least errCnt @@ -245,7 +265,6 @@ int manrawdecode(uint8_t * BitStream, size_t *size) return errCnt; } - //by marshmellow //take 01 or 10 = 0 and 11 or 00 = 1 int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int offset, int invert) @@ -282,8 +301,8 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) //uint8_t BitStream[502] = {0}; //HACK: if clock not detected correctly - default - if (*clk<8) *clk =64; - if (*clk<32 && clk2==0) *clk=32; + if (clk2==0 && *clk<8) *clk =64; + if (clk2==0 && *clk<32 && clk2==0) *clk=32; if (*invert != 0 && *invert != 1) *invert =0; uint32_t initLoopMax = 200; if (initLoopMax > *size) initLoopMax=*size; @@ -534,12 +553,13 @@ int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t return size; } // loop to get raw HID waveform then FSK demodulate the TAG ID from it -int HIDdemodFSK(uint8_t *dest, size_t size, uint32_t *hi2, uint32_t *hi, uint32_t *lo) +int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo) { - size_t idx=0; //, found=0; //size=0, + size_t idx=0, size2=*size, startIdx=0; // FSK demodulator - size = fskdemod(dest, size,50,0,10,8); + + *size = fskdemod(dest, size2,50,0,10,8); // final loop, go over previously decoded manchester data and decode into usable tag ID // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0 @@ -547,12 +567,13 @@ int HIDdemodFSK(uint8_t *dest, size_t size, uint32_t *hi2, uint32_t *hi, uint32_ int numshifts = 0; idx = 0; //one scan - while( idx + sizeof(frame_marker_mask) < size) { + while( idx + sizeof(frame_marker_mask) < *size) { // search for a start of frame marker if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0) { // frame marker found + startIdx=idx; idx+=sizeof(frame_marker_mask); - while(dest[idx] != dest[idx+1] && idx < size-2) + while(dest[idx] != dest[idx+1] && idx < *size-2) { // Keep going until next frame marker (or error) // Shift in a bit. Start by shifting high registers @@ -567,12 +588,13 @@ int HIDdemodFSK(uint8_t *dest, size_t size, uint32_t *hi2, uint32_t *hi, uint32_ idx += 2; } // Hopefully, we read a tag and hit upon the next frame marker - if(idx + sizeof(frame_marker_mask) < size) + if(idx + sizeof(frame_marker_mask) < *size) { if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0) { //good return - return idx; + *size=idx-startIdx; + return startIdx; } } // reset @@ -585,6 +607,61 @@ int HIDdemodFSK(uint8_t *dest, size_t size, uint32_t *hi2, uint32_t *hi, uint32_ return -1; } +// loop to get raw paradox waveform then FSK demodulate the TAG ID from it +size_t ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo) +{ + + size_t idx=0, size2=*size; + // FSK demodulator + + *size = fskdemod(dest, size2,50,1,10,8); + + // final loop, go over previously decoded manchester data and decode into usable tag ID + // 00001111 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0 + uint8_t frame_marker_mask[] = {0,0,0,0,1,1,1,1}; + uint16_t numshifts = 0; + idx = 0; + //one scan + while( idx + sizeof(frame_marker_mask) < *size) { + // search for a start of frame marker + if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0) + { // frame marker found + size2=idx; + idx+=sizeof(frame_marker_mask); + while(dest[idx] != dest[idx+1] && idx < *size-2) + { + // Keep going until next frame marker (or error) + // Shift in a bit. Start by shifting high registers + *hi2 = (*hi2<<1)|(*hi>>31); + *hi = (*hi<<1)|(*lo>>31); + //Then, shift in a 0 or one into low + if (dest[idx] && !dest[idx+1]) // 1 0 + *lo=(*lo<<1)|1; + else // 0 1 + *lo=(*lo<<1)|0; + numshifts++; + idx += 2; + } + // Hopefully, we read a tag and hit upon the next frame marker and got enough bits + if(idx + sizeof(frame_marker_mask) < *size && numshifts > 40) + { + if ( memcmp(dest+idx, frame_marker_mask, sizeof(frame_marker_mask)) == 0) + { + //good return - return start grid position and bits found + *size = ((numshifts*2)+8); + return size2; + } + } + // reset + *hi2 = *hi = *lo = 0; + numshifts = 0; + }else { + idx++; + } + } + return 0; +} + uint32_t bytebits_to_byte(uint8_t* src, size_t numbits) { uint32_t num = 0; @@ -638,10 +715,10 @@ int IOdemodFSK(uint8_t *dest, size_t size) // by marshmellow // pass bits to be tested in bits, length bits passed in bitLen, and parity type (even=0 | odd=1) in pType // returns 1 if passed -int parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType) +uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType) { uint8_t ans = 0; - for (int i = 0; i < bitLen; i++){ + for (uint8_t i = 0; i < bitLen; i++){ ans ^= ((bits >> i) & 1); } //PrintAndLog("DEBUG: ans: %d, ptype: %d",ans,pType); @@ -676,7 +753,7 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p int AWIDdemodFSK(uint8_t *dest, size_t size) { static const uint8_t THRESHOLD = 123; - uint32_t idx=0; + uint32_t idx=0, idx2=0; //make sure buffer has data if (size < 96*50) return -1; //test samples are not just noise @@ -694,9 +771,12 @@ int AWIDdemodFSK(uint8_t *dest, size_t size) for( idx=0; idx < (size - 96); idx++) { if ( memcmp(dest + idx, mask, sizeof(mask))==0) { // frame marker found - //return ID start index and size - return idx; - //size should always be 96 + //return ID start index + if (idx2 == 0) idx2=idx; + else if(idx-idx2==96) return idx2; + else return -5; + + // should always get 96 bits if it is awid } } //never found mask @@ -708,8 +788,8 @@ int AWIDdemodFSK(uint8_t *dest, size_t size) int PyramiddemodFSK(uint8_t *dest, size_t size) { static const uint8_t THRESHOLD = 123; - uint32_t idx=0; - // size_t size2 = size; + uint32_t idx=0, idx2=0; + // size_t size2 = size; //make sure buffer has data if (size < 128*50) return -5; //test samples are not just noise @@ -727,78 +807,85 @@ int PyramiddemodFSK(uint8_t *dest, size_t size) for( idx=0; idx < (size - 128); idx++) { if ( memcmp(dest + idx, mask, sizeof(mask))==0) { // frame marker found - return idx; + if (idx2==0) idx2=idx; + else if (idx-idx2==128) return idx2; + else return -3; } } //never found mask return -4; } + // by marshmellow // not perfect especially with lower clocks or VERY good antennas (heavy wave clipping) // maybe somehow adjust peak trimming value based on samples to fix? int DetectASKClock(uint8_t dest[], size_t size, int clock) { - int i=0; - int clk[]={8,16,32,40,50,64,100,128,256}; - int loopCnt = 256; //don't need to loop through entire array... - if (size= peak) || (dest[ii] <= low)){ - errCnt=0; - // now that we have the first one lined up test rest of wave array - for (i=0; i<((int)(size/clk[clkCnt])-1); ++i){ - if (dest[ii+(i*clk[clkCnt])]>=peak || dest[ii+(i*clk[clkCnt])]<=low){ - }else if(dest[ii+(i*clk[clkCnt])-tol]>=peak || dest[ii+(i*clk[clkCnt])-tol]<=low){ - }else if(dest[ii+(i*clk[clkCnt])+tol]>=peak || dest[ii+(i*clk[clkCnt])+tol]<=low){ - }else{ //error no peak detected - errCnt++; - } - } - //if we found no errors this is correct one - return this clock - if(errCnt==0) return clk[clkCnt]; - //if we found errors see if it is lowest so far and save it as best run - if(errCnt= peak) || (dest[ii] <= low)){ + errCnt=0; + // now that we have the first one lined up test rest of wave array + for (i=0; i<((int)((size-ii-tol)/clk[clkCnt])-1); ++i){ + if (dest[ii+(i*clk[clkCnt])]>=peak || dest[ii+(i*clk[clkCnt])]<=low){ + }else if(dest[ii+(i*clk[clkCnt])-tol]>=peak || dest[ii+(i*clk[clkCnt])-tol]<=low){ + }else if(dest[ii+(i*clk[clkCnt])+tol]>=peak || dest[ii+(i*clk[clkCnt])+tol]<=low){ + }else{ //error no peak detected + errCnt++; + } + } + //if we found no errors then we can stop here + // this is correct one - return this clock + //PrintAndLog("DEBUG: clk %d, err %d, ii %d, i %d",clk[clkCnt],errCnt,ii,i); + if(errCnt==0 && clkCnt<6) return clk[clkCnt]; + //if we found errors see if it is lowest so far and save it as best run + if(errCnt= 32){ + for(clkCnt=0; clkCnt < 7; ++clkCnt){ + if (clk[clkCnt] <= 32){ tol=1; }else{ tol=0; @@ -837,7 +924,7 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock) errCnt=0; peakcnt=0; // now that we have the first one lined up test rest of wave array - for (i=0; i < ((int)(size/clk[clkCnt])-1); ++i){ + for (i=0; i < ((int)((size-ii-tol)/clk[clkCnt])-1); ++i){ if (dest[ii+(i*clk[clkCnt])]>=peak || dest[ii+(i*clk[clkCnt])]<=low){ peakcnt++; }else if(dest[ii+(i*clk[clkCnt])-tol]>=peak || dest[ii+(i*clk[clkCnt])-tol]<=low){ diff --git a/common/lfdemod.h b/common/lfdemod.h index ae04bc2f..9698d8bd 100644 --- a/common/lfdemod.h +++ b/common/lfdemod.h @@ -17,11 +17,12 @@ int DetectASKClock(uint8_t dest[], size_t size, int clock); int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert); -uint64_t Em410xDecode(uint8_t *BitStream,size_t size); +uint64_t Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx); +int ManchesterEncode(uint8_t *BitStream, size_t size); int manrawdecode(uint8_t *BitStream, size_t *size); int BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert); int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert); -int HIDdemodFSK(uint8_t *dest, size_t size, uint32_t *hi2, uint32_t *hi, uint32_t *lo); +int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo); int IOdemodFSK(uint8_t *dest, size_t size); int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow); uint32_t bytebits_to_byte(uint8_t* src, size_t numbits); @@ -34,5 +35,6 @@ int AWIDdemodFSK(uint8_t *dest, size_t size); size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen); uint32_t countFC(uint8_t *BitStream, size_t size); int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo); +size_t ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo); #endif