From db69363840b12d68566d7be2de512bf4c7c51b4e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Mar 2015 08:43:48 +0100 Subject: [PATCH] ADD: started to add a offset possibility for the LF T55XX. Ie. lf t55xx read 0 lf t55xx special lf t55xx config o 2 lf t55xx read 0 ADD: added @marshmellows latest changes to psk --- client/cmddata.c | 53 +++++++++++++++------------------ client/cmdlft55xx.c | 71 +++++++++++++++++++++++++++++++++++---------- client/cmdlft55xx.h | 2 ++ common/lfdemod.c | 9 ++++-- 4 files changed, 88 insertions(+), 47 deletions(-) diff --git a/client/cmddata.c b/client/cmddata.c index cea3bcfe..9b88d832 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -1647,7 +1647,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); @@ -1655,22 +1655,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 @@ -1685,7 +1690,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; @@ -1827,7 +1832,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]"); @@ -1842,15 +1847,12 @@ 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(); @@ -1861,7 +1863,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]"); @@ -1876,24 +1878,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; } diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c index aec47dc0..2a77ebcb 100644 --- a/client/cmdlft55xx.c +++ b/client/cmdlft55xx.c @@ -22,23 +22,23 @@ #include "data.h" #include "lfdemod.h" #include "../common/crc.h" +#include "../common/iso14443crc.h" -#define LF_TRACE_BUFF_SIZE 20000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..) -#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits = - -// Default configuration: ASK, not inversed. -t55xx_conf_block_t config = { .modulation = 2, .inversed = FALSE, .block0 = 0x00}; +// Default configuration +t55xx_conf_block_t config = { .modulation = DEMOD_ASK, .inversed = FALSE, .offset = 0x00, .block0 = 0x00}; int usage_t55xx_config(){ - PrintAndLog("Usage: lf t55xx config [d ] [i 1]"); + PrintAndLog("Usage: lf t55xx config [d ] [i 1] [o ]"); PrintAndLog("Options: "); PrintAndLog(" h This help"); PrintAndLog(" d Set demodulation FSK / ASK / PSK / NZ / Biphase"); PrintAndLog(" i [1] Inverse data signal, defaults to normal"); + PrintAndLog(" o [offsett] Set offset, where data should start decode from in bitstream"); PrintAndLog(""); PrintAndLog("Examples:"); - PrintAndLog(" lf t55xx config d FSK - FSK demodulation"); - PrintAndLog(" lf t55xx config d FSK i 1 - FSK demodulation, inverse data"); + PrintAndLog(" lf t55xx config d FSK - FSK demodulation"); + PrintAndLog(" lf t55xx config d FSK i 1 - FSK demodulation, inverse data"); + PrintAndLog(" lf t55xx config d FSK i 1 o 3 - FSK demodulation, inverse data, offset=3,start from bitpos 3 to decode data"); PrintAndLog(""); return 0; } @@ -109,8 +109,13 @@ static int CmdHelp(const char *Cmd); int CmdT55xxSetConfig(const char *Cmd){ + uint8_t data[] = {0x78,0x00,0x00,0x00,0x00,0x00,0x00}; + uint8_t cmd[] = {0x00,0x00}; + ComputeCrc14443(CRC_14443_B, data, 7 , &cmd[0], &cmd[1]); + PrintAndLog("%02X %02X",cmd[0], cmd[1]); int len = 0; int foundModulation = 2; + uint8_t offset = 0; bool inverse = FALSE; bool errors = FALSE; uint8_t cmdp = 0; @@ -146,6 +151,14 @@ int CmdT55xxSetConfig(const char *Cmd){ inverse = param_getchar(Cmd,cmdp+1) == '1'; cmdp+=2; break; + case 'o': + errors |= param_getdec(Cmd, cmdp+1,&offset); + if ( offset >= 32 ){ + PrintAndLog("Offset must be smaller than 32"); + errors = TRUE; + } + cmdp+=2; + break; default: PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = TRUE; @@ -163,6 +176,7 @@ int CmdT55xxSetConfig(const char *Cmd){ config.modulation = foundModulation; config.inversed = inverse; + config.offset = offset; config.block0 = 0; return 0; } @@ -320,13 +334,13 @@ bool tryDetectModulation(){ ++hits; } - if ( PSKDemod("0 0 1", FALSE) >= 0 && test()) { + if ( PSKDemod("0 0 1", FALSE) && test()) { tests[hits].modulation = DEMOD_PSK; tests[hits].inversed = FALSE; ++hits; } - if ( PSKDemod("0 1 1", FALSE) >= 0 && test()) { + if ( PSKDemod("0 1 1", FALSE) && test()) { tests[hits].modulation = DEMOD_PSK; tests[hits].inversed = TRUE; ++hits; @@ -384,22 +398,48 @@ bool test(){ void printT55xxBlock(const char *demodStr){ uint32_t blockData = 0; - uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00}; + uint8_t bits[64] = {0x00}; if ( !DemodBufferLen) return; - int i =0; - for (;i DemodBufferLen){ + PrintAndLog("The configured offset is to big. (%d > %d)", config.offset, DemodBufferLen); + return; + } + + int i = config.offset; + int pos = 32 + config.offset; + for (; i < pos; ++i) bits[i]=DemodBuffer[i]; - blockData = PackBits(1, 32, bits); - PrintAndLog("0x%08X %s [%s]", blockData, sprint_bin(bits+1,32), demodStr); + blockData = PackBits(0, 32, bits); + PrintAndLog("0x%08X %s [%s]", blockData, sprint_bin(bits,32), demodStr); +} + +int special(const char *Cmd) { + uint32_t blockData = 0; + uint8_t bits[64] = {0x00}; + + PrintAndLog("[OFFSET] [DATA] [BINARY]"); + PrintAndLog("----------------------------------------------------"); + int i,j = 0; + for (; j < 32; ++j){ + + for (i = 0; i < 32; ++i) + bits[i]=DemodBuffer[j+i]; + + blockData = PackBits(0, 32, bits); + PrintAndLog("[%d] 0x%08X %s",j , blockData, sprint_bin(bits,32)); + } + + return 0; } void printConfiguration( t55xx_conf_block_t b){ PrintAndLog("Modulation : %s", GetSelectedModulationStr(b.modulation) ); PrintAndLog("Inverted : %s", (b.inversed) ? "Yes" : "No" ); + PrintAndLog("Offset : %d", b.offset); PrintAndLog("Block0 : %08X", b.block0); PrintAndLog(""); } @@ -789,6 +829,7 @@ static command_t CommandTable[] = {"trace", CmdT55xxReadTrace, 0, "[1] Show T55xx traceability data (page 1/ blk 0-1)"}, {"info", CmdT55xxInfo, 0, "[1] Show T55xx configuration data (page 0/ blk 0)"}, {"dump", CmdT55xxDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"}, + {"special", special, 0, "Shows how a datablock changes with 32 different offsets"}, {NULL, NULL, 0, NULL} }; diff --git a/client/cmdlft55xx.h b/client/cmdlft55xx.h index 9362c9f4..e4eca17c 100644 --- a/client/cmdlft55xx.h +++ b/client/cmdlft55xx.h @@ -19,6 +19,7 @@ typedef struct { DEMOD_BI = 0x05, } modulation; bool inversed; + uint8_t offset; uint32_t block0; } t55xx_conf_block_t; @@ -42,4 +43,5 @@ void printConfiguration( t55xx_conf_block_t b); void DecodeT55xxBlock(); bool tryDetectModulation(); bool test(); +int special(const char *Cmd); #endif diff --git a/common/lfdemod.c b/common/lfdemod.c index a42566ad..a14f2613 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -1079,7 +1079,10 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size) size_t i=1; uint8_t lastBit=BitStream[0]; for (; i= dest[i+2]){ -- 2.39.2