X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/9f7bbd24c9eabeed1cb92376750a549f9476f3ad..1c6490cddcd6b270781dd81ed2743fae623d2cfc:/client/cmddata.c?ds=sidebyside diff --git a/client/cmddata.c b/client/cmddata.c index d5b072c0..ceec9489 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -33,6 +33,12 @@ static int CmdHelp(const char *Cmd); //by marshmellow void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx) { + if (buff == NULL) + return; + + if ( size >= MAX_DEMOD_BUF_LEN) + size = MAX_DEMOD_BUF_LEN; + size_t i = 0; for (; i < size; i++){ DemodBuffer[i]=buff[startIdx++]; @@ -260,9 +266,9 @@ void printBitStream(uint8_t BitStream[], uint32_t bitLen) } //by marshmellow //print 64 bit EM410x ID in multiple formats -void printEM410x(uint64_t id) +void printEM410x(uint32_t hi, uint64_t id) { - if (id !=0){ + if (id || hi){ uint64_t iii=1; uint64_t id2lo=0; uint32_t ii=0; @@ -272,7 +278,11 @@ void printEM410x(uint64_t id) id2lo=(id2lo<<1LL) | ((id & (iii << (i+((ii-1)*8)))) >> (i+((ii-1)*8))); } } - //output em id + if (hi){ + //output 88 bit em id + PrintAndLog("EM TAG ID : %06x%016llx", hi, id); + } else{ + //output 40 bit em id PrintAndLog("EM TAG ID : %010llx", id); PrintAndLog("Unique TAG ID: %010llx", id2lo); PrintAndLog("DEZ 8 : %08lld",id & 0xFFFFFF); @@ -281,7 +291,8 @@ void printEM410x(uint64_t id) PrintAndLog("DEZ 3.5A : %03lld.%05lld",(id>>32ll),(id & 0xFFFF)); PrintAndLog("DEZ 14/IK2 : %014lld",id); PrintAndLog("DEZ 15/IK3 : %015lld",id2lo); - PrintAndLog("Other : %05lld_%03lld_%08lld",(id&0xFFFF),((id>>16LL) & 0xFF),(id & 0xFFFFFF)); + PrintAndLog("Other : %05lld_%03lld_%08lld",(id&0xFFFF),((id>>16LL) & 0xFF),(id & 0xFFFFFF)); + } } return; } @@ -292,9 +303,6 @@ void printEM410x(uint64_t id) //prints binary found and saves in graphbuffer for further commands int CmdAskEM410xDemod(const char *Cmd) { - int invert=0; - int clk=0; - int maxErr=100; char cmdp = param_getchar(Cmd, 0); if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: data askem410xdemod [clock] <0|1> [maxError]"); @@ -307,50 +315,21 @@ int CmdAskEM410xDemod(const char *Cmd) PrintAndLog(" : data askem410xdemod 32 1 = demod an EM410x Tag ID from GraphBuffer using a clock of RF/32 and inverting data"); PrintAndLog(" : data askem410xdemod 1 = demod an EM410x Tag ID from GraphBuffer while inverting data"); PrintAndLog(" : data askem410xdemod 64 1 0 = demod an EM410x Tag ID from GraphBuffer using a clock of RF/64 and inverting data and allowing 0 demod errors"); - - return 0; - } - - - uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; - sscanf(Cmd, "%i %i %i", &clk, &invert, &maxErr); - if (invert != 0 && invert != 1) { - PrintAndLog("Invalid argument: %s", Cmd); return 0; } - size_t BitLen = getFromGraphBuf(BitStream); + int ans = ASKmanDemod(Cmd, FALSE, FALSE); + if (!ans) return 0; - if (g_debugMode==1) PrintAndLog("DEBUG: Bitlen from grphbuff: %d",BitLen); - if (BitLen==0) return 0; - int errCnt=0; - errCnt = askmandemod(BitStream, &BitLen, &clk, &invert, maxErr); - if (errCnt<0||BitLen<16){ //if fatal error (or -1) - 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); - - //output - if (errCnt>0){ - PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); - } - //PrintAndLog("ASK/Manchester decoded bitstream:"); - // Now output the bitstream to the scrollback by line of 16 bits - setDemodBuf(BitStream,BitLen,0); - //printDemodBuff(); uint64_t lo =0; + uint32_t hi =0; size_t idx=0; - lo = Em410xDecode(BitStream, &BitLen, &idx); - if (lo>0){ - //set GraphBuffer for clone or sim command - setDemodBuf(BitStream, BitLen, idx); + if (Em410xDecode(DemodBuffer,(size_t *) &DemodBufferLen, &idx, &hi, &lo)){ if (g_debugMode){ - PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen); + PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, DemodBufferLen); printDemodBuff(); } PrintAndLog("EM410x pattern found: "); - if (BitLen > 64) PrintAndLog("\nWarning! Length not what is expected - Length: %d bits\n",BitLen); - printEM410x(lo); + printEM410x(hi, lo); return 1; } return 0; @@ -381,21 +360,21 @@ int ASKmanDemod(const char *Cmd, bool verbose, bool emSearch) if (g_debugMode==1) PrintAndLog("no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk); return 0; } - if (verbose) PrintAndLog("\nUsing Clock: %d - Invert: %d - Bits Found: %d",clk,invert,BitLen); + if (verbose || g_debugMode) PrintAndLog("\nUsing Clock: %d - Invert: %d - Bits Found: %d",clk,invert,BitLen); //output if (errCnt>0){ - if (verbose) PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); + if (verbose || g_debugMode) PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); } - if (verbose) PrintAndLog("ASK/Manchester decoded bitstream:"); + if (verbose || g_debugMode) PrintAndLog("ASK/Manchester decoded bitstream:"); // Now output the bitstream to the scrollback by line of 16 bits setDemodBuf(BitStream,BitLen,0); - if (verbose) printDemodBuff(); + if (verbose || g_debugMode) printDemodBuff(); uint64_t lo =0; + uint32_t hi =0; size_t idx=0; if (emSearch){ - lo = Em410xDecode(BitStream, &BitLen, &idx); - if (lo>0){ + if (Em410xDecode(BitStream, &BitLen, &idx, &hi, &lo)){ //set GraphBuffer for clone or sim command setDemodBuf(BitStream, BitLen, idx); if (g_debugMode){ @@ -403,7 +382,7 @@ int ASKmanDemod(const char *Cmd, bool verbose, bool emSearch) printDemodBuff(); } if (verbose) PrintAndLog("EM410x pattern found: "); - if (verbose) printEM410x(lo); + if (verbose) printEM410x(hi, lo); return 1; } } @@ -473,13 +452,13 @@ int Cmdmandecoderaw(const char *Cmd) printBitStream(BitStream, size); if (errCnt==0){ uint64_t id = 0; + uint32_t hi = 0; size_t idx=0; - id = Em410xDecode(BitStream, &size, &idx); - if (id>0){ + if (Em410xDecode(BitStream, &size, &idx, &hi, &id)){ //need to adjust to set bitstream back to manchester encoded data //setDemodBuf(BitStream, size, idx); - printEM410x(id); + printEM410x(hi, id); } } return 1; @@ -497,53 +476,52 @@ int Cmdmandecoderaw(const char *Cmd) // width waves vs small width waves to help the decode positioning) or askbiphdemod int CmdBiphaseDecodeRaw(const char *Cmd) { - int i = 0; - int errCnt=0; size_t size=0; - int offset=0; - int invert=0; - int high=0, low=0; + int offset=0, invert=0, maxErr=20, errCnt=0; char cmdp = param_getchar(Cmd, 0); if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') { - PrintAndLog("Usage: data biphaserawdecode [offset] "); - PrintAndLog(" Converts 10 or 01 to 0 and 11 or 00 to 1"); + PrintAndLog("Usage: data biphaserawdecode [offset] [invert] [maxErr]"); + PrintAndLog(" Converts 10 or 01 to 1 and 11 or 00 to 0"); PrintAndLog(" --must have binary sequence in demodbuffer (run data askrawdemod first)"); PrintAndLog(""); PrintAndLog(" [offset <0|1>], set to 0 not to adjust start position or to 1 to adjust decode start position"); PrintAndLog(" [invert <0|1>], set to 1 to invert output"); + PrintAndLog(" [maxErr int], set max errors tolerated - default=20"); PrintAndLog(""); PrintAndLog(" sample: data biphaserawdecode = decode biphase bitstream from the demodbuffer"); PrintAndLog(" sample: data biphaserawdecode 1 1 = decode biphase bitstream from the demodbuffer, set offset, and invert output"); return 0; } - sscanf(Cmd, "%i %i", &offset, &invert); - if (DemodBufferLen==0) return 0; - uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; - //get graphbuffer & high and low - for (;ihigh)high=DemodBuffer[i]; - else if(DemodBuffer[i]1 || low <0){ - PrintAndLog("Error: please raw demod the wave first then decode"); + sscanf(Cmd, "%i %i %i", &offset, &invert, &maxErr); + if (DemodBufferLen==0){ + PrintAndLog("DemodBuffer Empty - run 'data rawdemod ar' first"); return 0; } - size=i; + uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; + memcpy(BitStream, DemodBuffer, DemodBufferLen); + size = DemodBufferLen; errCnt=BiphaseRawDecode(BitStream, &size, offset, invert); - if (errCnt>=20){ + if (errCnt<0){ + PrintAndLog("Error during decode:%d", errCnt); + return 0; + } + if (errCnt>maxErr){ PrintAndLog("Too many errors attempting to decode: %d",errCnt); return 0; } - PrintAndLog("Biphase Decoded using offset: %d - # errors:%d - data:",offset,errCnt); + + if (errCnt>0){ + PrintAndLog("# Errors found during Demod (shown as 77 in bit stream): %d",errCnt); + } + PrintAndLog("Biphase Decoded using offset: %d - # invert:%d - data:",offset,invert); printBitStream(BitStream, size); - PrintAndLog("\nif bitstream does not look right try offset=1"); - if (offset == 1) setDemodBuf(DemodBuffer,DemodBufferLen-1,1); //remove first bit from raw demod + + if (offset) setDemodBuf(DemodBuffer,DemodBufferLen-offset, offset); //remove first bit from raw demod return 1; } // set demod buffer back to raw after biphase demod -void setBiphaseDemodBuf(uint8_t *BitStream, size_t size) +void setBiphasetoRawDemodBuf(uint8_t *BitStream, size_t size) { uint8_t rawStream[512]={0x00}; size_t i=0; @@ -565,6 +543,7 @@ void setBiphaseDemodBuf(uint8_t *BitStream, size_t size) setDemodBuf(rawStream,i,0); return; } + //by marshmellow //takes 4 arguments - clock, invert, maxErr as integers and amplify as char //attempts to demodulate ask only @@ -579,7 +558,7 @@ int ASKrawDemod(const char *Cmd, bool verbose) uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; sscanf(Cmd, "%i %i %i %c", &clk, &invert, &maxErr, &); if (invert != 0 && invert != 1) { - if (verbose) PrintAndLog("Invalid argument: %s", Cmd); + if (verbose || g_debugMode) PrintAndLog("Invalid argument: %s", Cmd); return 0; } if (clk==1){ @@ -592,20 +571,20 @@ int ASKrawDemod(const char *Cmd, bool verbose) int errCnt=0; errCnt = askrawdemod(BitStream, &BitLen, &clk, &invert, maxErr, askAmp); if (errCnt==-1||BitLen<16){ //throw away static - allow 1 and -1 (in case of threshold command first) - if (verbose) PrintAndLog("no data found"); - if (g_debugMode==1 && verbose) PrintAndLog("errCnt: %d, BitLen: %d, clk: %d, invert: %d", errCnt, BitLen, clk, invert); + if (verbose || g_debugMode) PrintAndLog("no data found"); + if (g_debugMode) PrintAndLog("errCnt: %d, BitLen: %d, clk: %d, invert: %d", errCnt, BitLen, clk, invert); return 0; } - if (verbose) PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d", clk, invert, BitLen); + if (verbose || g_debugMode) PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d", clk, invert, BitLen); //move BitStream back to DemodBuffer setDemodBuf(BitStream,BitLen,0); //output - if (errCnt>0 && verbose){ + if (errCnt>0 && (verbose || g_debugMode)){ PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d", errCnt); } - if (verbose){ + if (verbose || g_debugMode){ PrintAndLog("ASK demoded bitstream:"); // Now output the bitstream to the scrollback by line of 16 bits printBitStream(BitStream,BitLen); @@ -613,6 +592,71 @@ int ASKrawDemod(const char *Cmd, bool verbose) return 1; } +//by marshmellow +// - ASK Demod then Biphase decode GraphBuffer samples +int ASKbiphaseDemod(const char *Cmd, bool verbose) +{ + //ask raw demod GraphBuffer first + int offset=0, clk=0, invert=0, maxErr=0, ans=0; + ans = sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr); + if (ans>0) + ans = ASKrawDemod(Cmd+2, FALSE); + else + ans = ASKrawDemod(Cmd, FALSE); + if (!ans) { + if (g_debugMode || verbose) PrintAndLog("Error AskrawDemod: %d", ans); + return 0; + } + + //attempt to Biphase decode DemodBuffer + size_t size = DemodBufferLen; + uint8_t BitStream[MAX_DEMOD_BUF_LEN]; + memcpy(BitStream, DemodBuffer, DemodBufferLen); + + int errCnt = BiphaseRawDecode(BitStream, &size, offset, invert); + if (errCnt < 0){ + if (g_debugMode || verbose) PrintAndLog("Error BiphaseRawDecode: %d", errCnt); + return 0; + } + if (errCnt > maxErr) { + if (g_debugMode || verbose) PrintAndLog("Error BiphaseRawDecode too many errors: %d", errCnt); + return 0; + } + //success set DemodBuffer and return + setDemodBuf(BitStream, size, 0); + if (g_debugMode || verbose){ + PrintAndLog("Biphase Decoded using offset: %d - # errors:%d - data:",offset,errCnt); + printDemodBuff(); + } + return 1; +} +//by marshmellow - see ASKbiphaseDemod +int Cmdaskbiphdemod(const char *Cmd) +{ + char cmdp = param_getchar(Cmd, 0); + if (strlen(Cmd) > 12 || cmdp == 'h' || cmdp == 'H') { + PrintAndLog("Usage: data rawdemod ab [offset] [clock] [maxError] "); + PrintAndLog(" [offset], offset to begin biphase, default=0"); + PrintAndLog(" [set clock as integer] optional, if not set, autodetect"); + PrintAndLog(" , 1 to invert output"); + PrintAndLog(" [set maximum allowed errors], default = 100"); + PrintAndLog(" , 'a' to attempt demod with ask amplification, default = no amp"); + PrintAndLog(" NOTE: can be entered as second or third argument"); + PrintAndLog(" NOTE: can be entered as first, second or last argument"); + PrintAndLog(" NOTE: any other arg must have previous args set to work"); + PrintAndLog(""); + PrintAndLog(" sample: data rawdemod ab = demod an ask/biph tag from GraphBuffer"); + PrintAndLog(" : data rawdemod ab a = demod an ask/biph tag from GraphBuffer, amplified"); + PrintAndLog(" : data rawdemod ab 1 32 = demod an ask/biph tag from GraphBuffer using an offset of 1 and a clock of RF/32"); + PrintAndLog(" : data rawdemod ab 0 32 1 = demod an ask/biph tag from GraphBuffer using a clock of RF/32 and inverting data"); + PrintAndLog(" : data rawdemod ab 0 1 = demod an ask/biph tag from GraphBuffer while inverting data"); + PrintAndLog(" : data rawdemod ab 0 64 1 0 = demod an ask/biph tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors"); + PrintAndLog(" : data rawdemod ab 0 64 1 0 a = demod an ask/biph tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors, and amp"); + return 0; + } + return ASKbiphaseDemod(Cmd, TRUE); +} + //by marshmellow //attempts to demodulate and identify a G_Prox_II verex/chubb card //WARNING: if it fails during some points it will destroy the DemodBuffer data @@ -620,33 +664,17 @@ int ASKrawDemod(const char *Cmd, bool verbose) //if successful it will push askraw data back to demod buffer ready for emulation int CmdG_Prox_II_Demod(const char *Cmd) { - int ans = ASKrawDemod(Cmd, FALSE); - if (ans <= 0) { - if (g_debugMode) PrintAndLog("Error AskrawDemod: %d",ans); - return 0; //ans; + if (!ASKbiphaseDemod(Cmd, FALSE)){ + if (g_debugMode) PrintAndLog("ASKbiphaseDemod failed 1st try"); + return 0; } size_t size = DemodBufferLen; - ans = BiphaseRawDecode(DemodBuffer, &size, 0, 0); - if (ans !=0) { - if (g_debugMode) PrintAndLog("Error BiphaseRawDecode: %d",ans); - return 0; //ans; - } //call lfdemod.c demod for gProxII - ans = gProxII_Demod(DemodBuffer, &size); + int ans = gProxII_Demod(DemodBuffer, &size); if (ans < 0){ - if (g_debugMode) PrintAndLog("Error gProxII_Demod 1st Try: %d",ans); - //try biphase again - ans = BiphaseRawDecode(DemodBuffer, &size, 1, 0); - if (ans != 0) { - if (g_debugMode) PrintAndLog("Error BiphaseRawDecode: %d",ans); - return 0;//ans; - } - ans = gProxII_Demod(DemodBuffer, &size); - if (ans < 0) { - if (g_debugMode) PrintAndLog("Error gProxII_Demod 1st Try: %d",ans); - return ans; + if (g_debugMode) PrintAndLog("Error gProxII_Demod"); + return 0; } - } //got a good demod uint32_t ByteStream[65] = {0x00}; uint8_t xorKey=0; @@ -659,7 +687,7 @@ int CmdG_Prox_II_Demod(const char *Cmd) //spacer bit - should be 0 if (DemodBuffer[startIdx+idx] != 0) { if (g_debugMode) PrintAndLog("Error spacer not 0: %d, pos: %d",DemodBuffer[startIdx+idx],startIdx+idx); - return -1; + return 0; } continue; } @@ -703,7 +731,7 @@ int CmdG_Prox_II_Demod(const char *Cmd) PrintAndLog("Unknown G-Prox-II Fmt Found: FmtLen %d",fmtLen); } PrintAndLog("Raw: %08x%08x%08x", raw1,raw2,raw3); - setBiphaseDemodBuf(DemodBuffer+ans, 96); + setDemodBuf(DemodBuffer+ans, 96, 0); return 1; } @@ -751,7 +779,7 @@ int AutoCorrelate(int window, bool SaveGrph, bool verbose) } else if (sum > maxSum){ maxSum=sum; lastMax = i; - } + } } if (Correlation==0){ //try again with wider margin @@ -767,8 +795,8 @@ int AutoCorrelate(int window, bool SaveGrph, bool verbose) if (verbose && Correlation > 0) PrintAndLog("Possible Correlation: %d samples",Correlation); if (SaveGrph){ - GraphTraceLen = GraphTraceLen - window; - memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int)); + GraphTraceLen = GraphTraceLen - window; + memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int)); RepaintGraphWindow(); } return Correlation; @@ -1076,7 +1104,7 @@ int FSKrawDemod(const char *Cmd, bool verbose) 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 if (verbose) { PrintAndLog("FSK decoded bitstream:"); - printBitStream(BitStream,size); + printBitStream(BitStream,size); } return 1; @@ -1485,6 +1513,7 @@ int CmdFSKdemodPyramid(const char *Cmd) csBuff[i] = bytebits_to_byte(BitStream + idx + 16 + (i*8), 8); } //check checksum calc + //checksum calc thanks to ICEMAN!! uint32_t checkCS = CRC8Maxim(csBuff,13); //get raw ID before removing parities @@ -1699,7 +1728,7 @@ int PSKDemod(const char *Cmd, bool verbose) } if (invert != 0 && invert != 1) { if (verbose) PrintAndLog("Invalid argument: %s", Cmd); - return -1; + return 0; } uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; size_t BitLen = getFromGraphBuf(BitStream); @@ -1707,22 +1736,27 @@ int PSKDemod(const char *Cmd, bool verbose) uint8_t carrier=countPSK_FC(BitStream, BitLen); if (carrier!=2 && carrier!=4 && carrier!=8){ //invalid carrier - return -1; + return 0; } int errCnt=0; errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert); if (errCnt > maxErr){ if (g_debugMode==1 && verbose) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt); - return -1; + return 0; } if (errCnt<0|| BitLen<16){ //throw away static - allow 1 and -1 (in case of threshold command first) if (g_debugMode==1 && verbose) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt); - return -1; + return 0; + } + if (verbose){ + PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen); + if (errCnt>0){ + PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); + } } - if (verbose) PrintAndLog("Tried PSK Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen); //prime demod buffer for output setDemodBuf(BitStream,BitLen,0); - return errCnt; + return 1; } // Indala 26 bit decode @@ -1737,7 +1771,7 @@ int CmdIndalaDecode(const char *Cmd) ans = PSKDemod("32", 0); } - if (ans < 0){ + if (!ans){ if (g_debugMode==1) PrintAndLog("Error1: %d",ans); return 0; @@ -1838,7 +1872,8 @@ int NRZrawDemod(const char *Cmd, bool verbose) if (g_debugMode==1 && verbose) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt); return 0; } - PrintAndLog("Tried NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen); + if (verbose) + PrintAndLog("Tried NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen); //prime demod buffer for output setDemodBuf(BitStream,BitLen,0); @@ -1846,9 +1881,9 @@ int NRZrawDemod(const char *Cmd, bool verbose) PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); } if (verbose) { - PrintAndLog("NRZ demoded bitstream:"); - // Now output the bitstream to the scrollback by line of 16 bits - printDemodBuff(); + PrintAndLog("NRZ demoded bitstream:"); + // Now output the bitstream to the scrollback by line of 16 bits + printDemodBuff(); } return 1; } @@ -1878,7 +1913,7 @@ int CmdNRZrawDemod(const char *Cmd) // prints binary found and saves in demodbuffer for further commands int CmdPSK1rawDemod(const char *Cmd) { - int errCnt; + int ans; char cmdp = param_getchar(Cmd, 0); if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: data rawdemod p1 [clock] <0|1> [maxError]"); @@ -1893,15 +1928,13 @@ int CmdPSK1rawDemod(const char *Cmd) PrintAndLog(" : data rawdemod p1 64 1 0 = demod a psk1 tag from GraphBuffer using a clock of RF/64, inverting data and allowing 0 demod errors"); return 0; } - errCnt = PSKDemod(Cmd, TRUE); + ans = PSKDemod(Cmd, TRUE); //output - if (errCnt<0){ - if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); + if (!ans){ + if (g_debugMode) PrintAndLog("Error demoding: %d",ans); return 0; } - if (errCnt>0){ - PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); - } + PrintAndLog("PSK demoded bitstream:"); // Now output the bitstream to the scrollback by line of 16 bits printDemodBuff(); @@ -1912,7 +1945,7 @@ int CmdPSK1rawDemod(const char *Cmd) // takes same args as cmdpsk1rawdemod int CmdPSK2rawDemod(const char *Cmd) { - int errCnt=0; + int ans=0; char cmdp = param_getchar(Cmd, 0); if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: data rawdemod p2 [clock] <0|1> [maxError]"); @@ -1927,24 +1960,15 @@ int CmdPSK2rawDemod(const char *Cmd) PrintAndLog(" : data rawdemod p2 64 1 0 = demod a psk2 tag from GraphBuffer using a clock of RF/64, inverting output and allowing 0 demod errors"); return 0; } - errCnt=PSKDemod(Cmd, TRUE); - if (errCnt<0){ - if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); + ans=PSKDemod(Cmd, TRUE); + if (!ans){ + if (g_debugMode) PrintAndLog("Error demoding: %d",ans); return 0; } psk1TOpsk2(DemodBuffer, DemodBufferLen); - if (errCnt>0){ - if (g_debugMode){ - PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); - PrintAndLog("PSK2 demoded bitstream:"); - // Now output the bitstream to the scrollback by line of 16 bits - printDemodBuff(); - } - }else{ - PrintAndLog("PSK2 demoded bitstream:"); - // Now output the bitstream to the scrollback by line of 16 bits - printDemodBuff(); - } + PrintAndLog("PSK2 demoded bitstream:"); + // Now output the bitstream to the scrollback by line of 16 bits + printDemodBuff(); return 1; } @@ -1955,12 +1979,14 @@ int CmdRawDemod(const char *Cmd) if (strlen(Cmd) > 14 || cmdp == 'h' || cmdp == 'H' || strlen(Cmd)<2) { PrintAndLog("Usage: data rawdemod [modulation] |"); - PrintAndLog(" [modulation] as 2 char, 'am' for ask/manchester, 'ar' for ask/raw, 'fs' for fsk, 'nr' for nrz/direct, 'p1' for psk1, 'p2' for psk2"); + PrintAndLog(" [modulation] as 2 char, 'ab' for ask/biphase, 'am' for ask/manchester, 'ar' for ask/raw, 'fs' for fsk, ..."); + PrintAndLog(" 'nr' for nrz/direct, 'p1' for psk1, 'p2' for psk2"); PrintAndLog(" as 'h', prints the help for the specific modulation"); PrintAndLog(" see specific modulation help for optional parameters"); PrintAndLog(""); PrintAndLog(" sample: data rawdemod fs h = print help for ask/raw demod"); PrintAndLog(" : data rawdemod fs = demod GraphBuffer using: fsk - autodetect"); + PrintAndLog(" : data rawdemod ab = demod GraphBuffer using: ask/biphase - autodetect"); PrintAndLog(" : data rawdemod am = demod GraphBuffer using: ask/manchester - autodetect"); PrintAndLog(" : data rawdemod ar = demod GraphBuffer using: ask/raw - autodetect"); PrintAndLog(" : data rawdemod nr = demod GraphBuffer using: nrz/direct - autodetect"); @@ -1972,6 +1998,8 @@ int CmdRawDemod(const char *Cmd) int ans = 0; if (cmdp == 'f' && cmdp2 == 's'){ ans = CmdFSKrawdemod(Cmd+3); + } else if(cmdp == 'a' && cmdp2 == 'b'){ + ans = Cmdaskbiphdemod(Cmd+3); } else if(cmdp == 'a' && cmdp2 == 'm'){ ans = Cmdaskmandemod(Cmd+3); } else if(cmdp == 'a' && cmdp2 == 'r'){