X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/bd4cc2c95b3aa115d67790937d3d943a8a6546cf..3628c31882e371997087ecc0249710340bf170e6:/winsrc/command.cpp diff --git a/winsrc/command.cpp b/winsrc/command.cpp index bc9fb9dc..454fbab2 100644 --- a/winsrc/command.cpp +++ b/winsrc/command.cpp @@ -12,6 +12,7 @@ #include "prox.h" #include "../common/iso14443_crc.c" +#include "../common/crc16.c" #define arraylen(x) (sizeof(x)/sizeof((x)[0])) #define BIT(x) GraphBuffer[x * clock] @@ -300,17 +301,19 @@ static void CmdEM4x50read(char *str) while(i < GraphTraceLen) { // measure from low to low - while(GraphBuffer[i] > low) + while((GraphBuffer[i] > low) && (i low) + while((GraphBuffer[i] > low) && (i(MAX_GRAPH_TRACE_LEN/64)) { + break; + } tmpbuff[j++]= i - start; } - /* look for data start - should be 2 pairs of LW (pulses of 192,128) */ start= -1; skip= 0; @@ -330,7 +333,7 @@ static void CmdEM4x50read(char *str) /* skip over the remainder of the LW */ skip += tmpbuff[i+1]+tmpbuff[i+2]; - while(GraphBuffer[skip] > low) + while(skip < MAX_GRAPH_TRACE_LEN && GraphBuffer[skip] > low) ++skip; skip += 8; @@ -1394,14 +1397,14 @@ static void CmdHi15demod(char *str) PrintToScrollback("CRC=%04x", Iso15693Crc(outBuf, k-2)); } -static void CmdTiread(char *str) +static void CmdTIReadRaw(char *str) { UsbCommand c; c.cmd = CMD_ACQUIRE_RAW_BITS_TI_TYPE; SendCommand(&c, FALSE); } -static void CmdTibits(char *str) +static void CmdTIBits(char *str) { int cnt = 0; int i; @@ -1553,7 +1556,30 @@ static void CmdFSKdemod(char *cmdline) PrintToScrollback("hex: %08x %08x", hi, lo); } -static void CmdTidemod(char *cmdline) +// read a TI tag and return its ID +static void CmdTIRead(char *str) +{ + UsbCommand c; + c.cmd = CMD_READ_TI_TYPE; + SendCommand(&c, FALSE); +} + +// write new data to a r/w TI tag +static void CmdTIWrite(char *str) +{ + UsbCommand c; + int res=0; + + c.cmd = CMD_WRITE_TI_TYPE; + res = sscanf(str, "0x%x 0x%x 0x%x ", &c.ext1, &c.ext2, &c.ext3); + if (res == 2) c.ext3=0; + if (res<2) + PrintToScrollback("Please specify 2 or three hex strings, eg 0x1234 0x5678"); + else + SendCommand(&c, FALSE); +} + +static void CmdTIDemod(char *cmdline) { /* MATLAB as follows: f_s = 2000000; % sampling frequency @@ -1608,8 +1634,8 @@ h = sign(sin(cumsum(h))); }; int convLen = max(arraylen(HighTone), arraylen(LowTone)); - - int i; + WORD crc; + int i, TagType; for(i = 0; i < GraphTraceLen - convLen; i++) { int j; int lowSum = 0, highSum = 0;; @@ -1644,17 +1670,29 @@ h = sign(sin(cumsum(h))); RepaintGraphWindow(); - // Okay, so now we have unsliced soft decisions; find bit-sync, and then - // get some bits. + // TI tag data format is 16 prebits, 8 start bits, 64 data bits, + // 16 crc CCITT bits, 8 stop bits, 15 end bits + + // the 16 prebits are always low + // the 8 start and stop bits of a tag must match + // the start/stop prebits of a ro tag are 01111110 + // the start/stop prebits of a rw tag are 11111110 + // the 15 end bits of a ro tag are all low + // the 15 end bits of a rw tag match bits 15-1 of the data bits + // Okay, so now we have unsliced soft decisions; + // find bit-sync, and then get some bits. + // look for 17 low bits followed by 6 highs (common pattern for ro and rw tags) int max = 0, maxPos = 0; for(i = 0; i < 6000; i++) { int j; int dec = 0; - for(j = 0; j < 8*arraylen(LowTone); j++) { + // searching 17 consecutive lows + for(j = 0; j < 17*arraylen(LowTone); j++) { dec -= GraphBuffer[i+j]; } - for(; j < 8*arraylen(LowTone) + 8*arraylen(HighTone); j++) { + // searching 7 consecutive highs + for(; j < 17*arraylen(LowTone) + 6*arraylen(HighTone); j++) { dec += GraphBuffer[i+j]; } if(dec > max) { @@ -1662,14 +1700,18 @@ h = sign(sin(cumsum(h))); maxPos = i; } } - GraphBuffer[maxPos] = 800; - GraphBuffer[maxPos+1] = -800; - maxPos += 8*arraylen(LowTone); + // place a marker in the buffer to visually aid location + // of the start of sync GraphBuffer[maxPos] = 800; GraphBuffer[maxPos+1] = -800; - maxPos += 8*arraylen(HighTone); + // advance pointer to start of actual data stream (after 16 pre and 8 start bits) + maxPos += 17*arraylen(LowTone); + maxPos += 6*arraylen(HighTone); + + // place a marker in the buffer to visually aid location + // of the end of sync GraphBuffer[maxPos] = 800; GraphBuffer[maxPos+1] = -800; @@ -1677,10 +1719,12 @@ h = sign(sin(cumsum(h))); PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone)); - BYTE bits[64+16+8+1]; + BYTE bits[1+64+16+8+16]; bits[sizeof(bits)-1] = '\0'; - for(i = 0; i < arraylen(bits); i++) { + DWORD shift3 = 0x7e000000, shift2 = 0, shift1 = 0, shift0 = 0; + + for(i = 0; i < arraylen(bits)-1; i++) { int high = 0; int low = 0; int j; @@ -1690,30 +1734,79 @@ h = sign(sin(cumsum(h))); for(j = 0; j < arraylen(HighTone); j++) { high += GraphBuffer[maxPos+j]; } + if(high > low) { bits[i] = '1'; maxPos += arraylen(HighTone); + // bitstream arrives lsb first so shift right + shift3 |= (1<<31); } else { bits[i] = '.'; maxPos += arraylen(LowTone); } + + // 128 bit right shift register + shift0 = (shift0>>1) | (shift1 << 31); + shift1 = (shift1>>1) | (shift2 << 31); + shift2 = (shift2>>1) | (shift3 << 31); + shift3 >>= 1; + + // place a marker in the buffer between bits to visually aid location GraphBuffer[maxPos] = 800; GraphBuffer[maxPos+1] = -800; } - PrintToScrollback("bits: '%s'", bits); + PrintToScrollback("Info: raw tag bits = %s", bits); - DWORD h = 0, l = 0; - for(i = 0; i < 32; i++) { - if(bits[i] == '1') { - l |= (1<>8)&0xff; + if ( TagType != ((shift0>>16)&0xff) ) { + PrintToScrollback("Error: start and stop bits do not match!"); + return; + } + else if (TagType == 0x7e) { + PrintToScrollback("Info: Readonly TI tag detected."); + return; } - for(i = 32; i < 64; i++) { - if(bits[i] == '1') { - h |= (1<<(i-32)); + else if (TagType == 0xfe) { + PrintToScrollback("Info: Rewriteable TI tag detected."); + + // put 64 bit data into shift1 and shift0 + shift0 = (shift0>>24) | (shift1 << 8); + shift1 = (shift1>>24) | (shift2 << 8); + + // align 16 bit crc into lower half of shift2 + shift2 = ((shift2>>24) | (shift3 << 8)) & 0x0ffff; + + // align 16 bit "end bits" or "ident" into lower half of shift3 + shift3 >>= 16; + + // only 15 bits compare, last bit of ident is not valid + if ( (shift3^shift0)&0x7fff ) { + PrintToScrollback("Error: Ident mismatch!"); + } + // WARNING the order of the bytes in which we calc crc below needs checking + // i'm 99% sure the crc algorithm is correct, but it may need to eat the + // bytes in reverse or something + // calculate CRC + crc=0; + crc = update_crc16(crc, (shift0)&0xff); + crc = update_crc16(crc, (shift0>>8)&0xff); + crc = update_crc16(crc, (shift0>>16)&0xff); + crc = update_crc16(crc, (shift0>>24)&0xff); + crc = update_crc16(crc, (shift1)&0xff); + crc = update_crc16(crc, (shift1>>8)&0xff); + crc = update_crc16(crc, (shift1>>16)&0xff); + crc = update_crc16(crc, (shift1>>24)&0xff); + PrintToScrollback("Info: Tag data = %08X%08X", shift1, shift0); + if (crc != (shift2&0xffff)) { + PrintToScrollback("Error: CRC mismatch, calculated %04X, got ^04X", crc, shift2&0xffff); + } else { + PrintToScrollback("Info: CRC %04X is good", crc); } } - PrintToScrollback("hex: %08x %08x", h, l); + else { + PrintToScrollback("Unknown tag type."); + return; + } } static void CmdNorm(char *str) @@ -2590,9 +2683,7 @@ static void CmdPlot(char *str) static void CmdGrid(char *str) { - int x = 0, y = 0; - sscanf(str, "%i %i", &x, &y); - SetGraphGrid(x, y); + sscanf(str, "%i %i", &PlotGridX, &PlotGridY); RepaintGraphWindow(); } @@ -2722,7 +2813,7 @@ static struct { {"autocorr", CmdAutoCorr, 1, " -- Autocorrelation over window"}, {"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"}, {"bitstream", Cmdbitstream, 1, "[clock rate] -- Convert waveform into a bitstream"}, - {"buffclear", CmdBuffClear, 0, "Clear sample buffer and graph window"}, + {"buffclear", CmdBuffClear, 1, "Clear sample buffer and graph window"}, {"dec", CmdDec, 1, "Decimate samples"}, {"detectclock", Cmddetectclockrate, 1, "Detect clock rate"}, {"detectreader", CmdDetectReader, 0, "['l'|'h'] -- Detect external reader field (option 'l' or 'h' to limit to LF or HF)"}, @@ -2734,7 +2825,7 @@ static struct { {"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"}, {"fpgaoff", CmdFPGAOff, 0, "Set FPGA off"}, {"fskdemod", CmdFSKdemod, 1, "Demodulate graph window as a HID FSK"}, - {"grid", CmdGrid, 1, "grid x y, overlay grid on graph window, use zero value to turn off either"}, + {"grid", CmdGrid, 1, " -- overlay grid on graph window, use zero value to turn off either"}, {"hexsamples", CmdHexsamples, 0, " -- Dump big buffer as hex bytes"}, {"hi14alist", CmdHi14alist, 0, "List ISO 14443a history"}, {"hi14areader", CmdHi14areader, 0, "Act like an ISO14443 Type A reader"}, @@ -2779,9 +2870,11 @@ static struct { {"scale", CmdScale, 1, " -- Set cursor display scale"}, {"setlfdivisor", CmdSetDivisor, 0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"}, {"sri512read", CmdSri512read, 0, " -- Read contents of a SRI512 tag"}, - {"tibits", CmdTibits, 0, "Get raw bits for TI-type LF tag"}, - {"tidemod", CmdTidemod, 1, "Demodulate raw bits for TI-type LF tag"}, - {"tiread", CmdTiread, 0, "Read a TI-type 134 kHz tag"}, + {"tibits", CmdTIBits, 0, "Get raw bits for TI-type LF tag"}, + {"tidemod", CmdTIDemod, 1, "Demodulate raw bits for TI-type LF tag"}, + {"tireadraw", CmdTIReadRaw, 0, "Read a TI-type 134 kHz tag in raw mode"}, + {"tiread", CmdTIRead, 0, "Read and decode a TI 134 kHz tag"}, + {"tiwrite", CmdTIWrite, 0, "Write new data to a r/w TI 134 kHz tag"}, {"threshold", CmdThreshold, 1, "Maximize/minimize every value in the graph window depending on threshold"}, {"tune", CmdTune, 0, "Measure antenna tuning"}, {"vchdemod", CmdVchdemod, 0, "['clone'] -- Demodulate samples for VeriChip"},