From d0b0586411805d505047229e9bfd75fdc5c61559 Mon Sep 17 00:00:00 2001
From: marshmellow42 <marshmellowrf@gmail.com>
Date: Tue, 21 Feb 2017 11:46:13 -0500
Subject: [PATCH 1/1] cleanup cmdlfem4x.h - add chip detection to ...

... lf search
---
 client/cmdlf.c     | 52 ++++++++++++++++++++++++++++++++++------------
 client/cmdlfem4x.h | 13 +++++++-----
 2 files changed, 47 insertions(+), 18 deletions(-)

diff --git a/client/cmdlf.c b/client/cmdlf.c
index 34104518..8b6f32b6 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -1078,9 +1078,29 @@ int CmdVchDemod(const char *Cmd)
 	return 0;
 }
 
+
+//by marshmellow
+int CheckChipType(char cmdp) {
+	uint32_t wordData = 0;
+
+	//check for em4x05/em4x69 chips first
+	save_restoreGB(1);
+	if ((!offline && (cmdp != '1')) && EM4x05Block0Test(&wordData)) {
+		PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nTry lf em 4x05... commands\n");
+		save_restoreGB(0);
+		return 1;
+	}
+
+	//TODO check for t55xx chip...
+
+	save_restoreGB(0);
+	return 1;
+}
+
 //by marshmellow
 int CmdLFfind(const char *Cmd)
 {
+	uint32_t wordData = 0;
 	int ans=0;
 	size_t minLength = 1000;
 	char cmdp = param_getchar(Cmd, 0);
@@ -1115,7 +1135,12 @@ int CmdLFfind(const char *Cmd)
 	// only run if graphbuffer is just noise as it should be for hitag/cotag
 	if (graphJustNoise(GraphBuffer, testLen)) {
 		// only run these tests if we are in online mode 
-		if (!offline && (cmdp != '1')){
+		if (!offline && (cmdp != '1')) {
+			// test for em4x05 in reader talk first mode.
+			if (EM4x05Block0Test(&wordData)) {
+				PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nUse lf em 4x05readword/dump commands to read\n");
+				return 1;
+			}
 			ans=CmdLFHitagReader("26");
 			if (ans==0) {
 				return 1;
@@ -1132,49 +1157,49 @@ int CmdLFfind(const char *Cmd)
 	ans=CmdFSKdemodIO("");
 	if (ans>0) {
 		PrintAndLog("\nValid IO Prox ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdFSKdemodPyramid("");
 	if (ans>0) {
 		PrintAndLog("\nValid Pyramid ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdFSKdemodParadox("");
 	if (ans>0) {
 		PrintAndLog("\nValid Paradox ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdFSKdemodAWID("");
 	if (ans>0) {
 		PrintAndLog("\nValid AWID ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdFSKdemodHID("");
 	if (ans>0) {
 		PrintAndLog("\nValid HID Prox ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdAskEM410xDemod("");
 	if (ans>0) {
 		PrintAndLog("\nValid EM410x ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdG_Prox_II_Demod("");
 	if (ans>0) {
 		PrintAndLog("\nValid G Prox II ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdFDXBdemodBI("");
 	if (ans>0) {
 		PrintAndLog("\nValid FDX-B ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=EM4x50Read("", false);
@@ -1186,24 +1211,25 @@ int CmdLFfind(const char *Cmd)
 	ans=CmdVikingDemod("");
 	if (ans>0) {
 		PrintAndLog("\nValid Viking ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}	
 
 	ans=CmdIndalaDecode("");
 	if (ans>0) {
 		PrintAndLog("\nValid Indala ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	ans=CmdPSKNexWatch("");
 	if (ans>0) {
 		PrintAndLog("\nValid NexWatch ID Found!");
-		return 1;
+		return CheckChipType(cmdp);
 	}
 
 	PrintAndLog("\nNo Known Tags Found!\n");
 	if (testRaw=='u' || testRaw=='U'){
-		//test unknown tag formats (raw mode)
+		ans=CheckChipType(cmdp);
+		//test unknown tag formats (raw mode)0
 		PrintAndLog("\nChecking for Unknown tags:\n");
 		ans=AutoCorrelate(4000, FALSE, FALSE);
 		if (ans > 0) PrintAndLog("Possible Auto Correlation of %d repeating samples",ans);
diff --git a/client/cmdlfem4x.h b/client/cmdlfem4x.h
index 400536d3..7faf6f49 100644
--- a/client/cmdlfem4x.h
+++ b/client/cmdlfem4x.h
@@ -18,11 +18,14 @@ int CmdEM410xWatch(const char *Cmd);
 int CmdEM410xWatchnSpoof(const char *Cmd);
 int CmdEM410xWrite(const char *Cmd);
 int CmdEM4x50Read(const char *Cmd);
-int CmdLFEM4X(const char *Cmd);
-int CmdReadWord(const char *Cmd);
-int CmdReadWordPWD(const char *Cmd);
-int CmdWriteWord(const char *Cmd);
-int CmdWriteWordPWD(const char *Cmd);
 int EM4x50Read(const char *Cmd, bool verbose);
+int CmdLFEM4X(const char *Cmd);
+bool EM4x05Block0Test(uint32_t *wordData);
+int CmdEM4x05info(const char *Cmd);
+int CmdEM4x05WriteWord(const char *Cmd);
+int CmdEM4x05dump(const char *Cmd);
+int CmdEM4x05ReadWord(const char *Cmd);
+int EM4x05ReadWord_ext(uint8_t addr, uint32_t pwd, bool usePwd, uint32_t *wordData);
+
 
 #endif
-- 
2.39.5