From 6ce0e5386a5dd4ce8eb171437e2b62ca55a328ea Mon Sep 17 00:00:00 2001
From: marshmellow42 <marshmellowrf@gmail.com>
Date: Tue, 12 May 2015 16:45:48 -0400
Subject: [PATCH] HF Search  -  refactoring cmds to work with it

---
 armsrc/iclass.c      | 18 ++++++++++--------
 client/cmdhf.c       | 29 ++++++++++++++++++++---------
 client/cmdhf14a.c    |  2 +-
 client/cmdhf15.c     | 18 ++++++++++++++++--
 client/cmdhf15.h     |  1 +
 client/cmdhficlass.c | 31 ++++++++++++++++++++++---------
 client/cmdhficlass.h |  1 +
 include/usb_cmd.h    |  9 +++++----
 8 files changed, 76 insertions(+), 33 deletions(-)

diff --git a/armsrc/iclass.c b/armsrc/iclass.c
index 56bc29db..9139d3bd 100644
--- a/armsrc/iclass.c
+++ b/armsrc/iclass.c
@@ -1677,7 +1677,7 @@ void ReaderIClass(uint8_t arg0) {
 
 	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};
@@ -1685,16 +1685,18 @@ void ReaderIClass(uint8_t arg0) {
 	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;
@@ -1761,7 +1763,7 @@ void ReaderIClass(uint8_t arg0) {
 
 		}
 		LED_B_OFF();
-    }
+	}
     cmd_send(CMD_ACK,0,0,0,card_data, 0);
     LED_A_OFF();
 }
diff --git a/client/cmdhf.c b/client/cmdhf.c
index 524d9c2e..8853a7f3 100644
--- a/client/cmdhf.c
+++ b/client/cmdhf.c
@@ -87,7 +87,7 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
 	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,"?");
@@ -546,17 +546,28 @@ int CmdHFList(const char *Cmd)
 
 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;
 }
 
@@ -573,7 +584,7 @@ static command_t CommandTable[] =
   {"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}
 };
 
diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c
index d1f8b363..1973ff22 100644
--- a/client/cmdhf14a.c
+++ b/client/cmdhf14a.c
@@ -144,7 +144,7 @@ int CmdHF14AReader(const char *Cmd)
 	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;
diff --git a/client/cmdhf15.c b/client/cmdhf15.c
index c3ff7dd6..8ddbea89 100644
--- a/client/cmdhf15.c
+++ b/client/cmdhf15.c
@@ -374,6 +374,20 @@ int CmdHF15Record(const char *Cmd)
 	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}};
@@ -469,7 +483,7 @@ int CmdHF15DumpMem(const char*Cmd) {
 					// 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");
@@ -481,7 +495,7 @@ int CmdHF15DumpMem(const char*Cmd) {
 //		PrintAndLog("CRC Failed");
 //	else 
 //		PrintAndLog("Tag returned Error %i: %s",recv[1],TagErrorStr(recv[1])); 
-	return 0;
+	return 1;
 }
 
 
diff --git a/client/cmdhf15.h b/client/cmdhf15.h
index 8d78e13f..c6264604 100644
--- a/client/cmdhf15.h
+++ b/client/cmdhf15.h
@@ -15,6 +15,7 @@ int CmdHF15(const char *Cmd);
 
 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);
diff --git a/client/cmdhficlass.c b/client/cmdhficlass.c
index b8337196..824aaa36 100644
--- a/client/cmdhficlass.c
+++ b/client/cmdhficlass.c
@@ -165,34 +165,47 @@ int CmdHFiClassSim(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)
diff --git a/client/cmdhficlass.h b/client/cmdhficlass.h
index e4048eb1..30c6a8a7 100644
--- a/client/cmdhficlass.h
+++ b/client/cmdhficlass.h
@@ -17,6 +17,7 @@ int CmdHFiClass(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);
 
diff --git a/include/usb_cmd.h b/include/usb_cmd.h
index 31498e2a..f67eac58 100644
--- a/include/usb_cmd.h
+++ b/include/usb_cmd.h
@@ -201,10 +201,11 @@ typedef struct{
 
 //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
 
 
 
-- 
2.39.5