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 (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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 <demodulation>] [i 1]");
|
||||
PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1] [o <offset>]");
|
||||
PrintAndLog("Options: ");
|
||||
PrintAndLog(" h This help");
|
||||
PrintAndLog(" d <FSK|ASK|PSK|NZ|BI> 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;++i)
|
||||
if ( config.offset > 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}
|
||||
};
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1079,7 +1079,10 @@ void psk1TOpsk2(uint8_t *BitStream, size_t size)
|
|||
size_t i=1;
|
||||
uint8_t lastBit=BitStream[0];
|
||||
for (; i<size; i++){
|
||||
if (lastBit!=BitStream[i]){
|
||||
if ( BitStream[i] == 77 ){
|
||||
|
||||
}
|
||||
else if (lastBit!=BitStream[i]){
|
||||
lastBit=BitStream[i];
|
||||
BitStream[i]=1;
|
||||
} else {
|
||||
|
@ -1629,7 +1632,9 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
|
|||
errCnt=0;
|
||||
size_t numBits=0;
|
||||
//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++){
|
||||
//top edge of wave = start of new wave
|
||||
if (dest[i]+fc < dest[i+1] && dest[i+1] >= dest[i+2]){
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue