mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
CHG: rename of methods to follow naming convention
CHG: LF T55XX CONFIG now defaults to ASK, non-inverse
This commit is contained in:
parent
108262a145
commit
33add18764
2 changed files with 162 additions and 64 deletions
|
@ -37,7 +37,7 @@ typedef struct {
|
||||||
} t55xx_conf_block_t;
|
} t55xx_conf_block_t;
|
||||||
|
|
||||||
// Default configuration: FSK, not inversed.
|
// Default configuration: FSK, not inversed.
|
||||||
t55xx_conf_block_t config = { .modulation = 0, .inversed = FALSE, .block0 = 0x00};
|
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]");
|
||||||
|
@ -105,6 +105,15 @@ int usage_t55xx_dump(){
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int usage_t55xx_detect(){
|
||||||
|
PrintAndLog("Usage: lf t55xx detect");
|
||||||
|
PrintAndLog("");
|
||||||
|
PrintAndLog("Examples:");
|
||||||
|
PrintAndLog(" lf t55xx detect");
|
||||||
|
PrintAndLog(" lf t55xx detect 1");
|
||||||
|
PrintAndLog("");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int CmdHelp(const char *Cmd);
|
static int CmdHelp(const char *Cmd);
|
||||||
|
|
||||||
|
@ -168,9 +177,8 @@ int CmdT55xxSetConfig(const char *Cmd){
|
||||||
config.block0 = 0;
|
config.block0 = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// detect configuration?
|
|
||||||
|
|
||||||
int CmdReadBlk(const char *Cmd)
|
int CmdT55xxReadBlock(const char *Cmd)
|
||||||
{
|
{
|
||||||
int block = -1;
|
int block = -1;
|
||||||
int password = 0xFFFFFFFF; //default to blank Block 7
|
int password = 0xFFFFFFFF; //default to blank Block 7
|
||||||
|
@ -209,54 +217,140 @@ int CmdReadBlk(const char *Cmd)
|
||||||
uint8_t got[12000];
|
uint8_t got[12000];
|
||||||
GetFromBigBuf(got,sizeof(got),0);
|
GetFromBigBuf(got,sizeof(got),0);
|
||||||
WaitForResponse(CMD_ACK,NULL);
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
|
|
||||||
setGraphBuf(got, 12000);
|
setGraphBuf(got, 12000);
|
||||||
|
|
||||||
if (block == 0){
|
DecodeT55xxBlock();
|
||||||
// try a detection.
|
PrintAndLog("FIRE");
|
||||||
}
|
printT55xxBlock("");
|
||||||
|
|
||||||
if (GetFskClock("", FALSE, FALSE)){ //wave is almost certainly FSK
|
|
||||||
// FSK
|
|
||||||
if ( FSKrawDemod("0 0", FALSE) && test())
|
|
||||||
printT55xx("FSK");
|
|
||||||
// FSK inverted
|
|
||||||
if ( FSKrawDemod("0 1", FALSE) && test())
|
|
||||||
printT55xx("FSK inv");
|
|
||||||
} else {
|
|
||||||
// ASK/MAN (autoclock, normal, maxerrors 1)
|
|
||||||
if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test())
|
|
||||||
printT55xx("ASK/MAN");
|
|
||||||
|
|
||||||
// ASK/MAN (autoclock, inverted, maxerrors 1)
|
|
||||||
if ( ASKmanDemod("0 1 1", FALSE, FALSE) && test())
|
|
||||||
printT55xx("ASK/MAN Inv");
|
|
||||||
|
|
||||||
// NZR (autoclock, normal, maxerrors 1)
|
|
||||||
if ( NRZrawDemod("0 0 1", FALSE) && test())
|
|
||||||
printT55xx("NZR");
|
|
||||||
// NZR (autoclock, inverted, maxerrors 1)
|
|
||||||
if ( NRZrawDemod("0 1 1", FALSE) && test())
|
|
||||||
printT55xx("NZR inv");
|
|
||||||
|
|
||||||
// PSK (autoclock, normal, maxerrors 1)
|
|
||||||
if ( PSKDemod("0 0 1", FALSE) && test())
|
|
||||||
printT55xx("PSK");
|
|
||||||
|
|
||||||
// PSK (autoclock, inverted, maxerrors 1)
|
|
||||||
if ( PSKDemod("0 1 1", FALSE) && test())
|
|
||||||
printT55xx("PSK inv");
|
|
||||||
|
|
||||||
//PSK2?
|
|
||||||
|
|
||||||
// if (!BiphaseRawDecode("0",FALSE) && test())
|
|
||||||
// printT55xx("BIPHASE");
|
|
||||||
|
|
||||||
// if (!BiphaseRawDecode("1",FALSE) && test())
|
|
||||||
// printT55xx("BIPHASE inv");
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DecodeT55xxBlock(){
|
||||||
|
|
||||||
|
char buf[6] = {0x00};
|
||||||
|
char *cmdStr = buf;
|
||||||
|
|
||||||
|
// use the configuration
|
||||||
|
switch( config.modulation ){
|
||||||
|
case 1:
|
||||||
|
sprintf(cmdStr,"0 %d", config.inversed );
|
||||||
|
FSKrawDemod(cmdStr, FALSE);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
sprintf(cmdStr,"0 %d 1", config.inversed );
|
||||||
|
ASKmanDemod(cmdStr, FALSE, FALSE);
|
||||||
|
PrintAndLog("ice");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
sprintf(cmdStr,"0 %d 1", config.inversed );
|
||||||
|
PSKDemod(cmdStr, FALSE);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
sprintf(cmdStr,"0 %d 1", config.inversed );
|
||||||
|
NRZrawDemod(cmdStr, FALSE);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
//BiphaseRawDecode("0",FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int CmdT55xxDetect(const char *Cmd){
|
||||||
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
|
if (cmdp == 'h' || cmdp == 'H')
|
||||||
|
return usage_t55xx_detect();
|
||||||
|
|
||||||
|
// read block 0, Page 0. Configuration.
|
||||||
|
UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, 0, 0}};
|
||||||
|
c.d.asBytes[0] = 0x0;
|
||||||
|
|
||||||
|
//Password mode
|
||||||
|
// if ( res == 2 ) {
|
||||||
|
// c.arg[2] = password;
|
||||||
|
// c.d.asBytes[0] = 0x1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
SendCommand(&c);
|
||||||
|
if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
|
||||||
|
PrintAndLog("command execution time out");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t got[12000];
|
||||||
|
GetFromBigBuf(got,sizeof(got),0);
|
||||||
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
|
setGraphBuf(got, 12000);
|
||||||
|
|
||||||
|
tryDetectModulation();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// detect configuration?
|
||||||
|
bool tryDetectModulation(){
|
||||||
|
|
||||||
|
uint8_t hits = 0;
|
||||||
|
|
||||||
|
//IF true, the wave is almost certainly FSK
|
||||||
|
if (GetFskClock("", FALSE, FALSE)){
|
||||||
|
|
||||||
|
if ( FSKrawDemod("0 0", FALSE) && test()){
|
||||||
|
printT55xxBlock("FSK");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
if ( FSKrawDemod("0 1", FALSE) && test()) {
|
||||||
|
printT55xxBlock("FSK inv");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test()) {
|
||||||
|
printT55xxBlock("ASK/MAN");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ASKmanDemod("0 1 1", FALSE, FALSE) && test()) {
|
||||||
|
printT55xxBlock("ASK/MAN Inv");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( NRZrawDemod("0 0 1", FALSE) && test()) {
|
||||||
|
printT55xxBlock("NZR");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( NRZrawDemod("0 1 1", FALSE) && test()) {
|
||||||
|
printT55xxBlock("NZR inv");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( PSKDemod("0 0 1", FALSE) && test()) {
|
||||||
|
printT55xxBlock("PSK");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( PSKDemod("0 1 1", FALSE) && test()) {
|
||||||
|
printT55xxBlock("PSK inv");
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
//PSK2?
|
||||||
|
// if (!BiphaseRawDecode("0",FALSE) && test()) {
|
||||||
|
// printT55xx("BIPHASE");
|
||||||
|
//}
|
||||||
|
// if (!BiphaseRawDecode("1",FALSE) && test()) {
|
||||||
|
// printT55xx("BIPHASE inv");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
if ( hits == 1)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if ( hits > 1)
|
||||||
|
PrintAndLog("Found [%d] possible matches for modulation.",hits);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
bool test(){
|
bool test(){
|
||||||
|
|
||||||
if ( !DemodBufferLen)
|
if ( !DemodBufferLen)
|
||||||
|
@ -280,7 +374,7 @@ bool test(){
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printT55xx(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[MAX_GRAPH_TRACE_LEN] = {0x00};
|
||||||
|
@ -310,7 +404,7 @@ size = fskdemod(dest, size, 64, 1, 10, 8); // FSK2a RF/64
|
||||||
PSK1
|
PSK1
|
||||||
errCnt = pskRawDemod(bits, &bitlen, 32, 0);
|
errCnt = pskRawDemod(bits, &bitlen, 32, 0);
|
||||||
*/
|
*/
|
||||||
int CmdWriteBlk(const char *Cmd)
|
int CmdT55xxWriteBlock(const char *Cmd)
|
||||||
{
|
{
|
||||||
int block = 8; //default to invalid block
|
int block = 8; //default to invalid block
|
||||||
int data = 0xFFFFFFFF; //default to blank Block
|
int data = 0xFFFFFFFF; //default to blank Block
|
||||||
|
@ -351,7 +445,7 @@ int CmdWriteBlk(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdReadTrace(const char *Cmd)
|
int CmdT55xxReadTrace(const char *Cmd)
|
||||||
{
|
{
|
||||||
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
|
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
|
||||||
|
|
||||||
|
@ -431,7 +525,7 @@ int CmdReadTrace(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdInfo(const char *Cmd){
|
int CmdT55xxInfo(const char *Cmd){
|
||||||
/*
|
/*
|
||||||
Page 0 Block 0 Configuration data.
|
Page 0 Block 0 Configuration data.
|
||||||
Normal mode
|
Normal mode
|
||||||
|
@ -442,7 +536,7 @@ int CmdInfo(const char *Cmd){
|
||||||
if (cmdp == 'h' || cmdp == 'H') {
|
if (cmdp == 'h' || cmdp == 'H') {
|
||||||
return usage_t55xx_info();
|
return usage_t55xx_info();
|
||||||
} else {
|
} else {
|
||||||
CmdReadBlk("0");
|
CmdT55xxReadBlock("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
// config
|
// config
|
||||||
|
@ -492,7 +586,7 @@ int CmdInfo(const char *Cmd){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdDump(const char *Cmd){
|
int CmdT55xxDump(const char *Cmd){
|
||||||
|
|
||||||
char s[20] = {0x00};
|
char s[20] = {0x00};
|
||||||
uint8_t pwd[4] = {0x00};
|
uint8_t pwd[4] = {0x00};
|
||||||
|
@ -518,7 +612,7 @@ int CmdDump(const char *Cmd){
|
||||||
} else {
|
} else {
|
||||||
sprintf(s,"%d", i);
|
sprintf(s,"%d", i);
|
||||||
}
|
}
|
||||||
CmdReadBlk(s);
|
CmdT55xxReadBlock(s);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -636,11 +730,12 @@ static command_t CommandTable[] =
|
||||||
{
|
{
|
||||||
{"help", CmdHelp, 1, "This help"},
|
{"help", CmdHelp, 1, "This help"},
|
||||||
{"config", CmdT55xxSetConfig, 1, "Set T55XX config for modulation, inversed data"},
|
{"config", CmdT55xxSetConfig, 1, "Set T55XX config for modulation, inversed data"},
|
||||||
{"read", CmdReadBlk, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},
|
{"detect", CmdT55xxDetect, 0, "Try detecting the tag modulation from reading the configuration block."},
|
||||||
{"write", CmdWriteBlk, 0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},
|
{"read", CmdT55xxReadBlock, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},
|
||||||
{"trace", CmdReadTrace, 0, "[1] Read T55xx traceability data (page 1/ blk 0-1)"},
|
{"write", CmdT55xxWriteBlock,0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},
|
||||||
{"info", CmdInfo, 0, "[1] Read T55xx configuration data (page 0/ blk 0)"},
|
{"trace", CmdT55xxReadTrace, 0, "[1] Show T55xx traceability data (page 1/ blk 0-1)"},
|
||||||
{"dump", CmdDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},
|
{"info", CmdT55xxInfo, 0, "[1] Show T55xx configuration data (page 0/ blk 0)"},
|
||||||
|
{"dump", CmdT55xxDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},
|
||||||
{NULL, NULL, 0, NULL}
|
{NULL, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,15 +12,18 @@
|
||||||
|
|
||||||
int CmdLFT55XX(const char *Cmd);
|
int CmdLFT55XX(const char *Cmd);
|
||||||
int CmdT55xxSetConfig(const char *Cmd);
|
int CmdT55xxSetConfig(const char *Cmd);
|
||||||
int CmdReadBlk(const char *Cmd);
|
int CmdT55xxReadBlock(const char *Cmd);
|
||||||
int CmdWriteBlk(const char *Cmd);
|
int CmdT55xxWriteBlock(const char *Cmd);
|
||||||
int CmdReadTrace(const char *Cmd);
|
int CmdT55xxReadTrace(const char *Cmd);
|
||||||
int CmdInfo(const char *Cmd);
|
int CmdT55xxInfo(const char *Cmd);
|
||||||
|
int CmdT55xxDetect(const char *Cmd);
|
||||||
|
|
||||||
char * GetBitRateStr(uint32_t id);
|
char * GetBitRateStr(uint32_t id);
|
||||||
char * GetSaferStr(uint32_t id);
|
char * GetSaferStr(uint32_t id);
|
||||||
char * GetModulationStr( uint32_t id);
|
char * GetModulationStr( uint32_t id);
|
||||||
uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bitstream);
|
uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bitstream);
|
||||||
void printT55xx(const char *demodStr);
|
void printT55xxBlock(const char *demodStr);
|
||||||
|
void DecodeT55xxBlock();
|
||||||
|
bool tryDetectModulation();
|
||||||
bool test();
|
bool test();
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue