ADD: @marshmellow42 's fixes for Q5, t55xx, fskclock,

ADD:  got tired of always writing wrong "hf 14a list",  so I hooked it back up to call the "hf list" with argument. Things becomes smoother that way.
This commit is contained in:
iceman1001 2015-12-16 11:01:46 +01:00
parent 2b1f4228c2
commit 9332b857ff
10 changed files with 104 additions and 112 deletions

View file

@ -400,7 +400,7 @@ void SimulateTagLowFrequency(int period, int gap, int ledcontrol)
for(;;) { for(;;) {
//wait until SSC_CLK goes HIGH //wait until SSC_CLK goes HIGH
while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) { while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
if(BUTTON_PRESS() || usb_poll_validate_length() ) { if(BUTTON_PRESS() || !usb_poll_validate_length() ) {
DbpString("Stopped"); DbpString("Stopped");
return; return;
} }
@ -417,7 +417,7 @@ void SimulateTagLowFrequency(int period, int gap, int ledcontrol)
//wait until SSC_CLK goes LOW //wait until SSC_CLK goes LOW
while(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK) { while(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK) {
if( BUTTON_PRESS() || usb_poll_validate_length() ) { if( BUTTON_PRESS() || !usb_poll_validate_length() ) {
DbpString("Stopped"); DbpString("Stopped");
return; return;
} }

View file

@ -1043,7 +1043,7 @@ void MifareEMemClr(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){ void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
FpgaDownloadAndGo(FPGA_BITSTREAM_HF); FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
//emlSetMem(datain, arg0, arg1); // data, block num, blocks count if (arg2==0) arg2 = 16; // backwards compat... default bytewidth
emlSetMem_xt(datain, arg0, arg1, arg2); // data, block num, blocks count, block byte width emlSetMem_xt(datain, arg0, arg1, arg2); // data, block num, blocks count, block byte width
} }
@ -1187,8 +1187,8 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) { if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");
OnErrorMagic(MAGIC_UID); OnErrorMagic(MAGIC_UID);
}; }
}; }
// wipe tag, fill it with zeros // wipe tag, fill it with zeros
if (workFlags & MAGIC_WIPE){ if (workFlags & MAGIC_WIPE){
@ -1196,14 +1196,14 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
OnErrorMagic(MAGIC_WIPE); OnErrorMagic(MAGIC_WIPE);
}; }
ReaderTransmit(wipeC, sizeof(wipeC), NULL); ReaderTransmit(wipeC, sizeof(wipeC), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wipeC error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wipeC error");
OnErrorMagic(MAGIC_WIPE); OnErrorMagic(MAGIC_WIPE);
}; }
}; }
// write block // write block
if (workFlags & MAGIC_WUPC) { if (workFlags & MAGIC_WUPC) {
@ -1211,19 +1211,19 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
OnErrorMagic(MAGIC_WUPC); OnErrorMagic(MAGIC_WUPC);
}; }
ReaderTransmit(wupC2, sizeof(wupC2), NULL); ReaderTransmit(wupC2, sizeof(wupC2), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");
OnErrorMagic(MAGIC_WUPC); OnErrorMagic(MAGIC_WUPC);
}; }
} }
if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) { if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send command error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send command error");
OnErrorMagic(4); OnErrorMagic(4);
}; }
memcpy(data, datain, 16); memcpy(data, datain, 16);
AppendCrc14443a(data, 16); AppendCrc14443a(data, 16);
@ -1232,7 +1232,7 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) { if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send data error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send data error");
OnErrorMagic(0); OnErrorMagic(0);
}; }
if (workFlags & MAGIC_OFF) if (workFlags & MAGIC_OFF)
mifare_classic_halt_ex(NULL); mifare_classic_halt_ex(NULL);
@ -1271,20 +1271,20 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
OnErrorMagic(MAGIC_WUPC); OnErrorMagic(MAGIC_WUPC);
}; }
ReaderTransmit(wupC2, sizeof(wupC2), NULL); ReaderTransmit(wupC2, sizeof(wupC2), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");
OnErrorMagic(MAGIC_WUPC); OnErrorMagic(MAGIC_WUPC);
}; }
} }
// read block // read block
if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) { if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");
OnErrorMagic(0); OnErrorMagic(0);
}; }
memcpy(data, receivedAnswer, sizeof(data)); memcpy(data, receivedAnswer, sizeof(data));
@ -1309,19 +1309,19 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
void MifareCIdent(){ void MifareCIdent(){
// variables // variables
byte_t isOK = 1; bool isOK = true;
uint8_t receivedAnswer[1]; uint8_t receivedAnswer[1];
uint8_t receivedAnswerPar[1]; uint8_t receivedAnswerPar[1];
ReaderTransmitBitsPar(wupC1,7,0, NULL); ReaderTransmitBitsPar(wupC1,7,0, NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
isOK = 0; isOK = false;
}; }
ReaderTransmit(wupC2, sizeof(wupC2), NULL); ReaderTransmit(wupC2, sizeof(wupC2), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
isOK = 0; isOK = false;
}; }
// removed the if, since some magic tags misbehavies and send an answer to it. // removed the if, since some magic tags misbehavies and send an answer to it.
mifare_classic_halt(NULL, 0); mifare_classic_halt(NULL, 0);

View file

@ -947,11 +947,10 @@ int FSKrawDemod(const char *Cmd, bool verbose)
//set defaults //set defaults
//set options from parameters entered with the command //set options from parameters entered with the command
rfLen = param_get8ex(Cmd, 0, 0, 10); rfLen = param_get8(Cmd, 0);
invert = param_get8ex(Cmd, 1, 0, 10); invert = param_get8(Cmd, 1);
fchigh = param_get8ex(Cmd, 2, 0, 10); fchigh = param_get8(Cmd, 2);
fclow = param_get8ex(Cmd, 3, 0, 10); fclow = param_get8(Cmd, 3);
if (strlen(Cmd)>0 && strlen(Cmd)<=2) { if (strlen(Cmd)>0 && strlen(Cmd)<=2) {
if (rfLen==1){ if (rfLen==1){
invert = 1; //if invert option only is used invert = 1; //if invert option only is used
@ -963,16 +962,16 @@ int FSKrawDemod(const char *Cmd, bool verbose)
size_t BitLen = getFromGraphBuf(BitStream); size_t BitLen = getFromGraphBuf(BitStream);
if (BitLen==0) return 0; if (BitLen==0) return 0;
//get field clock lengths //get field clock lengths
uint16_t fcs=0; uint8_t fc1=0, fc2=0, rf1=0;
if (!fchigh || !fclow) { if (!fchigh || !fclow) {
fcs = countFC(BitStream, BitLen, 1); uint8_t ans = fskClocks(&fc1, &fc2, &rf1, false);
if (!fcs) { if (ans == 0) {
fchigh = 10; if (g_debugMode) PrintAndLog("\nError: cannot detect valid fsk field clocks");
fclow = 8; return 0; // can't detect field clock
} else {
fchigh = (fcs >> 8) & 0x00FF;
fclow = fcs & 0x00FF;
} }
fchigh = fc1;
fclow = fc2;
if (rfLen == 0) rfLen = rf1;
} }
//get bit clock length //get bit clock length
if (!rfLen){ if (!rfLen){

View file

@ -25,6 +25,7 @@
#include "mifare.h" #include "mifare.h"
#include "cmdhfmfu.h" #include "cmdhfmfu.h"
#include "nonce2key/nonce2key.h" #include "nonce2key/nonce2key.h"
#include "cmdhf.h"
#define llx PRIx64 #define llx PRIx64
@ -171,7 +172,8 @@ int usage_hf_14a_raw(void){
int CmdHF14AList(const char *Cmd) int CmdHF14AList(const char *Cmd)
{ {
PrintAndLog("Deprecated command, use 'hf list 14a' instead"); //PrintAndLog("Deprecated command, use 'hf list 14a' instead");
CmdHFList("14a");
return 0; return 0;
} }

View file

@ -32,6 +32,7 @@
#include "protocols.h" #include "protocols.h"
#include "usb_cmd.h" #include "usb_cmd.h"
#include "cmdhfmfu.h" #include "cmdhfmfu.h"
#include "cmdhf.h"
#define llX PRIx64 #define llX PRIx64
@ -62,7 +63,8 @@ int xorbits_8(uint8_t val) {
} }
int CmdHFiClassList(const char *Cmd) { int CmdHFiClassList(const char *Cmd) {
PrintAndLog("Deprecated command, use 'hf list iclass' instead"); //PrintAndLog("Deprecated command, use 'hf list iclass' instead");
CmdHFList("iclass");
return 0; return 0;
} }

View file

@ -1252,24 +1252,26 @@ int usage_hf_mfu_eload(void) {
PrintAndLog("Usage: hf mfu eload u <file name w/o `.eml`> [numblocks]"); PrintAndLog("Usage: hf mfu eload u <file name w/o `.eml`> [numblocks]");
PrintAndLog(" Options:"); PrintAndLog(" Options:");
PrintAndLog(" h : this help"); PrintAndLog(" h : this help");
PrintAndLog(" u : UL"); PrintAndLog(" u : UL (required)");
PrintAndLog(" numblocks : number of blocks to load from eml file"); PrintAndLog(" [filename] : without `.eml` (required)");
PrintAndLog(" numblocks : number of blocks to load from eml file (optional)");
PrintAndLog(""); PrintAndLog("");
PrintAndLog(" sample: hf mfu eload u filename"); PrintAndLog(" sample: hf mfu eload u filename");
PrintAndLog(" hf mfu eload u filename 57"); PrintAndLog(" hf mfu eload u filename 57");
return 0; return 0;
} }
int usage_hf_mfu_sim(void) { int usage_hf_mfu_sim(void) {
PrintAndLog("\nEmulating Ultralight tag from emulator memory\n"); PrintAndLog("\nEmulating Ultralight tag from emulator memory\n");
PrintAndLog("\nBe sure to load the emulator memory first!\n"); PrintAndLog("\nBe sure to load the emulator memory first!\n");
PrintAndLog("Usage: hf mfu sim t 7 u <uid>"); PrintAndLog("Usage: hf mfu sim t 7 u <uid>");
PrintAndLog(" Options : "); PrintAndLog(" Options:");
PrintAndLog(" h : this help"); PrintAndLog(" h : this help");
PrintAndLog(" t : 7 = NTAG or Ultralight sim"); PrintAndLog(" t 7 : 7 = NTAG or Ultralight sim (required)");
PrintAndLog(" u : 4 or 7 byte UID"); PrintAndLog(" u <uid> : 4 or 7 byte UID (optional)");
PrintAndLog("\n sample : hf mfu sim t 7"); PrintAndLog("\n sample : hf mfu sim t 7");
PrintAndLog(" : hf mfu sim t 7 u 1122344556677\n"); PrintAndLog(" : hf mfu sim t 7 u 1122344556677\n");
return 0; return 0;
} }
@ -1469,12 +1471,6 @@ int CmdHF14AMfUDump(const char *Cmd){
// add keys to block dump // add keys to block dump
if (hasAuthKey) { if (hasAuthKey) {
if (!swapEndian){
authKeyPtr = SwapEndian64(authenticationkey, dataLen, (dataLen == 16) ? 8 : 4);
} else {
authKeyPtr = authenticationkey;
}
if (tagtype & UL_C){ //add 4 pages if (tagtype & UL_C){ //add 4 pages
memcpy(data + Pages*4, authKeyPtr, dataLen); memcpy(data + Pages*4, authKeyPtr, dataLen);
Pages += dataLen/4; Pages += dataLen/4;
@ -1486,7 +1482,7 @@ int CmdHF14AMfUDump(const char *Cmd){
uint8_t get_pack[] = {0,0}; uint8_t get_pack[] = {0,0};
iso14a_card_select_t card; iso14a_card_select_t card;
//attempt to read pack //attempt to read pack
if (!ul_auth_select( &card, tagtype, true, authKeyPtr, get_pack, sizeof(get_pack))) { if (!ul_auth_select( &card, tagtype, hasAuthKey, authKeyPtr, get_pack, sizeof(get_pack))) {
//reset pack //reset pack
get_pack[0]=0; get_pack[0]=0;
get_pack[1]=0; get_pack[1]=0;
@ -1537,7 +1533,7 @@ int CmdHF14AMfUDump(const char *Cmd){
PrintAndLog("GetVer-2| %s| | %.4s", sprint_hex(dump_file_data+4, 4), dump_file_data+4); PrintAndLog("GetVer-2| %s| | %.4s", sprint_hex(dump_file_data+4, 4), dump_file_data+4);
PrintAndLog("TBD | 00 00 | | "); PrintAndLog("TBD | 00 00 | | ");
PrintAndLog("Tearing | %s| | %.3s", sprint_hex(dump_file_data+10, 3), dump_file_data+10); PrintAndLog("Tearing | %s| | %.3s", sprint_hex(dump_file_data+10, 3), dump_file_data+10);
PrintAndLog("Pack | %s | | %.2s", sprint_hex(dump_file_data+13, 2), dump_file_data+13); PrintAndLog("Pack | %s | | %.2s", sprint_hex(dump_file_data+13, 2), dump_file_data+13);
PrintAndLog("TBD | 00 | | "); PrintAndLog("TBD | 00 | | ");
PrintAndLog("Sig-1 | %s| | %.4s", sprint_hex(dump_file_data+16, 4), dump_file_data+16); PrintAndLog("Sig-1 | %s| | %.4s", sprint_hex(dump_file_data+16, 4), dump_file_data+16);
PrintAndLog("Sig-2 | %s| | %.4s", sprint_hex(dump_file_data+20, 4), dump_file_data+20); PrintAndLog("Sig-2 | %s| | %.4s", sprint_hex(dump_file_data+20, 4), dump_file_data+20);
@ -1619,7 +1615,7 @@ int CmdHF14AMfUDump(const char *Cmd){
fwrite( dump_file_data, 1, Pages*4 + DUMP_PREFIX_LENGTH, fout ); fwrite( dump_file_data, 1, Pages*4 + DUMP_PREFIX_LENGTH, fout );
fclose(fout); fclose(fout);
PrintAndLog("Dumped %d pages, wrote %d bytes to %s", Pages+12, (Pages+12)*4, filename); PrintAndLog("Dumped %d pages, wrote %d bytes to %s", Pages+(DUMP_PREFIX_LENGTH/4), Pages*4 + DUMP_PREFIX_LENGTH, filename);
return 0; return 0;
} }
@ -1776,14 +1772,13 @@ int CmdHF14AMfucSetPwd(const char *Cmd){
UsbCommand resp; UsbCommand resp;
if (WaitForResponseTimeout(CMD_ACK,&resp,1500) ) { if (WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
if ( (resp.arg[0] & 0xff) == 1) if ( (resp.arg[0] & 0xff) == 1) {
PrintAndLog("Ultralight-C new password: %s", sprint_hex(pwd,16)); PrintAndLog("Ultralight-C new password: %s", sprint_hex(pwd,16));
else{ } else {
PrintAndLog("Failed writing at block %d", resp.arg[1] & 0xff); PrintAndLog("Failed writing at block %d", resp.arg[1] & 0xff);
return 1; return 1;
} }
} } else {
else {
PrintAndLog("command execution time out"); PrintAndLog("command execution time out");
return 1; return 1;
} }

View file

@ -21,6 +21,7 @@
#include "proxmark3.h" #include "proxmark3.h"
#include "iso14443crc.h" #include "iso14443crc.h"
#include "protocols.h" #include "protocols.h"
#include "cmdhf.h"
#define TOPAZ_MAX_MEMORY 2048 #define TOPAZ_MAX_MEMORY 2048
@ -33,7 +34,6 @@ static struct {
uint8_t *dynamic_reserved_areas; uint8_t *dynamic_reserved_areas;
} topaz_tag; } topaz_tag;
static void topaz_switch_on_field(void) static void topaz_switch_on_field(void)
{ {
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT | ISO14A_NO_SELECT | ISO14A_NO_DISCONNECT | ISO14A_TOPAZMODE, 0, 0}}; UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT | ISO14A_NO_SELECT | ISO14A_NO_DISCONNECT | ISO14A_TOPAZMODE, 0, 0}};
@ -252,8 +252,7 @@ static void topaz_print_NDEF(uint8_t *data)
} }
int CmdHFTopazReader(const char *Cmd) int CmdHFTopazReader(const char *Cmd) {
{
int status; int status;
uint8_t atqa[2]; uint8_t atqa[2];
uint8_t rid_response[8]; uint8_t rid_response[8];
@ -367,24 +366,23 @@ int CmdHFTopazReader(const char *Cmd)
return 0; return 0;
} }
int CmdHFTopazSim(const char *Cmd) {
int CmdHFTopazSim(const char *Cmd)
{
PrintAndLog("not yet implemented"); PrintAndLog("not yet implemented");
return 0; return 0;
} }
int CmdHFTopazCmdRaw(const char *Cmd) {
int CmdHFTopazCmdRaw(const char *Cmd)
{
PrintAndLog("not yet implemented"); PrintAndLog("not yet implemented");
return 0; return 0;
} }
int CmdHFTopazList(const char *Cmd) {
CmdHFList("topaz");
return 0;
}
static int CmdHelp(const char *Cmd); static int CmdHelp(const char *Cmd);
static command_t CommandTable[] = static command_t CommandTable[] =
{ {
{"help", CmdHelp, 1, "This help"}, {"help", CmdHelp, 1, "This help"},
@ -392,10 +390,10 @@ static command_t CommandTable[] =
{"sim", CmdHFTopazSim, 0, "<UID> -- Simulate Topaz tag"}, {"sim", CmdHFTopazSim, 0, "<UID> -- Simulate Topaz tag"},
{"sniff", CmdHF14ASniff, 0, "Sniff Topaz reader-tag communication"}, {"sniff", CmdHF14ASniff, 0, "Sniff Topaz reader-tag communication"},
{"raw", CmdHFTopazCmdRaw, 0, "Send raw hex data to tag"}, {"raw", CmdHFTopazCmdRaw, 0, "Send raw hex data to tag"},
{"list", CmdHFTopazList, 0, "[Deprecated] List Topaz history"},
{NULL, NULL, 0, NULL} {NULL, NULL, 0, NULL}
}; };
int CmdHFTopaz(const char *Cmd) { int CmdHFTopaz(const char *Cmd) {
// flush // flush
WaitForResponseTimeout(CMD_ACK,NULL,100); WaitForResponseTimeout(CMD_ACK,NULL,100);

View file

@ -12,5 +12,9 @@
#define CMDHFTOPAZ_H__ #define CMDHFTOPAZ_H__
int CmdHFTopaz(const char *Cmd); int CmdHFTopaz(const char *Cmd);
int CmdHFTopazReader(const char *Cmd);
int CmdHFTopazSim(const char *Cmd);
int CmdHFTopazCmdRaw(const char *Cmd);
int CmdHFTopazList(const char *Cmd);
#endif #endif

View file

@ -150,12 +150,14 @@ int usage_t55xx_wakup(){
return 0; return 0;
} }
int usage_t55xx_bruteforce(){ int usage_t55xx_bruteforce(){
PrintAndLog("Usage: lf t55xx bruteforce <start password> <end password> [i <*.dic>]");
PrintAndLog(" password must be 4 bytes (8 hex symbols)");
PrintAndLog("This command uses A) bruteforce to scan a number range"); PrintAndLog("This command uses A) bruteforce to scan a number range");
PrintAndLog(" B) a dictionary attack"); PrintAndLog(" B) a dictionary attack");
PrintAndLog("Usage: lf t55xx bruteforce <start password> <end password> [i <*.dic>]");
PrintAndLog(" password must be 4 bytes (8 hex symbols)");
PrintAndLog("Options:"); PrintAndLog("Options:");
PrintAndLog(" h - this help"); PrintAndLog(" h - this help");
PrintAndLog(" <start_pwd> - 4 byte hex value to start pwd search at");
PrintAndLog(" <end_pwd> - 4 byte hex value to end pwd search at");
PrintAndLog(" i <*.dic> - loads a default keys dictionary file <*.dic>"); PrintAndLog(" i <*.dic> - loads a default keys dictionary file <*.dic>");
PrintAndLog(""); PrintAndLog("");
PrintAndLog("Examples:"); PrintAndLog("Examples:");
@ -181,7 +183,6 @@ int CmdT55xxSetConfig(const char *Cmd) {
uint8_t bitRate = 0; uint8_t bitRate = 0;
uint8_t rates[9] = {8,16,32,40,50,64,100,128,0}; uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};
uint8_t cmdp = 0; uint8_t cmdp = 0;
config.Q5 = FALSE;
bool errors = FALSE; bool errors = FALSE;
while(param_getchar(Cmd, cmdp) != 0x00 && !errors) while(param_getchar(Cmd, cmdp) != 0x00 && !errors)
{ {
@ -384,11 +385,12 @@ bool DecodeT55xxBlock(){
ans = ASKDemod(cmdStr, FALSE, FALSE, 1); ans = ASKDemod(cmdStr, FALSE, FALSE, 1);
break; break;
case DEMOD_PSK1: case DEMOD_PSK1:
// skip first 16 samples to allow antenna to settle in (psk gets inverted occasionally otherwise) // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
save_restoreGB(1); save_restoreGB(1);
CmdLtrim("160"); CmdLtrim("160");
snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted ); snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );
ans = PSKDemod(cmdStr, FALSE); ans = PSKDemod(cmdStr, FALSE);
//undo trim samples
save_restoreGB(0); save_restoreGB(0);
break; break;
case DEMOD_PSK2: //inverted won't affect this case DEMOD_PSK2: //inverted won't affect this
@ -399,7 +401,8 @@ bool DecodeT55xxBlock(){
snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] ); snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );
ans = PSKDemod(cmdStr, FALSE); ans = PSKDemod(cmdStr, FALSE);
psk1TOpsk2(DemodBuffer, DemodBufferLen); psk1TOpsk2(DemodBuffer, DemodBufferLen);
save_restoreGB(1); //undo trim samples
save_restoreGB(0);
break; break;
case DEMOD_NRZ: case DEMOD_NRZ:
snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted ); snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );
@ -417,7 +420,6 @@ bool DecodeT55xxBlock(){
} }
int CmdT55xxDetect(const char *Cmd){ int CmdT55xxDetect(const char *Cmd){
bool errors = FALSE; bool errors = FALSE;
bool useGB = FALSE; bool useGB = FALSE;
bool usepwd = FALSE; bool usepwd = FALSE;
@ -465,7 +467,6 @@ bool tryDetectModulation(){
t55xx_conf_block_t tests[15]; t55xx_conf_block_t tests[15];
int bitRate=0; int bitRate=0;
uint8_t fc1 = 0, fc2 = 0, clk=0; uint8_t fc1 = 0, fc2 = 0, clk=0;
save_restoreGB(1);
if (GetFskClock("", FALSE, FALSE)){ if (GetFskClock("", FALSE, FALSE)){
fskClocks(&fc1, &fc2, &clk, FALSE); fskClocks(&fc1, &fc2, &clk, FALSE);
@ -486,7 +487,6 @@ bool tryDetectModulation(){
tests[hits].modulation = DEMOD_FSK1; tests[hits].modulation = DEMOD_FSK1;
else if (fc1 == 10 && fc2 == 8) else if (fc1 == 10 && fc2 == 8)
tests[hits].modulation = DEMOD_FSK2a; tests[hits].modulation = DEMOD_FSK2a;
tests[hits].bitrate = bitRate; tests[hits].bitrate = bitRate;
tests[hits].inverted = TRUE; tests[hits].inverted = TRUE;
tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer); tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
@ -525,7 +525,7 @@ bool tryDetectModulation(){
} }
} }
//undo trim from ask //undo trim from ask
save_restoreGB(0); //save_restoreGB(0);
clk = GetNrzClock("", FALSE, FALSE); clk = GetNrzClock("", FALSE, FALSE);
if (clk>0) { if (clk>0) {
if ( NRZrawDemod("0 0 1", FALSE) && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) { if ( NRZrawDemod("0 0 1", FALSE) && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
@ -545,9 +545,9 @@ bool tryDetectModulation(){
} }
} }
//undo trim from nrz // allow undo
save_restoreGB(0);
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise) // skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
save_restoreGB(1);
CmdLtrim("160"); CmdLtrim("160");
clk = GetPskClock("", FALSE, FALSE); clk = GetPskClock("", FALSE, FALSE);
if (clk>0) { if (clk>0) {
@ -588,14 +588,16 @@ bool tryDetectModulation(){
} }
} // inverse waves does not affect this demod } // inverse waves does not affect this demod
} }
//undo trim samples
save_restoreGB(0);
} }
save_restoreGB(0);
if ( hits == 1) { if ( hits == 1) {
config.modulation = tests[0].modulation; config.modulation = tests[0].modulation;
config.bitrate = tests[0].bitrate; config.bitrate = tests[0].bitrate;
config.inverted = tests[0].inverted; config.inverted = tests[0].inverted;
config.offset = tests[0].offset; config.offset = tests[0].offset;
config.block0 = tests[0].block0; config.block0 = tests[0].block0;
config.Q5 = tests[0].Q5;
printConfiguration( config ); printConfiguration( config );
return TRUE; return TRUE;
} }
@ -671,6 +673,15 @@ bool testQ5Modulation(uint8_t mode, uint8_t modread){
return FALSE; return FALSE;
} }
int convertQ5bitRate(uint8_t bitRateRead) {
uint8_t expected[] = {8, 16, 32, 40, 50, 64, 100, 128};
for (int i=0; i<8; i++)
if (expected[i] == bitRateRead)
return i;
return -1;
}
bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk){ bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk){
if ( DemodBufferLen < 64 ) return FALSE; if ( DemodBufferLen < 64 ) return FALSE;
@ -682,12 +693,12 @@ bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk){
uint8_t safer = PackBits(si, 4, DemodBuffer); si += 4; //master key uint8_t safer = PackBits(si, 4, DemodBuffer); si += 4; //master key
uint8_t resv = PackBits(si, 8, DemodBuffer); si += 8; uint8_t resv = PackBits(si, 8, DemodBuffer); si += 8;
// 2nibble must be zeroed. // 2nibble must be zeroed.
if (safer != 0x6) continue; if (safer != 0x6 && safer != 0x9) continue;
if ( resv > 0x00) continue; if ( resv > 0x00) continue;
//uint8_t pageSel = PackBits(si, 1, DemodBuffer); si += 1; //uint8_t pageSel = PackBits(si, 1, DemodBuffer); si += 1;
//uint8_t fastWrite = PackBits(si, 1, DemodBuffer); si += 1; //uint8_t fastWrite = PackBits(si, 1, DemodBuffer); si += 1;
si += 1+1; si += 1+1;
int bitRate = PackBits(si, 5, DemodBuffer)*2 + 2; si += 5; //bit rate int bitRate = PackBits(si, 6, DemodBuffer)*2 + 2; si += 6; //bit rate
if (bitRate > 128 || bitRate < 8) continue; if (bitRate > 128 || bitRate < 8) continue;
//uint8_t AOR = PackBits(si, 1, DemodBuffer); si += 1; //uint8_t AOR = PackBits(si, 1, DemodBuffer); si += 1;
@ -702,7 +713,8 @@ bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk){
//test modulation //test modulation
if (!testQ5Modulation(mode, modread)) continue; if (!testQ5Modulation(mode, modread)) continue;
if (bitRate != clk) continue; if (bitRate != clk) continue;
*fndBitRate = bitRate; *fndBitRate = convertQ5bitRate(bitRate);
if (*fndBitRate < 0) continue;
*offset = idx; *offset = idx;
return TRUE; return TRUE;
@ -1117,35 +1129,16 @@ char * GetBitRateStr(uint32_t id){
char *retStr = buf; char *retStr = buf;
switch (id){ switch (id){
case 0: case 0: snprintf(retStr,sizeof(buf),"%d - RF/8",id); break;
snprintf(retStr,sizeof(buf),"%d - RF/8",id); case 1: snprintf(retStr,sizeof(buf),"%d - RF/16",id); break;
break; case 2: snprintf(retStr,sizeof(buf),"%d - RF/32",id); break;
case 1: case 3: snprintf(retStr,sizeof(buf),"%d - RF/40",id); break;
snprintf(retStr,sizeof(buf),"%d - RF/16",id); case 4: snprintf(retStr,sizeof(buf),"%d - RF/50",id); break;
break; case 5: snprintf(retStr,sizeof(buf),"%d - RF/64",id); break;
case 2: case 6: snprintf(retStr,sizeof(buf),"%d - RF/100",id); break;
snprintf(retStr,sizeof(buf),"%d - RF/32",id); case 7: snprintf(retStr,sizeof(buf),"%d - RF/128",id); break;
break; default: snprintf(retStr,sizeof(buf),"%d - (Unknown)",id); break;
case 3:
snprintf(retStr,sizeof(buf),"%d - RF/40",id);
break;
case 4:
snprintf(retStr,sizeof(buf),"%d - RF/50",id);
break;
case 5:
snprintf(retStr,sizeof(buf),"%d - RF/64",id);
break;
case 6:
snprintf(retStr,sizeof(buf),"%d - RF/100",id);
break;
case 7:
snprintf(retStr,sizeof(buf),"%d - RF/128",id);
break;
default:
snprintf(retStr,sizeof(buf),"%d - (Unknown)",id);
break;
} }
return buf; return buf;
} }
@ -1476,7 +1469,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
static command_t CommandTable[] = { static command_t CommandTable[] = {
{"help", CmdHelp, 1, "This help"}, {"help", CmdHelp, 1, "This help"},
{"bruteforce", CmdT55xxBruteForce,0, "Simple bruteforce attack to find password"}, {"bruteforce",CmdT55xxBruteForce,0, "<start password> <end password> [i <*.dic>] Simple bruteforce attack to find password"},
{"config", CmdT55xxSetConfig, 1, "Set/Get T55XX configuration (modulation, inverted, offset, rate)"}, {"config", CmdT55xxSetConfig, 1, "Set/Get T55XX configuration (modulation, inverted, offset, rate)"},
{"detect", CmdT55xxDetect, 1, "[1] Try detecting the tag modulation from reading the configuration block."}, {"detect", CmdT55xxDetect, 1, "[1] Try detecting the tag modulation from reading the configuration block."},
{"dump", CmdT55xxDump, 0, "[password] [o] Dump T55xx card block 0-7. Optional [password], [override]"}, {"dump", CmdT55xxDump, 0, "[password] [o] Dump T55xx card block 0-7. Optional [password], [override]"},

View file

@ -140,7 +140,7 @@ char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t brea
for (size_t out_index=0; out_index < max_len; out_index++) { for (size_t out_index=0; out_index < max_len; out_index++) {
// set character // set character
sprintf(tmp++, "%u", data[in_index]); sprintf(tmp++, "%u", data[in_index]);
// check if a line break is needed // check if a line break is needed and we have room to print it in our array
if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) { if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) {
// increment and print line break // increment and print line break
out_index++; out_index++;
@ -195,7 +195,6 @@ void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest) {
// up to 64 bytes or 512 bits // up to 64 bytes or 512 bits
uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){ uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){
static uint8_t buf[64]; static uint8_t buf[64];
//uint8_t buf[64];
memset(buf, 0x00, 64); memset(buf, 0x00, 64);
uint8_t *tmp = buf; uint8_t *tmp = buf;
for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){ for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){