X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/d66d48434751ea6d2f593a213f29d2282485ecde..9f7bbd24c9eabeed1cb92376750a549f9476f3ad:/client/cmddata.c diff --git a/client/cmddata.c b/client/cmddata.c index 0bd8a7a9..d5b072c0 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -22,6 +22,7 @@ #include "cmddata.h" #include "lfdemod.h" #include "usb_cmd.h" +#include "crc.h" uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; uint8_t g_debugMode; @@ -86,7 +87,24 @@ void printDemodBuff(void) int CmdPrintDemodBuff(const char *Cmd) { - printDemodBuff(); + char hex; + char printBuff[512]={0x00}; + uint8_t numBits = DemodBufferLen & 0xFFF0; + sscanf(Cmd, "%c", &hex); + if (hex == 'h'){ + PrintAndLog("Usage: data printdemodbuffer [x]"); + PrintAndLog("Options: "); + PrintAndLog(" h This help"); + PrintAndLog(" x output in hex (omit for binary output)"); + return 0; + } + if (hex == 'x'){ + numBits = binarraytohex(printBuff, (char *)DemodBuffer, numBits); + if (numBits==0) return 0; + PrintAndLog("DemodBuffer: %s",printBuff); + } else { + printDemodBuff(); + } return 1; } int CmdAmp(const char *Cmd) @@ -520,6 +538,7 @@ int CmdBiphaseDecodeRaw(const char *Cmd) PrintAndLog("Biphase Decoded using offset: %d - # errors:%d - data:",offset,errCnt); 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 return 1; } @@ -534,7 +553,7 @@ void setBiphaseDemodBuf(uint8_t *BitStream, size_t size) return; } for (size_t idx=0; idx= GraphTraceLen) { - PrintAndLog("window must be smaller than trace (%d samples)", - GraphTraceLen); - return 0; - } - - PrintAndLog("performing %d correlations", GraphTraceLen - window); - + size_t Correlation = 0; + int maxSum = 0; + int lastMax = 0; + if (verbose) PrintAndLog("performing %d correlations", GraphTraceLen - window); for (int i = 0; i < GraphTraceLen - window; ++i) { int sum = 0; for (int j = 0; j < window; ++j) { sum += (GraphBuffer[j]*GraphBuffer[i + j]) / 256; } CorrelBuffer[i] = sum; + if (sum >= maxSum-100 && sum <= maxSum+100){ + //another max + Correlation = i-lastMax; + lastMax = i; + if (sum > maxSum) maxSum = sum; + } else if (sum > maxSum){ + maxSum=sum; + lastMax = i; + } + } + if (Correlation==0){ + //try again with wider margin + for (int i = 0; i < GraphTraceLen - window; i++){ + if (CorrelBuffer[i] >= maxSum-(maxSum*0.05) && CorrelBuffer[i] <= maxSum+(maxSum*0.05)){ + //another max + Correlation = i-lastMax; + lastMax = i; + //if (CorrelBuffer[i] > maxSum) maxSum = sum; + } + } } - GraphTraceLen = GraphTraceLen - window; - memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int)); + if (verbose && Correlation > 0) PrintAndLog("Possible Correlation: %d samples",Correlation); - RepaintGraphWindow(); + if (SaveGrph){ + GraphTraceLen = GraphTraceLen - window; + memcpy(GraphBuffer, CorrelBuffer, GraphTraceLen * sizeof (int)); + RepaintGraphWindow(); + } + return Correlation; +} + +int usage_data_autocorr(void) +{ + //print help + PrintAndLog("Usage: data autocorr [window] [g]"); + PrintAndLog("Options: "); + PrintAndLog(" h This help"); + PrintAndLog(" [window] window length for correlation - default = 4000"); + PrintAndLog(" g save back to GraphBuffer (overwrite)"); return 0; } +int CmdAutoCorr(const char *Cmd) +{ + char cmdp = param_getchar(Cmd, 0); + if (cmdp == 'h' || cmdp == 'H') + return usage_data_autocorr(); + int window = 4000; //set default + char grph=0; + bool updateGrph = FALSE; + sscanf(Cmd, "%i %c", &window, &grph); + + if (window >= GraphTraceLen) { + PrintAndLog("window must be smaller than trace (%d samples)", + GraphTraceLen); + return 0; + } + if (grph == 'g') updateGrph=TRUE; + return AutoCorrelate(window, updateGrph, TRUE); +} + int CmdBitsamples(const char *Cmd) { int cnt = 0; @@ -1416,7 +1477,16 @@ int CmdFSKdemodPyramid(const char *Cmd) // w = wiegand parity, x = extra space for other formats // p = unknown checksum // (26 bit format shown) - + + //get bytes for checksum calc + uint8_t checksum = bytebits_to_byte(BitStream + idx + 120, 8); + uint8_t csBuff[14] = {0x00}; + for (uint8_t i = 0; i < 13; i++){ + csBuff[i] = bytebits_to_byte(BitStream + idx + 16 + (i*8), 8); + } + //check checksum calc + uint32_t checkCS = CRC8Maxim(csBuff,13); + //get raw ID before removing parities uint32_t rawLo = bytebits_to_byte(BitStream+idx+96,32); uint32_t rawHi = bytebits_to_byte(BitStream+idx+64,32); @@ -1426,7 +1496,8 @@ int CmdFSKdemodPyramid(const char *Cmd) size = removeParity(BitStream, idx+8, 8, 1, 120); if (size != 105){ - 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); + 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; } @@ -1484,6 +1555,11 @@ int CmdFSKdemodPyramid(const char *Cmd) PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %08x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo); } } + if (checksum == checkCS) + PrintAndLog("Checksum %02x passed", checksum); + else + PrintAndLog("Checksum %02x failed - should have been %02x", checksum, checkCS); + if (g_debugMode){ PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, 128); printDemodBuff(); @@ -2563,7 +2639,7 @@ static command_t CommandTable[] = {"askgproxiidemod",CmdG_Prox_II_Demod,1, "Demodulate a G Prox II tag from GraphBuffer"}, //{"askmandemod", Cmdaskmandemod, 1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate ASK/Manchester tags and output binary (args optional)"}, //{"askrawdemod", Cmdaskrawdemod, 1, "[clock] [invert<0|1>] -- Attempt to demodulate ASK tags and output bin (args optional)"}, - {"autocorr", CmdAutoCorr, 1, " -- Autocorrelation over window"}, + {"autocorr", CmdAutoCorr, 1, "[window length] [g] -- Autocorrelation over window - g to save back to GraphBuffer (overwrite)"}, {"biphaserawdecode",CmdBiphaseDecodeRaw,1,"[offset] [invert<0|1>] Biphase decode bin stream in DemodBuffer (offset = 0|1 bits to shift the decode start)"}, {"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"}, //{"bitstream", CmdBitstream, 1, "[clock rate] -- Convert waveform into a bitstream"}, @@ -2594,7 +2670,7 @@ static command_t CommandTable[] = //{"nrzrawdemod", CmdNRZrawDemod, 1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate nrz tags and output binary (args optional)"}, {"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"}, //{"pskdetectclock",CmdDetectPSKClockRate, 1, "Detect ASK, PSK, or NRZ clock rate"}, - {"printdemodbuffer",CmdPrintDemodBuff,1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"}, + {"printdemodbuffer",CmdPrintDemodBuff,1, "[x] -- print the data in the DemodBuffer - 'x' for hex output"}, {"pskindalademod",CmdIndalaDecode, 1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"}, //{"psk1rawdemod", CmdPSK1rawDemod, 1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate psk1 tags and output binary (args optional)"}, //{"psk2rawdemod", CmdPSK2rawDemod, 1, "[clock] [invert<0|1>] [maxErr] -- Attempt to demodulate psk2 tags and output binary (args optional)"},