uint8_t card_data[6 * 8]={0};
memset(card_data, 0xFF, sizeof(card_data));
- uint8_t last_csn[8]={0};
+ uint8_t last_csn[8]={0};
//Read conf block CRC(0x01) => 0xfa 0x22
uint8_t readConf[] = { ICLASS_CMD_READ_OR_IDENTIFY,0x01, 0xfa, 0x22};
uint8_t readAA[] = { ICLASS_CMD_READ_OR_IDENTIFY,0x05, 0xde, 0x64};
- int read_status= 0;
+ int read_status= 0;
uint8_t result_status = 0;
- bool abort_after_read = arg0 & FLAG_ICLASS_READER_ONLY_ONCE;
-
+ bool abort_after_read = arg0 & FLAG_ICLASS_READER_ONLY_ONCE;
+ bool try_once = arg0 & FLAG_ICLASS_READER_ONE_TRY;
set_tracing(TRUE);
- setupIclassReader();
+ setupIclassReader();
+ uint16_t tryCnt=0;
while(!BUTTON_PRESS())
- {
-
+ {
+ if (try_once && tryCnt > 5) break;
+ tryCnt++;
if(!tracing) {
DbpString("Trace full");
break;
}
LED_B_OFF();
- }
+ }
cmd_send(CMD_ACK,0,0,0,card_data, 0);
LED_A_OFF();
}
case MIFARE_ULC_AUTH_2: snprintf(exp,size,"AUTH_ANSW"); break;
case MIFARE_ULEV1_AUTH: snprintf(exp,size,"PWD-AUTH"); break;
case MIFARE_ULEV1_FASTREAD:{
- if ( cmdsize >=3 && cmd[2] < 0x21)
+ if ( cmdsize >=3 && cmd[2] <= 0xE6)
snprintf(exp,size,"READ RANGE (%d-%d)",cmd[1],cmd[2]);
else
snprintf(exp,size,"?");
int CmdHFSearch(const char *Cmd){
int ans = 0;
- ans = CmdHF14AReader(Cmd);
- if (ans > 0) return ans;
+ PrintAndLog("");
+ ans = CmdHF14AReader("s");
+ if (ans > 0) {
+ PrintAndLog("\nValid ISO14443A Tag Found - Quiting Search\n");
+ return ans;
+ }
+ ans = HFiClassReader("", false, false);
+ if (ans) {
+ PrintAndLog("\nValid iClass Tag (or PicoPass Tag) Found - Quiting Search\n");
+ return ans;
+ }
+ ans = HF15Reader("", false);
+ if (ans) {
+ PrintAndLog("\nValid ISO15693 Tag Found - Quiting Search\n");
+ return ans;
+ }
- ans = CmdHF15Reader(Cmd);
- //if (ans > 0) return ans;
- ans = CmdHF14BRead(Cmd);
+ //14b has issues currently...
+ //ans = CmdHF14BRead(Cmd);
//if (ans > 0) return ans;
- ans = CmdHFiClassReader(Cmd);
- //if (ans > 0) return ans;
return 0;
}
{"mfu", CmdHFMFUltra, 1, "{ MIFARE Ultralight RFIDs... }"},
{"tune", CmdHFTune, 0, "Continuously measure HF antenna tuning"},
{"list", CmdHFList, 1, "List protocol data in trace buffer"},
- {"search", CmdHFSearch, 1, "Search for known HF tags"},
+ {"search", CmdHFSearch, 1, "Search for known HF tags [preliminary]"},
{NULL, NULL, 0, NULL}
};
uint64_t select_status = resp.arg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS
if(select_status == 0) {
- PrintAndLog("iso14443a card select failed");
+ if (Cmd[0] != 's') PrintAndLog("iso14443a card select failed");
// disconnect
c.arg[0] = 0;
c.arg[1] = 0;
return 0;
}
+int HF15Reader(const char *Cmd, bool verbose)
+{
+ uint8_t uid[8];
+
+ if (!getUID(uid)) {
+ if (verbose) PrintAndLog("No Tag found.");
+ return 0;
+ }
+
+ PrintAndLog("Tag UID : %s",sprintUID(NULL,uid));
+ PrintAndLog("Tag Info: %s",getTagInfo(uid));
+ return 1;
+}
+
int CmdHF15Reader(const char *Cmd)
{
UsbCommand c = {CMD_READER_ISO_15693, {strtol(Cmd, NULL, 0), 0, 0}};
// PrintAndLog("bn=%i",blocknum);
} else {
PrintAndLog("Tag returned Error %i: %s",recv[1],TagErrorStr(recv[1]));
- return 0;
+ return 1;
}
} // else PrintAndLog("crc");
} // else PrintAndLog("r null");
// PrintAndLog("CRC Failed");
// else
// PrintAndLog("Tag returned Error %i: %s",recv[1],TagErrorStr(recv[1]));
- return 0;
+ return 1;
}
int CmdHF15Demod(const char *Cmd);
int CmdHF15Read(const char *Cmd);
+int HF15Reader(const char *Cmd, bool verbose);
int CmdHF15Reader(const char *Cmd);
int CmdHF15Sim(const char *Cmd);
int CmdHF15Record(const char *Cmd);
return 0;
}
-int CmdHFiClassReader(const char *Cmd)
+int HFiClassReader(const char *Cmd, bool loop, bool verbose)
{
+ bool tagFound = false;
UsbCommand c = {CMD_READER_ICLASS, {FLAG_ICLASS_READER_CSN|
FLAG_ICLASS_READER_CONF|FLAG_ICLASS_READER_AA}};
+ if (!loop) c.arg[0] |= FLAG_ICLASS_READER_ONLY_ONCE | FLAG_ICLASS_READER_ONE_TRY;
SendCommand(&c);
UsbCommand resp;
while(!ukbhit()){
- if (WaitForResponseTimeout(CMD_ACK,&resp,4500)) {
- uint8_t readStatus = resp.arg[0] & 0xff;
- uint8_t * data = resp.d.asBytes;
+ if (WaitForResponseTimeout(CMD_ACK,&resp, 4500)) {
+ uint8_t readStatus = resp.arg[0] & 0xff;
+ uint8_t *data = resp.d.asBytes;
- PrintAndLog("Readstatus:%02x", readStatus);
+ if (verbose)
+ PrintAndLog("Readstatus:%02x", readStatus);
if( readStatus == 0){
//Aborted
- PrintAndLog("Quitting...");
+ if (verbose) PrintAndLog("Quitting...");
return 0;
}
- if( readStatus & FLAG_ICLASS_READER_CSN) PrintAndLog("CSN: %s",sprint_hex(data,8));
+ if( readStatus & FLAG_ICLASS_READER_CSN){
+ PrintAndLog("CSN: %s",sprint_hex(data,8));
+ tagFound = true;
+ }
if( readStatus & FLAG_ICLASS_READER_CC) PrintAndLog("CC: %s",sprint_hex(data+16,8));
if( readStatus & FLAG_ICLASS_READER_CONF){
printIclassDumpInfo(data);
}
+ if (tagFound && !loop) return 1;
} else {
- PrintAndLog("Command execute timeout");
+ if (verbose) PrintAndLog("Command execute timeout");
}
+ if (!loop) break;
}
-
return 0;
+
+}
+
+int CmdHFiClassReader(const char *Cmd)
+{
+ return HFiClassReader(Cmd, true, true);
}
int CmdHFiClassReader_Replay(const char *Cmd)
int CmdHFiClassSnoop(const char *Cmd);
int CmdHFiClassSim(const char *Cmd);
int CmdHFiClassList(const char *Cmd);
+int HFiClassReader(const char *Cmd, bool loop, bool verbose);
int CmdHFiClassReader(const char *Cmd);
int CmdHFiClassReader_Replay(const char *Cmd);
//Iclass reader flags
#define FLAG_ICLASS_READER_ONLY_ONCE 0x01
-#define FLAG_ICLASS_READER_CC 0x02
-#define FLAG_ICLASS_READER_CSN 0x04
-#define FLAG_ICLASS_READER_CONF 0x08
-#define FLAG_ICLASS_READER_AA 0x10
+#define FLAG_ICLASS_READER_CC 0x02
+#define FLAG_ICLASS_READER_CSN 0x04
+#define FLAG_ICLASS_READER_CONF 0x08
+#define FLAG_ICLASS_READER_AA 0x10
+#define FLAG_ICLASS_READER_ONE_TRY 0x20