X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/0c2ed92d876c32abce11daf86eea4bcece6fa6fa..3742d905632dbce9792f70b110e7ba5605bf312f:/winsrc/command.cpp diff --git a/winsrc/command.cpp b/winsrc/command.cpp index 4ac807d9..929cff07 100644 --- a/winsrc/command.cpp +++ b/winsrc/command.cpp @@ -301,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; @@ -331,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; @@ -661,6 +663,15 @@ static void CmdLosim(char *str) SendCommand(&c, FALSE); } +static void CmdLosimBidir(char *str) +{ + UsbCommand c; + c.cmd = CMD_LF_SIMULATE_BIDIR; + c.ext1 = 47; /* Set ADC to twice the carrier for a slight supersampling */ + c.ext2 = 384; + SendCommand(&c, FALSE); +} + static void CmdLoread(char *str) { UsbCommand c; @@ -1395,45 +1406,6 @@ static void CmdHi15demod(char *str) PrintToScrollback("CRC=%04x", Iso15693Crc(outBuf, k-2)); } -static void CmdTiread(char *str) -{ - UsbCommand c; - c.cmd = CMD_ACQUIRE_RAW_BITS_TI_TYPE; - SendCommand(&c, FALSE); -} - -static void CmdTibits(char *str) -{ - int cnt = 0; - int i; -// for(i = 0; i < 1536; i += 12) { - for(i = 0; i < 4000; i += 12) { - UsbCommand c; - c.cmd = CMD_DOWNLOAD_RAW_BITS_TI_TYPE; - c.ext1 = i; - SendCommand(&c, FALSE); - ReceiveCommand(&c); - if(c.cmd != CMD_DOWNLOADED_RAW_BITS_TI_TYPE) { - PrintToScrollback("bad resp"); - return; - } - int j; - for(j = 0; j < 12; j++) { - int k; - for(k = 31; k >= 0; k--) { - if(c.d.asDwords[j] & (1 << k)) { - GraphBuffer[cnt++] = 1; - } else { - GraphBuffer[cnt++] = -1; - } - } - } - } -// GraphTraceLen = 1536*32; - GraphTraceLen = 4000*32; - RepaintGraphWindow(); -} - static void CmdFSKdemod(char *cmdline) { static const int LowTone[] = { @@ -1452,13 +1424,13 @@ static void CmdFSKdemod(char *cmdline) 1, 1, 1, 1, -1, -1, -1, -1, -1, }; - int convLen = max(arraylen(HighTone), arraylen(LowTone)); + int lowLen = sizeof(LowTone)/sizeof(int); + int highLen = sizeof(HighTone)/sizeof(int); + int convLen = (highLen>lowLen)?highLen:lowLen; DWORD hi = 0, lo = 0; int i, j; int minMark=0, maxMark=0; - int lowLen = arraylen(LowTone); - int highLen = arraylen(HighTone); for(i = 0; i < GraphTraceLen - convLen; i++) { int lowSum = 0, highSum = 0; @@ -1497,10 +1469,10 @@ static void CmdFSKdemod(char *cmdline) int max = 0, maxPos = 0; for(i = 0; i < 6000; i++) { int dec = 0; - for(j = 0; j < 3*arraylen(LowTone); j++) { + for(j = 0; j < 3*lowLen; j++) { dec -= GraphBuffer[i+j]; } - for(; j < 3*(arraylen(LowTone) + arraylen(HighTone) ); j++) { + for(; j < 3*(lowLen + highLen ); j++) { dec += GraphBuffer[i+j]; } if(dec > max) { @@ -1520,7 +1492,7 @@ static void CmdFSKdemod(char *cmdline) GraphBuffer[maxPos+1] = minMark; PrintToScrollback("actual data bits start at sample %d", maxPos); - PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone)); + PrintToScrollback("length %d/%d", highLen, lowLen); BYTE bits[46]; bits[sizeof(bits)-1] = '\0'; @@ -1528,10 +1500,10 @@ static void CmdFSKdemod(char *cmdline) // find bit pairs and manchester decode them for(i = 0; i < arraylen(bits)-1; i++) { int dec = 0; - for(j = 0; j < arraylen(LowTone); j++) { + for(j = 0; j < lowLen; j++) { dec -= GraphBuffer[maxPos+j]; } - for(; j < arraylen(LowTone) + arraylen(HighTone); j++) { + for(; j < lowLen + highLen; j++) { dec += GraphBuffer[maxPos+j]; } maxPos += j; @@ -1554,7 +1526,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 the data as two hex strings, optionally the CRC as a third"); + else + SendCommand(&c, FALSE); +} + +static void CmdTIDemod(char *cmdline) { /* MATLAB as follows: f_s = 2000000; % sampling frequency @@ -1570,52 +1565,57 @@ h = 2*pi*ones(1, floor(f_s*T_h))*(f_h/f_s); l = sign(sin(cumsum(l))); h = sign(sin(cumsum(h))); */ + +// 2M*16/134.2k = 238 static const int LowTone[] = { - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1 }; +// 2M*16/123.2k = 260 static const int HighTone[] = { - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1 }; - - int convLen = max(arraylen(HighTone), arraylen(LowTone)); + int lowLen = sizeof(LowTone)/sizeof(int); + int highLen = sizeof(HighTone)/sizeof(int); + int convLen = (highLen>lowLen)?highLen:lowLen; WORD crc; - int i, TagType; + int i, j, TagType; + int lowSum = 0, highSum = 0;; + int lowTot = 0, highTot = 0; + for(i = 0; i < GraphTraceLen - convLen; i++) { - int j; - int lowSum = 0, highSum = 0;; - int lowLen = arraylen(LowTone); - int highLen = arraylen(HighTone); + lowSum = 0; + highSum = 0;; for(j = 0; j < lowLen; j++) { lowSum += LowTone[j]*GraphBuffer[i+j]; @@ -1625,12 +1625,15 @@ h = sign(sin(cumsum(h))); } lowSum = abs((100*lowSum) / lowLen); highSum = abs((100*highSum) / highLen); + lowSum = (lowSum<0)?-lowSum:lowSum; + highSum = (highSum<0)?-highSum:highSum; + GraphBuffer[i] = (highSum << 16) | lowSum; } for(i = 0; i < GraphTraceLen - convLen - 16; i++) { - int j; - int lowTot = 0, highTot = 0; + lowTot = 0; + highTot = 0; // 16 and 15 are f_s divided by f_l and f_h, rounded for(j = 0; j < 16; j++) { lowTot += (GraphBuffer[i+j] & 0xffff); @@ -1663,11 +1666,11 @@ h = sign(sin(cumsum(h))); int j; int dec = 0; // searching 17 consecutive lows - for(j = 0; j < 17*arraylen(LowTone); j++) { + for(j = 0; j < 17*lowLen; j++) { dec -= GraphBuffer[i+j]; } // searching 7 consecutive highs - for(; j < 17*arraylen(LowTone) + 6*arraylen(HighTone); j++) { + for(; j < 17*lowLen + 6*highLen; j++) { dec += GraphBuffer[i+j]; } if(dec > max) { @@ -1682,8 +1685,8 @@ h = sign(sin(cumsum(h))); GraphBuffer[maxPos+1] = -800; // advance pointer to start of actual data stream (after 16 pre and 8 start bits) - maxPos += 17*arraylen(LowTone); - maxPos += 6*arraylen(HighTone); + maxPos += 17*lowLen; + maxPos += 6*highLen; // place a marker in the buffer to visually aid location // of the end of sync @@ -1692,7 +1695,7 @@ h = sign(sin(cumsum(h))); PrintToScrollback("actual data bits start at sample %d", maxPos); - PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone)); + PrintToScrollback("length %d/%d", highLen, lowLen); BYTE bits[1+64+16+8+16]; bits[sizeof(bits)-1] = '\0'; @@ -1703,21 +1706,21 @@ h = sign(sin(cumsum(h))); int high = 0; int low = 0; int j; - for(j = 0; j < arraylen(LowTone); j++) { + for(j = 0; j < lowLen; j++) { low -= GraphBuffer[maxPos+j]; } - for(j = 0; j < arraylen(HighTone); j++) { + for(j = 0; j < highLen; j++) { high += GraphBuffer[maxPos+j]; } if(high > low) { bits[i] = '1'; - maxPos += arraylen(HighTone); + maxPos += highLen; // bitstream arrives lsb first so shift right shift3 |= (1<<31); } else { bits[i] = '.'; - maxPos += arraylen(LowTone); + maxPos += lowLen; } // 128 bit right shift register @@ -1754,9 +1757,13 @@ h = sign(sin(cumsum(h))); // align 16 bit "end bits" or "ident" into lower half of shift3 shift3 >>= 16; - if ( (shift3^shift0)&0xffff ) { + // 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); @@ -2734,6 +2741,13 @@ static void CmdReadmem(char *str) SendCommand(&c, FALSE); } +static void CmdVersion(char *str) +{ + UsbCommand c; + c.cmd = CMD_VERSION; + SendCommand(&c, FALSE); +} + static void CmdLcdReset(char *str) { UsbCommand c; @@ -2829,6 +2843,7 @@ static struct { {"loread", CmdLoread, 0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)"}, {"losamples", CmdLosamples, 0, "[128 - 16000] -- Get raw samples for LF tag"}, {"losim", CmdLosim, 0, "Simulate LF tag"}, + {"losimbidir", CmdLosimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, {"ltrim", CmdLtrim, 1, " -- Trim samples from left of trace"}, {"mandemod", Cmdmanchesterdemod, 1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"}, {"manmod", Cmdmanchestermod, 1, "[clock rate] -- Manchester modulate a binary stream"}, @@ -2841,12 +2856,13 @@ 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"}, + {"tidemod", CmdTIDemod, 1, "Demodulate raw bits for TI-type LF tag"}, + {"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"}, + {"version", CmdVersion, 0, "Show version inforation about the connected Proxmark"}, {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"}, };