mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
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:
parent
2c5ed70651
commit
db69363840
4 changed files with 88 additions and 47 deletions
|
@ -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){
|
|
||||||
if (g_debugMode){
|
|
||||||
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
|
|
||||||
PrintAndLog("PSK2 demoded bitstream:");
|
PrintAndLog("PSK2 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();
|
||||||
}
|
|
||||||
}else{
|
|
||||||
PrintAndLog("PSK2 demoded bitstream:");
|
|
||||||
// Now output the bitstream to the scrollback by line of 16 bits
|
|
||||||
printDemodBuff();
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]){
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue