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
This commit is contained in:
iceman1001 2015-03-14 08:43:48 +01:00
commit db69363840
4 changed files with 88 additions and 47 deletions

View file

@ -1647,7 +1647,7 @@ int PSKDemod(const char *Cmd, bool verbose)
} }
if (invert != 0 && invert != 1) { if (invert != 0 && invert != 1) {
if (verbose) PrintAndLog("Invalid argument: %s", Cmd); if (verbose) PrintAndLog("Invalid argument: %s", Cmd);
return -1; return 0;
} }
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
size_t BitLen = getFromGraphBuf(BitStream); size_t BitLen = getFromGraphBuf(BitStream);
@ -1655,22 +1655,27 @@ int PSKDemod(const char *Cmd, bool verbose)
uint8_t carrier=countPSK_FC(BitStream, BitLen); uint8_t carrier=countPSK_FC(BitStream, BitLen);
if (carrier!=2 && carrier!=4 && carrier!=8){ if (carrier!=2 && carrier!=4 && carrier!=8){
//invalid carrier //invalid carrier
return -1; return 0;
} }
int errCnt=0; int errCnt=0;
errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert); errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert);
if (errCnt > maxErr){ 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); 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 (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); 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 //prime demod buffer for output
setDemodBuf(BitStream,BitLen,0); setDemodBuf(BitStream,BitLen,0);
return errCnt; return 1;
} }
// Indala 26 bit decode // Indala 26 bit decode
@ -1685,7 +1690,7 @@ int CmdIndalaDecode(const char *Cmd)
ans = PSKDemod("32", 0); ans = PSKDemod("32", 0);
} }
if (ans < 0){ if ( !ans ){
if (g_debugMode==1) if (g_debugMode==1)
PrintAndLog("Error1: %d",ans); PrintAndLog("Error1: %d",ans);
return 0; return 0;
@ -1827,7 +1832,7 @@ int CmdNRZrawDemod(const char *Cmd)
// prints binary found and saves in demodbuffer for further commands // prints binary found and saves in demodbuffer for further commands
int CmdPSK1rawDemod(const char *Cmd) int CmdPSK1rawDemod(const char *Cmd)
{ {
int errCnt; int ans;
char cmdp = param_getchar(Cmd, 0); char cmdp = param_getchar(Cmd, 0);
if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') { if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
PrintAndLog("Usage: data rawdemod p1 [clock] <0|1> [maxError]"); 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"); 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; return 0;
} }
errCnt = PSKDemod(Cmd, TRUE); ans = PSKDemod(Cmd, TRUE);
//output //output
if (errCnt<0){ if ( !ans){
if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); if (g_debugMode) PrintAndLog("Error demoding: %d",ans);
return 0; return 0;
} }
if (errCnt>0){
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
}
PrintAndLog("PSK demoded bitstream:"); PrintAndLog("PSK demoded bitstream:");
// Now output the bitstream to the scrollback by line of 16 bits // Now output the bitstream to the scrollback by line of 16 bits
printDemodBuff(); printDemodBuff();
@ -1861,7 +1863,7 @@ int CmdPSK1rawDemod(const char *Cmd)
// takes same args as cmdpsk1rawdemod // takes same args as cmdpsk1rawdemod
int CmdPSK2rawDemod(const char *Cmd) int CmdPSK2rawDemod(const char *Cmd)
{ {
int errCnt=0; int ans=0;
char cmdp = param_getchar(Cmd, 0); char cmdp = param_getchar(Cmd, 0);
if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') { if (strlen(Cmd) > 10 || cmdp == 'h' || cmdp == 'H') {
PrintAndLog("Usage: data rawdemod p2 [clock] <0|1> [maxError]"); 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"); 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; return 0;
} }
errCnt=PSKDemod(Cmd, TRUE); ans=PSKDemod(Cmd, TRUE);
if (errCnt<0){ if (!ans){
if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt); if (g_debugMode) PrintAndLog("Error demoding: %d",ans);
return 0; return 0;
} }
psk1TOpsk2(DemodBuffer, DemodBufferLen); psk1TOpsk2(DemodBuffer, DemodBufferLen);
if (errCnt>0){ PrintAndLog("PSK2 demoded bitstream:");
if (g_debugMode){ // Now output the bitstream to the scrollback by line of 16 bits
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); printDemodBuff();
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();
}
return 1; return 1;
} }

View file

@ -22,23 +22,23 @@
#include "data.h" #include "data.h"
#include "lfdemod.h" #include "lfdemod.h"
#include "../common/crc.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..) // Default configuration
#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits = t55xx_conf_block_t config = { .modulation = DEMOD_ASK, .inversed = FALSE, .offset = 0x00, .block0 = 0x00};
// Default configuration: ASK, not inversed.
t55xx_conf_block_t config = { .modulation = 2, .inversed = FALSE, .block0 = 0x00};
int usage_t55xx_config(){ int usage_t55xx_config(){
PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1]"); PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1] [o <offset>]");
PrintAndLog("Options: "); PrintAndLog("Options: ");
PrintAndLog(" h This help"); PrintAndLog(" h This help");
PrintAndLog(" d <FSK|ASK|PSK|NZ|BI> Set demodulation FSK / ASK / PSK / NZ / Biphase"); PrintAndLog(" d <FSK|ASK|PSK|NZ|BI> Set demodulation FSK / ASK / PSK / NZ / Biphase");
PrintAndLog(" i [1] Inverse data signal, defaults to normal"); PrintAndLog(" i [1] Inverse data signal, defaults to normal");
PrintAndLog(" o [offsett] Set offset, where data should start decode from in bitstream");
PrintAndLog(""); PrintAndLog("");
PrintAndLog("Examples:"); PrintAndLog("Examples:");
PrintAndLog(" lf t55xx config d FSK - FSK demodulation"); 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 - 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(""); PrintAndLog("");
return 0; return 0;
} }
@ -109,8 +109,13 @@ static int CmdHelp(const char *Cmd);
int CmdT55xxSetConfig(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 len = 0;
int foundModulation = 2; int foundModulation = 2;
uint8_t offset = 0;
bool inverse = FALSE; bool inverse = FALSE;
bool errors = FALSE; bool errors = FALSE;
uint8_t cmdp = 0; uint8_t cmdp = 0;
@ -146,6 +151,14 @@ int CmdT55xxSetConfig(const char *Cmd){
inverse = param_getchar(Cmd,cmdp+1) == '1'; inverse = param_getchar(Cmd,cmdp+1) == '1';
cmdp+=2; cmdp+=2;
break; 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: default:
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
errors = TRUE; errors = TRUE;
@ -163,6 +176,7 @@ int CmdT55xxSetConfig(const char *Cmd){
config.modulation = foundModulation; config.modulation = foundModulation;
config.inversed = inverse; config.inversed = inverse;
config.offset = offset;
config.block0 = 0; config.block0 = 0;
return 0; return 0;
} }
@ -320,13 +334,13 @@ bool tryDetectModulation(){
++hits; ++hits;
} }
if ( PSKDemod("0 0 1", FALSE) >= 0 && test()) { if ( PSKDemod("0 0 1", FALSE) && test()) {
tests[hits].modulation = DEMOD_PSK; tests[hits].modulation = DEMOD_PSK;
tests[hits].inversed = FALSE; tests[hits].inversed = FALSE;
++hits; ++hits;
} }
if ( PSKDemod("0 1 1", FALSE) >= 0 && test()) { if ( PSKDemod("0 1 1", FALSE) && test()) {
tests[hits].modulation = DEMOD_PSK; tests[hits].modulation = DEMOD_PSK;
tests[hits].inversed = TRUE; tests[hits].inversed = TRUE;
++hits; ++hits;
@ -384,22 +398,48 @@ bool test(){
void printT55xxBlock(const char *demodStr){ void printT55xxBlock(const char *demodStr){
uint32_t blockData = 0; uint32_t blockData = 0;
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00}; uint8_t bits[64] = {0x00};
if ( !DemodBufferLen) if ( !DemodBufferLen)
return; return;
int i =0; if ( config.offset > DemodBufferLen){
for (;i<DemodBufferLen;++i) 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]; bits[i]=DemodBuffer[i];
blockData = PackBits(1, 32, bits); blockData = PackBits(0, 32, bits);
PrintAndLog("0x%08X %s [%s]", blockData, sprint_bin(bits+1,32), demodStr); 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){ void printConfiguration( t55xx_conf_block_t b){
PrintAndLog("Modulation : %s", GetSelectedModulationStr(b.modulation) ); PrintAndLog("Modulation : %s", GetSelectedModulationStr(b.modulation) );
PrintAndLog("Inverted : %s", (b.inversed) ? "Yes" : "No" ); PrintAndLog("Inverted : %s", (b.inversed) ? "Yes" : "No" );
PrintAndLog("Offset : %d", b.offset);
PrintAndLog("Block0 : %08X", b.block0); PrintAndLog("Block0 : %08X", b.block0);
PrintAndLog(""); PrintAndLog("");
} }
@ -789,6 +829,7 @@ static command_t CommandTable[] =
{"trace", CmdT55xxReadTrace, 0, "[1] Show T55xx traceability data (page 1/ blk 0-1)"}, {"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)"}, {"info", CmdT55xxInfo, 0, "[1] Show T55xx configuration data (page 0/ blk 0)"},
{"dump", CmdT55xxDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"}, {"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} {NULL, NULL, 0, NULL}
}; };

View file

@ -19,6 +19,7 @@ typedef struct {
DEMOD_BI = 0x05, DEMOD_BI = 0x05,
} modulation; } modulation;
bool inversed; bool inversed;
uint8_t offset;
uint32_t block0; uint32_t block0;
} t55xx_conf_block_t; } t55xx_conf_block_t;
@ -42,4 +43,5 @@ void printConfiguration( t55xx_conf_block_t b);
void DecodeT55xxBlock(); void DecodeT55xxBlock();
bool tryDetectModulation(); bool tryDetectModulation();
bool test(); bool test();
int special(const char *Cmd);
#endif #endif

View file

@ -1079,7 +1079,10 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size)
size_t i=1; size_t i=1;
uint8_t lastBit=BitStream[0]; uint8_t lastBit=BitStream[0];
for (; i<size; i++){ for (; i<size; i++){
if (lastBit!=BitStream[i]){ if ( BitStream[i] == 77 ){
}
else if (lastBit!=BitStream[i]){
lastBit=BitStream[i]; lastBit=BitStream[i];
BitStream[i]=1; BitStream[i]=1;
} else { } else {
@ -1629,7 +1632,9 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
errCnt=0; errCnt=0;
size_t numBits=0; size_t numBits=0;
//PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit); //PrintAndLog("DEBUG: clk: %d, lastClkBit: %d", *clock, lastClkBit);
//set skipped bits
memset(dest+numBits, curPhase^1,firstFullWave / *clock);
numBits += (firstFullWave / *clock);
for (i = firstFullWave+fullWaveLen-1; i < *size-3; i++){ for (i = firstFullWave+fullWaveLen-1; i < *size-3; i++){
//top edge of wave = start of new wave //top edge of wave = start of new wave
if (dest[i]+fc < dest[i+1] && dest[i+1] >= dest[i+2]){ if (dest[i]+fc < dest[i+1] && dest[i+1] >= dest[i+2]){