X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/d1057e7a2105d5e2696df185482176f22a5bd669..62a38cc8835cc7b98a30ee3e670e6eb582ddd8cd:/client/cmdlf.c

diff --git a/client/cmdlf.c b/client/cmdlf.c
index 016f0fe2..2e786943 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -33,12 +33,14 @@
 #include "cmdlfpcf7931.h"// for pcf7931 menu
 #include "cmdlfpyramid.h"// for pyramid menu
 #include "cmdlfviking.h" // for viking menu
+#include "cmdlfcotag.h"  // for COTAG menu
 
+bool g_lf_threshold_set = false;
 static int CmdHelp(const char *Cmd);
 
 
 
-int usage_lf_cmdread()
+int usage_lf_cmdread(void)
 {
 	PrintAndLog("Usage: lf cmdread d <delay period> z <zero period> o <one period> c <cmdbytes> [H] ");
 	PrintAndLog("Options:        ");
@@ -430,7 +432,7 @@ int CmdIndalaClone(const char *Cmd)
 	return 0;
 }
 
-int usage_lf_read()
+int usage_lf_read(void)
 {
 	PrintAndLog("Usage: lf read");
 	PrintAndLog("Options:        ");
@@ -440,7 +442,7 @@ int usage_lf_read()
 	PrintAndLog("Use 'lf config' to set parameters.");
 	return 0;
 }
-int usage_lf_snoop()
+int usage_lf_snoop(void)
 {
 	PrintAndLog("Usage: lf snoop");
 	PrintAndLog("Options:        ");
@@ -450,7 +452,7 @@ int usage_lf_snoop()
 	return 0;
 }
 
-int usage_lf_config()
+int usage_lf_config(void)
 {
 	PrintAndLog("Usage: lf config [H|<divisor>] [b <bps>] [d <decim>] [a 0|1]");
 	PrintAndLog("Options:        ");
@@ -508,7 +510,10 @@ int CmdLFSetConfig(const char *Cmd)
 		case 't':
 			errors |= param_getdec(Cmd,cmdp+1,&unsigned_trigg);
 			cmdp+=2;
-			if(!errors) trigger_threshold = unsigned_trigg;
+			if(!errors) {
+				trigger_threshold = unsigned_trigg;
+				if (trigger_threshold > 0) g_lf_threshold_set = true;
+			}
 			break;
 		case 'b':
 			errors |= param_getdec(Cmd,cmdp+1,&bps);
@@ -555,7 +560,7 @@ int CmdLFSetConfig(const char *Cmd)
 
 int CmdLFRead(const char *Cmd)
 {
-
+	if (offline) return 0;
 	uint8_t cmdp = 0;
 	bool arg1 = false;
 	if (param_getchar(Cmd, cmdp) == 'h')
@@ -567,12 +572,14 @@ int CmdLFRead(const char *Cmd)
 	UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
 	clearCommandBuffer();
 	SendCommand(&c);
-	//WaitForResponse(CMD_ACK,NULL);	
-	if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
-		PrintAndLog("command execution time out");
-		return 1;
+	if (g_lf_threshold_set) {
+		WaitForResponse(CMD_ACK,NULL);
+	} else {
+		if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
+			PrintAndLog("command execution time out");
+			return 1;
+		}
 	}
-
 	return 0;
 }
 
@@ -685,7 +692,7 @@ int usage_lf_simpsk(void)
 	return 0;
 }
 
-// by marshmellow - sim ask data given clock, fcHigh, fcLow, invert 
+// by marshmellow - sim fsk data given clock, fcHigh, fcLow, invert 
 // - allow pull data from DemodBuffer
 int CmdLFfskSim(const char *Cmd)
 {
@@ -1076,10 +1083,31 @@ 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);
 	char testRaw = param_getchar(Cmd, 1);
 	if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') {
@@ -1098,7 +1126,7 @@ int CmdLFfind(const char *Cmd)
 	if (!offline && (cmdp != '1')){
 		CmdLFRead("s");
 		getSamples("30000",false);
-	} else if (GraphTraceLen < 1000) {
+	} else if (GraphTraceLen < minLength) {
 		PrintAndLog("Data in Graphbuffer was too small.");
 		return 0;
 	}
@@ -1108,52 +1136,75 @@ int CmdLFfind(const char *Cmd)
 	PrintAndLog("False Positives ARE possible\n");  
 	PrintAndLog("\nChecking for known tags:\n");
 
+	size_t testLen = minLength;
+	// 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')) {
+			// 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;
+			}
+			ans=CmdCOTAGRead("");
+			if (ans>0){
+				PrintAndLog("\nValid COTAG ID Found!");
+				return 1;
+			}
+		}
+		return 0;
+	}
+
 	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);
@@ -1165,24 +1216,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);
@@ -1217,7 +1269,8 @@ static command_t CommandTable[] =
 {
 	{"help",        CmdHelp,            1, "This help"},
 	{"awid",        CmdLFAWID,          1, "{ AWID RFIDs...    }"},
-	{"em4x",        CmdLFEM4X,          1, "{ EM4X RFIDs...    }"},
+	{"cotag",       CmdLFCOTAG,         1, "{ COTAG RFIDs...   }"},
+	{"em",          CmdLFEM4X,          1, "{ EM4X RFIDs...    }"},
 	{"hid",         CmdLFHID,           1, "{ HID RFIDs...     }"},
 	{"hitag",       CmdLFHitag,         1, "{ Hitag tags and transponders... }"},
 	{"io",          CmdLFIO,            1, "{ ioProx tags...   }"},