} t55xx_conf_block_t;\r
\r
// Default configuration: FSK, not inversed.\r
-t55xx_conf_block_t config = { .modulation = 0, .inversed = FALSE, .block0 = 0x00};\r
+t55xx_conf_block_t config = { .modulation = 2, .inversed = FALSE, .block0 = 0x00};\r
\r
int usage_t55xx_config(){\r
PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1]");\r
PrintAndLog("");\r
return 0;\r
}\r
+int usage_t55xx_detect(){\r
+ PrintAndLog("Usage: lf t55xx detect");\r
+ PrintAndLog("");\r
+ PrintAndLog("Examples:");\r
+ PrintAndLog(" lf t55xx detect");\r
+ PrintAndLog(" lf t55xx detect 1");\r
+ PrintAndLog("");\r
+ return 0;\r
+}\r
\r
static int CmdHelp(const char *Cmd);\r
\r
config.block0 = 0;\r
return 0;\r
}\r
-// detect configuration?\r
\r
-int CmdReadBlk(const char *Cmd)\r
+int CmdT55xxReadBlock(const char *Cmd)\r
{\r
int block = -1;\r
int password = 0xFFFFFFFF; //default to blank Block 7\r
uint8_t got[12000];\r
GetFromBigBuf(got,sizeof(got),0);\r
WaitForResponse(CMD_ACK,NULL);\r
-\r
setGraphBuf(got, 12000);\r
\r
- if (block == 0){\r
- // try a detection. \r
+ DecodeT55xxBlock();\r
+ PrintAndLog("FIRE");\r
+ printT55xxBlock("");\r
+\r
+ return 0;\r
+}\r
+\r
+void DecodeT55xxBlock(){\r
+ \r
+ char buf[6] = {0x00};\r
+ char *cmdStr = buf;\r
+\r
+ // use the configuration\r
+ switch( config.modulation ){\r
+ case 1:\r
+ sprintf(cmdStr,"0 %d", config.inversed );\r
+ FSKrawDemod(cmdStr, FALSE);\r
+ break;\r
+ case 2:\r
+ sprintf(cmdStr,"0 %d 1", config.inversed );\r
+ ASKmanDemod(cmdStr, FALSE, FALSE);\r
+ PrintAndLog("ice");\r
+ break;\r
+ case 3:\r
+ sprintf(cmdStr,"0 %d 1", config.inversed );\r
+ PSKDemod(cmdStr, FALSE);\r
+ break;\r
+ case 4:\r
+ sprintf(cmdStr,"0 %d 1", config.inversed );\r
+ NRZrawDemod(cmdStr, FALSE);\r
+ break;\r
+ case 5:\r
+ //BiphaseRawDecode("0",FALSE);\r
+ break;\r
+ default:\r
+ return;\r
+ }\r
+}\r
+\r
+int CmdT55xxDetect(const char *Cmd){\r
+ char cmdp = param_getchar(Cmd, 0);\r
+ if (cmdp == 'h' || cmdp == 'H')\r
+ return usage_t55xx_detect();\r
+ \r
+ // read block 0, Page 0. Configuration.\r
+ UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, 0, 0}};\r
+ c.d.asBytes[0] = 0x0; \r
+\r
+ //Password mode\r
+ // if ( res == 2 ) {\r
+ // c.arg[2] = password;\r
+ // c.d.asBytes[0] = 0x1; \r
+ // }\r
+\r
+ SendCommand(&c);\r
+ if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {\r
+ PrintAndLog("command execution time out");\r
+ return FALSE;\r
}\r
\r
- if (GetFskClock("", FALSE, FALSE)){ //wave is almost certainly FSK\r
- // FSK\r
- if ( FSKrawDemod("0 0", FALSE) && test())\r
- printT55xx("FSK");\r
- // FSK inverted\r
- if ( FSKrawDemod("0 1", FALSE) && test()) \r
- printT55xx("FSK inv");\r
+ uint8_t got[12000];\r
+ GetFromBigBuf(got,sizeof(got),0);\r
+ WaitForResponse(CMD_ACK,NULL);\r
+ setGraphBuf(got, 12000);\r
+ \r
+ tryDetectModulation();\r
+ return 0;\r
+}\r
+\r
+// detect configuration?\r
+bool tryDetectModulation(){\r
+ \r
+ uint8_t hits = 0;\r
+ \r
+ //IF true, the wave is almost certainly FSK\r
+ if (GetFskClock("", FALSE, FALSE)){ \r
+\r
+ if ( FSKrawDemod("0 0", FALSE) && test()){\r
+ printT55xxBlock("FSK");\r
+ ++hits;\r
+ }\r
+ if ( FSKrawDemod("0 1", FALSE) && test()) {\r
+ printT55xxBlock("FSK inv");\r
+ ++hits;\r
+ }\r
} else {\r
- // ASK/MAN (autoclock, normal, maxerrors 1)\r
- if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test()) \r
- printT55xx("ASK/MAN");\r
- \r
- // ASK/MAN (autoclock, inverted, maxerrors 1)\r
- if ( ASKmanDemod("0 1 1", FALSE, FALSE) && test()) \r
- printT55xx("ASK/MAN Inv");\r
-\r
- // NZR (autoclock, normal, maxerrors 1)\r
- if ( NRZrawDemod("0 0 1", FALSE) && test()) \r
- printT55xx("NZR");\r
- // NZR (autoclock, inverted, maxerrors 1)\r
- if ( NRZrawDemod("0 1 1", FALSE) && test()) \r
- printT55xx("NZR inv");\r
+ if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test()) {\r
+ printT55xxBlock("ASK/MAN");\r
+ ++hits;\r
+ }\r
+\r
+ if ( ASKmanDemod("0 1 1", FALSE, FALSE) && test()) {\r
+ printT55xxBlock("ASK/MAN Inv");\r
+ ++hits;\r
+ }\r
\r
- // PSK (autoclock, normal, maxerrors 1)\r
- if ( PSKDemod("0 0 1", FALSE) && test()) \r
- printT55xx("PSK");\r
+ if ( NRZrawDemod("0 0 1", FALSE) && test()) {\r
+ printT55xxBlock("NZR");\r
+ ++hits;\r
+ }\r
\r
- // PSK (autoclock, inverted, maxerrors 1)\r
- if ( PSKDemod("0 1 1", FALSE) && test()) \r
- printT55xx("PSK inv");\r
+ if ( NRZrawDemod("0 1 1", FALSE) && test()) {\r
+ printT55xxBlock("NZR inv");\r
+ ++hits;\r
+ }\r
\r
- //PSK2?\r
+ if ( PSKDemod("0 0 1", FALSE) && test()) {\r
+ printT55xxBlock("PSK");\r
+ ++hits;\r
+ }\r
\r
- // if (!BiphaseRawDecode("0",FALSE) && test()) \r
+ if ( PSKDemod("0 1 1", FALSE) && test()) {\r
+ printT55xxBlock("PSK inv");\r
+ ++hits;\r
+ }\r
+ //PSK2?\r
+ // if (!BiphaseRawDecode("0",FALSE) && test()) {\r
// printT55xx("BIPHASE");\r
- \r
- // if (!BiphaseRawDecode("1",FALSE) && test()) \r
+ //}\r
+ // if (!BiphaseRawDecode("1",FALSE) && test()) {\r
// printT55xx("BIPHASE inv");\r
- }\r
- return 0;\r
+ // }\r
+ } \r
+ if ( hits == 1) \r
+ return TRUE;\r
+ \r
+ if ( hits > 1)\r
+ PrintAndLog("Found [%d] possible matches for modulation.",hits);\r
+\r
+ return FALSE;\r
}\r
+\r
bool test(){\r
\r
if ( !DemodBufferLen) \r
return FALSE;\r
}\r
\r
-void printT55xx(const char *demodStr){\r
+void printT55xxBlock(const char *demodStr){\r
\r
uint32_t blockData = 0;\r
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};\r
bits[i]=DemodBuffer[i];\r
\r
blockData = PackBits(1, 32, bits);\r
- PrintAndLog("0x%08X %s [%s]", blockData, sprint_bin(bits+1,32), demodStr );\r
+ PrintAndLog("0x%08X %s [%s]", blockData, sprint_bin(bits+1,32), demodStr);\r
}\r
\r
/*\r
PSK1\r
errCnt = pskRawDemod(bits, &bitlen, 32, 0);\r
*/\r
-int CmdWriteBlk(const char *Cmd)\r
+int CmdT55xxWriteBlock(const char *Cmd)\r
{\r
int block = 8; //default to invalid block\r
int data = 0xFFFFFFFF; //default to blank Block \r
return 0;\r
}\r
\r
-int CmdReadTrace(const char *Cmd)\r
+int CmdT55xxReadTrace(const char *Cmd)\r
{\r
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};\r
\r
return 0;\r
}\r
\r
-int CmdInfo(const char *Cmd){\r
+int CmdT55xxInfo(const char *Cmd){\r
/*\r
Page 0 Block 0 Configuration data.\r
Normal mode\r
if (cmdp == 'h' || cmdp == 'H') {\r
return usage_t55xx_info();\r
} else {\r
- CmdReadBlk("0");\r
+ CmdT55xxReadBlock("0");\r
} \r
\r
// config\r
return 0;\r
}\r
\r
-int CmdDump(const char *Cmd){\r
+int CmdT55xxDump(const char *Cmd){\r
\r
char s[20] = {0x00};\r
uint8_t pwd[4] = {0x00};\r
} else {\r
sprintf(s,"%d", i);\r
}\r
- CmdReadBlk(s);\r
+ CmdT55xxReadBlock(s);\r
}\r
return 0;\r
}\r
{\r
{"help", CmdHelp, 1, "This help"},\r
{"config", CmdT55xxSetConfig, 1, "Set T55XX config for modulation, inversed data"},\r
- {"read", CmdReadBlk, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},\r
- {"write", CmdWriteBlk, 0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},\r
- {"trace", CmdReadTrace, 0, "[1] Read T55xx traceability data (page 1/ blk 0-1)"},\r
- {"info", CmdInfo, 0, "[1] Read T55xx configuration data (page 0/ blk 0)"},\r
- {"dump", CmdDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},\r
+ {"detect", CmdT55xxDetect, 0, "Try detecting the tag modulation from reading the configuration block."},\r
+ {"read", CmdT55xxReadBlock, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},\r
+ {"write", CmdT55xxWriteBlock,0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},\r
+ {"trace", CmdT55xxReadTrace, 0, "[1] Show T55xx traceability data (page 1/ blk 0-1)"},\r
+ {"info", CmdT55xxInfo, 0, "[1] Show T55xx configuration data (page 0/ blk 0)"},\r
+ {"dump", CmdT55xxDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},\r
{NULL, NULL, 0, NULL}\r
};\r
\r