From: marshmellow42 <marshmellowrf@gmail.com>
Date: Sat, 17 Oct 2015 19:01:26 +0000 (-0400)
Subject: add wake option to t55xx read command
X-Git-Tag: v2.3.0~15^2~13
X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/8e99ec25edb501c00d1d0a9fc57709ff88f56495

add wake option to t55xx read command
---

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 21292088..67aec2c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
 ## [unreleased][unreleased]
 
 ### Added
+- `lf t55xx read w` added wake with password then read following stream option to standard t55xx read commands (marshmellow)
 - `hf iclass managekeys` to save, load and manage iclass keys.  (adjusted most commands to accept a loaded key in memory) (marshmellow)
 - `hf iclass readblk` to select, authenticate, and read 1 block from an iclass card (marshmellow)
 - `hf iclass writeblk` to select, authenticate, and write 1 block to an iclass card (or picopass) (marshmellow + others)
diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index 3a819edf..bbb062c0 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -975,7 +975,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			CopyIndala224toT55x7(c->d.asDwords[0], c->d.asDwords[1], c->d.asDwords[2], c->d.asDwords[3], c->d.asDwords[4], c->d.asDwords[5], c->d.asDwords[6]);
 			break;
 		case CMD_T55XX_READ_BLOCK:
-			T55xxReadBlock(c->arg[1], c->arg[2],c->d.asBytes[0]);
+			T55xxReadBlock(c->arg[0], c->arg[1], c->arg[2]);
 			break;
 		case CMD_T55XX_WRITE_BLOCK:
 			T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
diff --git a/armsrc/apps.h b/armsrc/apps.h
index aaace18b..d0be7503 100644
--- a/armsrc/apps.h
+++ b/armsrc/apps.h
@@ -80,7 +80,7 @@ void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo);
 void CopyIndala64toT55x7(int hi, int lo); // Clone Indala 64-bit tag by UID to T55x7
 void CopyIndala224toT55x7(int uid1, int uid2, int uid3, int uid4, int uid5, int uid6, int uid7); // Clone Indala 224-bit tag by UID to T55x7
 void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMode);
-void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode );
+void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd);
 void T55xxReadTrace(void);
 void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
 void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
diff --git a/armsrc/lfops.c b/armsrc/lfops.c
index cf04c31b..b5647edd 100644
--- a/armsrc/lfops.c
+++ b/armsrc/lfops.c
@@ -1202,9 +1202,10 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod
 }
 
 // Read one card block in page 0
-void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) {
+void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd) {
 	LED_A_ON();
-
+	uint8_t PwdMode = arg0 & 0xFF;
+	uint8_t wake = arg0 >> 8;
 	uint32_t i = 0;
 
 	//clear buffer now so it does not interfere with timing later
@@ -1237,17 +1238,21 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) {
 	T55xxWriteBit(1);
 	T55xxWriteBit(0); //Page 0
 
-	if (PwdMode == 1){
+	if (PwdMode || wake){
 		// Send Pwd
 		for (i = 0x80000000; i != 0; i >>= 1)
 			T55xxWriteBit(Pwd & i);
 	}
-	// Send a zero bit separation
-	T55xxWriteBit(0);
 
-	// Send Block number
-	for (i = 0x04; i != 0; i >>= 1)
-		T55xxWriteBit(Block & i);
+	// reading a block - send rest of read block cmd else skip for wake command
+	if (!wake) {
+		// Send a zero bit separation
+		T55xxWriteBit(0);
+
+		// Send Block number
+		for (i = 0x04; i != 0; i >>= 1)
+			T55xxWriteBit(Block & i);		
+	}
 
 	// Turn field on to read the response
 	TurnReadLFOn(READ_GAP);
diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c
index 2297d249..efa6c22d 100644
--- a/client/cmdlft55xx.c
+++ b/client/cmdlft55xx.c
@@ -121,12 +121,12 @@ static int CmdHelp(const char *Cmd);
 int CmdT55xxSetConfig(const char *Cmd) {
 
 	uint8_t offset = 0;
-	bool errors = FALSE;
-	uint8_t cmdp = 0;
 	char modulation[5] = {0x00};
 	char tmp = 0x00;
 	uint8_t bitRate = 0;
 	uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};
+	uint8_t cmdp = 0;
+	bool errors = FALSE;
 	while(param_getchar(Cmd, cmdp) != 0x00 && !errors)
 	{
 		tmp = param_getchar(Cmd, cmdp);
@@ -220,39 +220,72 @@ int CmdT55xxSetConfig(const char *Cmd) {
 }
 
 int CmdT55xxReadBlock(const char *Cmd) {
-	int block = -1;
-	int password = 0xFFFFFFFF; //default to blank Block 7
-	int override = 0;
-	char cmdp = param_getchar(Cmd, 0);
-	if (cmdp == 'h' || cmdp == 'H')
-		return usage_t55xx_read();
-
-	int res = sscanf(Cmd, "%d %x %d", &block, &password, &override);
-
-	if ( res < 1 || res > 3 )
-		return usage_t55xx_read();
-
-	if ((block < 0) || (block > 7)) {
+	uint8_t block = 255;
+	uint8_t wake = 0;
+	uint8_t usepwd = 0;
+	uint32_t password = 0xFFFFFFFF; //default to blank Block 7
+	uint8_t override = 0;
+	uint8_t cmdp = 0;
+	bool errors = false;
+	while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {
+		switch(param_getchar(Cmd, cmdp)) {
+		case 'h':
+		case 'H':
+			return usage_t55xx_read();
+		case 'b':
+		case 'B':
+			errors |= param_getdec(Cmd, cmdp+1, &block);
+			cmdp+=2;
+			break;
+		case 'o':
+		case 'O':
+			override = 1;
+			cmdp++;
+			break;
+		case 'p':
+		case 'P':
+			password = param_get32ex(Cmd, cmdp+1, 0, 10);
+			usepwd = 1;
+			cmdp+=2;
+			break;
+		case 'w':
+		case 'W':
+			wake = 1;
+			cmdp++;
+			break;
+		default:
+			PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
+			errors = true;
+			break;
+		}
+	}
+	if (errors) return usage_t55xx_read();
+	if (wake && !usepwd) {
+		PrintAndLog("Wake command must use a pwd");
+		return 1;
+	}
+	if ((block > 7) && !wake) {
 		PrintAndLog("Block must be between 0 and 7");
 		return 1;
 	}
 
-	UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, 0}};
-	c.d.asBytes[0] = 0x0;
+	UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, password}};
 
 	//Password mode
-	if ( res > 1 ) {
+	if ( usepwd || wake ) {
 		// try reading the config block and verify that PWD bit is set before doing this!
-		AquireData( CONFIGURATION_BLOCK );
-		if ( !tryDetectModulation() && !override) {
-			PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits.");
-			return 1;
-		} else if (override) {
-			PrintAndLog("Safety Check Overriden - proceeding despite risk");
-			c.arg[2] = password;
-			c.d.asBytes[0] = 0x1;
+		if ( wake || override ) {
+			c.arg[0] = (wake<<8) & usepwd;
+			if ( !wake && override )
+				PrintAndLog("Safety Check Overriden - proceeding despite risk");
 		} else {
-			PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password...");	
+			AquireData( CONFIGURATION_BLOCK );
+			if ( !tryDetectModulation() ) {
+				PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits.");
+				return 1;
+			} else {
+				PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password...");	
+			}
 		}
 	}
 
@@ -270,7 +303,11 @@ int CmdT55xxReadBlock(const char *Cmd) {
 	//DemodBufferLen=0;
 	if (!DecodeT55xxBlock()) return 3;
 	char blk[10]={0};
-	sprintf(blk,"%d", block);
+	if ( wake ) {
+		sprintf(blk,"wake");
+	} else {
+		sprintf(blk,"%d", block);
+	}
 	printT55xxBlock(blk);
 	return 0;
 }