X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/cc15a1187b698d185a42fe956c0b68b9384eafdd..refs/pull/165/head:/client/cmdlfem4x.c?ds=inline

diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c
index e45c788a..aa0fc856 100644
--- a/client/cmdlfem4x.c
+++ b/client/cmdlfem4x.c
@@ -20,6 +20,7 @@
 #include "cmdlf.h"
 #include "cmdlfem4x.h"
 #include "lfdemod.h"
+
 char *global_em410xId;
 
 static int CmdHelp(const char *Cmd);
@@ -47,7 +48,7 @@ int CmdEM410xRead(const char *Cmd)
 	uint32_t hi=0;
 	uint64_t lo=0;
 
-	if(!AskEm410xDemod("", &hi, &lo)) return 0;
+	if(!AskEm410xDemod("", &hi, &lo, false)) return 0;
 	PrintAndLog("EM410x pattern found: ");
 	printEM410x(hi, lo);
 	if (hi){
@@ -55,7 +56,7 @@ int CmdEM410xRead(const char *Cmd)
 		return 0;
 	}
 	char id[12] = {0x00};
-	sprintf(id, "%010llx",lo);
+	sprintf(id, "%010"PRIx64,lo);
 	
 	global_em410xId = id;
 	return 1;
@@ -70,22 +71,23 @@ int CmdEM410xSim(const char *Cmd)
 	uint8_t uid[5] = {0x00};
 
 	if (cmdp == 'h' || cmdp == 'H') {
-		PrintAndLog("Usage:  lf em4x 410xsim <UID>");
+		PrintAndLog("Usage:  lf em4x em410xsim <UID> <clock>");
 		PrintAndLog("");
-		PrintAndLog("     sample: lf em4x 410xsim 0F0368568B");
+		PrintAndLog("     sample: lf em4x em410xsim 0F0368568B");
 		return 0;
 	}
+	/* clock is 64 in EM410x tags */
+	uint8_t clock = 64;
 
 	if (param_gethex(Cmd, 0, uid, 10)) {
 		PrintAndLog("UID must include 10 HEX symbols");
 		return 0;
 	}
-	
-	PrintAndLog("Starting simulating UID %02X%02X%02X%02X%02X", uid[0],uid[1],uid[2],uid[3],uid[4]);
+	param_getdec(Cmd,1, &clock);
+
+	PrintAndLog("Starting simulating UID %02X%02X%02X%02X%02X  clock: %d", uid[0],uid[1],uid[2],uid[3],uid[4],clock);
 	PrintAndLog("Press pm3-button to about simulation");
 
-	/* clock is 64 in EM410x tags */
-	int clock = 64;
 
 	/* clear our graph */
 	ClearGraph(0);
@@ -194,21 +196,13 @@ int CmdEM410xWrite(const char *Cmd)
 	}
 
 	// Check Clock
-	if (card == 1)
-	{
-		// Default: 64
-		if (clock == 0)
-			clock = 64;
-
-		// Allowed clock rates: 16, 32 and 64
-		if ((clock != 16) && (clock != 32) && (clock != 64)) {
-			PrintAndLog("Error! Clock rate %d not valid. Supported clock rates are 16, 32 and 64.\n", clock);
-			return 0;
-		}
-	}
-	else if (clock != 0)
-	{
-		PrintAndLog("Error! Clock rate is only supported on T55x7 tags.\n");
+	// Default: 64
+	if (clock == 0)
+		clock = 64;
+
+	// Allowed clock rates: 16, 32, 40 and 64
+	if ((clock != 16) && (clock != 32) && (clock != 64) && (clock != 40)) {
+		PrintAndLog("Error! Clock rate %d not valid. Supported clock rates are 16, 32, 40 and 64.\n", clock);
 		return 0;
 	}
 
@@ -218,11 +212,11 @@ int CmdEM410xWrite(const char *Cmd)
 		//   provide for backwards-compatibility for older firmware, and to avoid
 		//   having to add another argument to CMD_EM410X_WRITE_TAG, we just store
 		//   the clock rate in bits 8-15 of the card value
-		card = (card & 0xFF) | (((uint64_t)clock << 8) & 0xFF00);
-	}
-	else if (card == 0)
+		card = (card & 0xFF) | ((clock << 8) & 0xFF00);
+	}	else if (card == 0) {
 		PrintAndLog("Writing %s tag with UID 0x%010" PRIx64, "T5555", id, clock);
-	else {
+		card = (card & 0xFF) | ((clock << 8) & 0xFF00);
+	} else {
 		PrintAndLog("Error! Bad card type selected.\n");
 		return 0;
 	}
@@ -323,6 +317,7 @@ int EM4x50Read(const char *Cmd, bool verbose)
 	uint32_t Code[6];
 	char tmp[6];
 	char tmp2[20];
+	int phaseoff;
 	high = low = 0;
 	memset(tmpbuff, 0, MAX_GRAPH_TRACE_LEN / 64);
 
@@ -396,9 +391,11 @@ int EM4x50Read(const char *Cmd, bool verbose)
 	startblock = i + 4;
 
 	// skip over the remainder of LW
-	skip += tmpbuff[i+1] + tmpbuff[i+2] + clk + clk/8;
-	int phaseoff = tmpbuff[i+3]-clk;
-
+	skip += tmpbuff[i+1] + tmpbuff[i+2] + clk;
+	if (tmpbuff[i+3]>clk) 
+		phaseoff = tmpbuff[i+3]-clk;
+	else
+		phaseoff = 0;
 	// now do it again to find the end
 	end = skip;
 	for (i += 3; i < j - 4 ; ++i) {
@@ -423,12 +420,6 @@ int EM4x50Read(const char *Cmd, bool verbose)
 			PrintAndLog("  or after a 'data askedge' command to clean up the read");
 			return 0;
 		}
-		if (!complete)
-		{
-			PrintAndLog("*** Warning!");
-			PrintAndLog("Partial data - no end found!");
-			PrintAndLog("Try again with more samples.");
-		}
 	} else if (start < 0) return 0;
 	start = skip;
 	snprintf(tmp2, sizeof(tmp2),"%d %d 1000 %d", clk, invert, clk*47);
@@ -451,10 +442,14 @@ int EM4x50Read(const char *Cmd, bool verbose)
 				if (tmpbuff[i+1] >= clk-tol)
 					break;
 		}
+		if (i >= j-4) break; //next LW not found
 		skip += clk;
-		phaseoff = tmpbuff[i+1]-clk;
+		if (tmpbuff[i+1]>clk)
+			phaseoff = tmpbuff[i+1]-clk;
+		else
+			phaseoff = 0;
 		i += 2;
-		if (ASKmanDemod(tmp2, false, false) < 1) {
+		if (ASKDemod(tmp2, false, false, 1) < 1) {
 			save_restoreGB(0);
 			return 0;
 		}
@@ -475,16 +470,22 @@ int EM4x50Read(const char *Cmd, bool verbose)
 	}
 	//print full code:
 	if (verbose || g_debugMode || AllPTest){
+		if (!complete) {
+			PrintAndLog("*** Warning!");
+			PrintAndLog("Partial data - no end found!");
+			PrintAndLog("Try again with more samples.");
+		}
 		PrintAndLog("Found data at sample: %i - using clock: %i", start, clk);    
 		end = block;
 		for (block=0; block < end; block++){
 			PrintAndLog("Block %d: %08x",block,Code[block]);
 		}
-		if (AllPTest)
+		if (AllPTest) {
 			PrintAndLog("Parities Passed");
-		else
+		} else {
 			PrintAndLog("Parities Failed");
 			PrintAndLog("Try cleaning the read samples with 'data askedge'");
+		}
 	}
 
 	//restore GraphBuffer
@@ -597,11 +598,11 @@ static command_t CommandTable[] =
 {
 	{"help", CmdHelp, 1, "This help"},
 	{"em410xdemod", CmdEMdemodASK, 0, "[findone] -- Extract ID from EM410x tag (option 0 for continuous loop, 1 for only 1 tag)"},  
-	{"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"},
-	{"em410xsim", CmdEM410xSim, 0, "<UID> -- Simulate EM410x tag"},
+	{"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag in GraphBuffer"},
+	{"em410xsim", CmdEM410xSim, 0, "<UID> [clock rate] -- Simulate EM410x tag"},
 	{"em410xwatch", CmdEM410xWatch, 0, "['h'] -- Watches for EM410x 125/134 kHz tags (option 'h' for 134)"},
 	{"em410xspoof", CmdEM410xWatchnSpoof, 0, "['h'] --- Watches for EM410x 125/134 kHz tags, and replays them. (option 'h' for 134)" },
-	{"em410xwrite", CmdEM410xWrite, 1, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
+	{"em410xwrite", CmdEM410xWrite, 0, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
 	{"em4x50read", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"},
 	{"readword", CmdReadWord, 1, "<Word> -- Read EM4xxx word data"},
 	{"readwordPWD", CmdReadWordPWD, 1, "<Word> <Password> -- Read EM4xxx word data in password mode"},