X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/2a99a730556a54222ac653e803316a7839c7cb58..refs/pull/252/head:/client/cmdlft55xx.c?ds=sidebyside

diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c
index 348cb229..b287ce28 100644
--- a/client/cmdlft55xx.c
+++ b/client/cmdlft55xx.c
@@ -10,7 +10,8 @@
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
-//#include <time.h>  //not used - marshmellow
+#include <ctype.h>
+#include <time.h>
 #include "proxmark3.h"
 #include "ui.h"
 #include "graph.h"
@@ -22,8 +23,6 @@
 #include "util.h"
 #include "data.h"
 #include "lfdemod.h"
-//#include "../common/crc.h"  //not used - marshmellow
-//#include "../common/iso14443crc.h" //not used - marshmellow
 #include "cmdhf14a.h" //for getTagInfo
 
 #define T55x7_CONFIGURATION_BLOCK 0x00
@@ -33,7 +32,7 @@
 #define REGULAR_READ_MODE_BLOCK 0xFF
 
 // Default configuration
-t55xx_conf_block_t config = { .modulation = DEMOD_ASK, .inverted = FALSE, .offset = 0x00, .block0 = 0x00, .Q5 = FALSE };
+t55xx_conf_block_t config = { .modulation = DEMOD_ASK, .inverted = false, .offset = 0x00, .block0 = 0x00, .Q5 = false };
 
 t55xx_conf_block_t Get_t55xx_Config(){
 	return config;
@@ -51,6 +50,7 @@ int usage_t55xx_config(){
 	PrintAndLog("       i [1]                         Invert data signal, defaults to normal");
 	PrintAndLog("       o [offset]                    Set offset, where data should start decode in bitstream");
 	PrintAndLog("       Q5                            Set as Q5(T5555) chip instead of T55x7");
+	PrintAndLog("       ST                            Set Sequence Terminator on");
 	PrintAndLog("");
 	PrintAndLog("Examples:");
 	PrintAndLog("      lf t55xx config d FSK          - FSK demodulation");
@@ -78,7 +78,7 @@ int usage_t55xx_read(){
 	return 0;
 }
 int usage_t55xx_write(){
-	PrintAndLog("Usage:  lf t55xx wr [b <block>] [d <data>] [p <password>] [1]");
+	PrintAndLog("Usage:  lf t55xx write [b <block>] [d <data>] [p <password>] [1]");
 	PrintAndLog("Options:");
 	PrintAndLog("     b <block>    - block number to write. Between 0-7");
 	PrintAndLog("     d <data>     - 4 bytes of data to write (8 hex characters)");
@@ -86,8 +86,8 @@ int usage_t55xx_write(){
 	PrintAndLog("     1            - OPTIONAL write Page 1 instead of Page 0");
 	PrintAndLog("");
 	PrintAndLog("Examples:");
-	PrintAndLog("      lf t55xx wr b 3 d 11223344            - write 11223344 to block 3");
-	PrintAndLog("      lf t55xx wr b 3 d 11223344 p feedbeef - write 11223344 to block 3 password feedbeef");
+	PrintAndLog("      lf t55xx write b 3 d 11223344            - write 11223344 to block 3");
+	PrintAndLog("      lf t55xx write b 3 d 11223344 p feedbeef - write 11223344 to block 3 password feedbeef");
 	PrintAndLog("");
 	return 0;
 }
@@ -196,7 +196,7 @@ int CmdT55xxSetConfig(const char *Cmd) {
 	uint8_t bitRate = 0;
 	uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};
 	uint8_t cmdp = 0;
-	bool errors = FALSE;
+	bool errors = false;
 	while(param_getchar(Cmd, cmdp) != 0x00 && !errors)
 	{
 		tmp = param_getchar(Cmd, cmdp);
@@ -215,7 +215,7 @@ int CmdT55xxSetConfig(const char *Cmd) {
 						break;
 					}
 				}
-				if (i==9) errors = TRUE;
+				if (i==9) errors = true;
 			}
 			cmdp+=2;
 			break;
@@ -255,7 +255,7 @@ int CmdT55xxSetConfig(const char *Cmd) {
 				config.inverted=0;
 			} else {
 				PrintAndLog("Unknown modulation '%s'", modulation);
-				errors = TRUE;
+				errors = true;
 			}
 			break;
 		case 'i':
@@ -270,12 +270,17 @@ int CmdT55xxSetConfig(const char *Cmd) {
 			break;
 		case 'Q':
 		case 'q':		
-			config.Q5 = TRUE;
+			config.Q5 = true;
+			cmdp++;
+			break;
+		case 'S':
+		case 's':		
+			config.ST = true;
 			cmdp++;
 			break;
 		default:
 			PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
-			errors = TRUE;
+			errors = true;
 			break;
 		}
 	}
@@ -373,34 +378,35 @@ bool DecodeT55xxBlock(){
 	char buf[30] = {0x00};
 	char *cmdStr = buf;
 	int ans = 0;
+	bool ST = config.ST;
 	uint8_t bitRate[8] = {8,16,32,40,50,64,100,128};
 	DemodBufferLen = 0x00;
 
 	switch( config.modulation ){
 		case DEMOD_FSK:
 			snprintf(cmdStr, sizeof(buf),"%d %d", bitRate[config.bitrate], config.inverted );
-			ans = FSKrawDemod(cmdStr, FALSE);
+			ans = FSKrawDemod(cmdStr, false);
 			break;
 		case DEMOD_FSK1:
 		case DEMOD_FSK1a:
 			snprintf(cmdStr, sizeof(buf),"%d %d 8 5", bitRate[config.bitrate], config.inverted );
-			ans = FSKrawDemod(cmdStr, FALSE);
+			ans = FSKrawDemod(cmdStr, false);
 			break;
 		case DEMOD_FSK2:
 		case DEMOD_FSK2a:
 			snprintf(cmdStr, sizeof(buf),"%d %d 10 8", bitRate[config.bitrate], config.inverted );
-			ans = FSKrawDemod(cmdStr, FALSE);
+			ans = FSKrawDemod(cmdStr, false);
 			break;
 		case DEMOD_ASK:
 			snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );
-			ans = ASKDemod(cmdStr, FALSE, FALSE, 1);
+			ans = ASKDemod_ext(cmdStr, false, false, 1, &ST);
 			break;
 		case DEMOD_PSK1:
 			// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
 			save_restoreGB(1);
 			CmdLtrim("160");
 			snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );
-			ans = PSKDemod(cmdStr, FALSE);
+			ans = PSKDemod(cmdStr, false);
 			//undo trim samples
 			save_restoreGB(0);
 			break;
@@ -410,22 +416,22 @@ bool DecodeT55xxBlock(){
 			save_restoreGB(1);
 			CmdLtrim("160");
 			snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );
-			ans = PSKDemod(cmdStr, FALSE);
+			ans = PSKDemod(cmdStr, false);
 			psk1TOpsk2(DemodBuffer, DemodBufferLen);
 			//undo trim samples
 			save_restoreGB(0);
 			break;
 		case DEMOD_NRZ:
 			snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );
-			ans = NRZrawDemod(cmdStr, FALSE);
+			ans = NRZrawDemod(cmdStr, false);
 			break;
 		case DEMOD_BI:
 		case DEMOD_BIa:
 			snprintf(cmdStr, sizeof(buf),"0 %d %d 1", bitRate[config.bitrate], config.inverted );
-			ans = ASKbiphaseDemod(cmdStr, FALSE);
+			ans = ASKbiphaseDemod(cmdStr, false);
 			break;
 		default:
-			return FALSE;
+			return false;
 	}
 	return (bool) ans;
 }
@@ -434,13 +440,13 @@ bool DecodeT5555TraceBlock() {
 	DemodBufferLen = 0x00;
 	
 	// According to datasheet. Always: RF/64, not inverted, Manchester
-	return (bool) ASKDemod("64 0 1", FALSE, FALSE, 1);
+	return (bool) ASKDemod("64 0 1", false, false, 1);
 }
 
 int CmdT55xxDetect(const char *Cmd){
-	bool errors = FALSE;
-	bool useGB = FALSE;
-	bool usepwd = FALSE;
+	bool errors = false;
+	bool useGB = false;
+	bool usepwd = false;
 	uint32_t password = 0;
 	uint8_t cmdp = 0;
 
@@ -452,12 +458,12 @@ int CmdT55xxDetect(const char *Cmd){
 		case 'p':
 		case 'P':
 			password = param_get32ex(Cmd, cmdp+1, 0, 16);
-			usepwd = TRUE;
+			usepwd = true;
 			cmdp += 2;
 			break;
 		case '1':
 			// use Graphbuffer data
-			useGB = TRUE;
+			useGB = true;
 			cmdp++;
 			break;
 		default:
@@ -485,80 +491,87 @@ bool tryDetectModulation(){
 	t55xx_conf_block_t tests[15];
 	int bitRate=0;
 	uint8_t fc1 = 0, fc2 = 0, clk=0;
-
-	if (GetFskClock("", FALSE, FALSE)){ 
-		fskClocks(&fc1, &fc2, &clk, FALSE);
-		if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+	if (GetFskClock("", false, false)){ 
+		fskClocks(&fc1, &fc2, &clk, false);
+		if ( FSKrawDemod("0 0", false) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 			tests[hits].modulation = DEMOD_FSK;
 			if (fc1==8 && fc2 == 5)
 				tests[hits].modulation = DEMOD_FSK1a;
  			else if (fc1==10 && fc2 == 8)
 				tests[hits].modulation = DEMOD_FSK2;
 			tests[hits].bitrate = bitRate;
-			tests[hits].inverted = FALSE;
+			tests[hits].inverted = false;
 			tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+			tests[hits].ST = false;
 			++hits;
 		}
-		if ( FSKrawDemod("0 1", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+		if ( FSKrawDemod("0 1", false) && test(DEMOD_FSK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 			tests[hits].modulation = DEMOD_FSK;
 			if (fc1 == 8 && fc2 == 5)
 				tests[hits].modulation = DEMOD_FSK1;
 			else if (fc1 == 10 && fc2 == 8)
 				tests[hits].modulation = DEMOD_FSK2a;
 			tests[hits].bitrate = bitRate;
-			tests[hits].inverted = TRUE;
+			tests[hits].inverted = true;
 			tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+			tests[hits].ST = false;
 			++hits;
 		}
 	} else {
-		clk = GetAskClock("", FALSE, FALSE);
+		clk = GetAskClock("", false, false);
 		if (clk>0) {
-			if ( ASKDemod("0 0 1", FALSE, FALSE, 1) && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+			tests[hits].ST = true;
+			if ( ASKDemod_ext("0 0 1", false, false, 1, &tests[hits].ST) && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 				tests[hits].modulation = DEMOD_ASK;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = FALSE;
+				tests[hits].inverted = false;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
 				++hits;
 			}
-			if ( ASKDemod("0 1 1", FALSE, FALSE, 1)  && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+			tests[hits].ST = true;
+			if ( ASKDemod_ext("0 1 1", false, false, 1, &tests[hits].ST)  && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 				tests[hits].modulation = DEMOD_ASK;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = TRUE;
+				tests[hits].inverted = true;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
 				++hits;
 			}
-			if ( ASKbiphaseDemod("0 0 0 2", FALSE) && test(DEMOD_BI, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5) ) {
+			if ( ASKbiphaseDemod("0 0 0 2", false) && test(DEMOD_BI, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5) ) {
 				tests[hits].modulation = DEMOD_BI;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = FALSE;
+				tests[hits].inverted = false;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+				tests[hits].ST = false;
 				++hits;
 			}
-			if ( ASKbiphaseDemod("0 0 1 2", FALSE) && test(DEMOD_BIa, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5) ) {
+			if ( ASKbiphaseDemod("0 0 1 2", false) && test(DEMOD_BIa, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5) ) {
 				tests[hits].modulation = DEMOD_BIa;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = TRUE;
+				tests[hits].inverted = true;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+				tests[hits].ST = false;
 				++hits;
 			}
 		}
 		//undo trim from ask
 		//save_restoreGB(0);
-		clk = GetNrzClock("", FALSE, FALSE);
+		clk = GetNrzClock("", false, false);
 		if (clk>0) {
-			if ( NRZrawDemod("0 0 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+			if ( NRZrawDemod("0 0 1", false)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 				tests[hits].modulation = DEMOD_NRZ;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = FALSE;
+				tests[hits].inverted = false;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+				tests[hits].ST = false;
 				++hits;
 			}
 
-			if ( NRZrawDemod("0 1 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+			if ( NRZrawDemod("0 1 1", false)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 				tests[hits].modulation = DEMOD_NRZ;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = TRUE;
+				tests[hits].inverted = true;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+				tests[hits].ST = false;
 				++hits;
 			}
 		}
@@ -567,41 +580,45 @@ bool tryDetectModulation(){
 		// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
 		save_restoreGB(1);
 		CmdLtrim("160");
-		clk = GetPskClock("", FALSE, FALSE);
+		clk = GetPskClock("", false, false);
 		if (clk>0) {
-			if ( PSKDemod("0 0 6", FALSE) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+			if ( PSKDemod("0 0 6", false) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 				tests[hits].modulation = DEMOD_PSK1;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = FALSE;
+				tests[hits].inverted = false;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+				tests[hits].ST = false;
 				++hits;
 			}
-			if ( PSKDemod("0 1 6", FALSE) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
+			if ( PSKDemod("0 1 6", false) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {
 				tests[hits].modulation = DEMOD_PSK1;
 				tests[hits].bitrate = bitRate;
-				tests[hits].inverted = TRUE;
+				tests[hits].inverted = true;
 				tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+				tests[hits].ST = false;
 				++hits;
 			}
 			// PSK2 - needs a call to psk1TOpsk2.
-			if ( PSKDemod("0 0 6", FALSE)) {
+			if ( PSKDemod("0 0 6", false)) {
 				psk1TOpsk2(DemodBuffer, DemodBufferLen);
 				if (test(DEMOD_PSK2, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)){
 					tests[hits].modulation = DEMOD_PSK2;
 					tests[hits].bitrate = bitRate;
-					tests[hits].inverted = FALSE;
+					tests[hits].inverted = false;
 					tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+					tests[hits].ST = false;
 					++hits;
 				}
 			} // inverse waves does not affect this demod
 			// PSK3 - needs a call to psk1TOpsk2.
-			if ( PSKDemod("0 0 6", FALSE)) {
+			if ( PSKDemod("0 0 6", false)) {
 				psk1TOpsk2(DemodBuffer, DemodBufferLen);
 				if (test(DEMOD_PSK3, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)){
 					tests[hits].modulation = DEMOD_PSK3;
 					tests[hits].bitrate = bitRate;
-					tests[hits].inverted = FALSE;
+					tests[hits].inverted = false;
 					tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);
+					tests[hits].ST = false;
 					++hits;
 				}
 			} // inverse waves does not affect this demod
@@ -616,8 +633,9 @@ bool tryDetectModulation(){
 		config.offset = tests[0].offset;
 		config.block0 = tests[0].block0;
 		config.Q5 = tests[0].Q5;
+		config.ST = tests[0].ST;
 		printConfiguration( config );
-		return TRUE;
+		return true;
 	}
 	
 	if ( hits > 1) {
@@ -627,68 +645,68 @@ bool tryDetectModulation(){
 			printConfiguration( tests[i] );
 		}
 	}
-	return FALSE;
+	return false;
 }
 
 bool testModulation(uint8_t mode, uint8_t modread){
 	switch( mode ){
 		case DEMOD_FSK:
-			if (modread >= DEMOD_FSK1 && modread <= DEMOD_FSK2a) return TRUE;
+			if (modread >= DEMOD_FSK1 && modread <= DEMOD_FSK2a) return true;
 			break;
 		case DEMOD_ASK:
-			if (modread == DEMOD_ASK) return TRUE;
+			if (modread == DEMOD_ASK) return true;
 			break;
 		case DEMOD_PSK1:
-			if (modread == DEMOD_PSK1) return TRUE;
+			if (modread == DEMOD_PSK1) return true;
 			break;
 		case DEMOD_PSK2:
-			if (modread == DEMOD_PSK2) return TRUE;
+			if (modread == DEMOD_PSK2) return true;
 			break;
 		case DEMOD_PSK3:
-			if (modread == DEMOD_PSK3) return TRUE;
+			if (modread == DEMOD_PSK3) return true;
 			break;
 		case DEMOD_NRZ:
-			if (modread == DEMOD_NRZ) return TRUE;
+			if (modread == DEMOD_NRZ) return true;
 			break;
 		case DEMOD_BI:
-			if (modread == DEMOD_BI) return TRUE;
+			if (modread == DEMOD_BI) return true;
 			break;
 		case DEMOD_BIa:
-			if (modread == DEMOD_BIa) return TRUE;
+			if (modread == DEMOD_BIa) return true;
 			break;		
 		default:
-			return FALSE;
+			return false;
 	}
-	return FALSE;
+	return false;
 }
 
 bool testQ5Modulation(uint8_t	mode, uint8_t	modread){
 	switch( mode ){
 		case DEMOD_FSK:
-			if (modread >= 4 && modread <= 5) return TRUE;
+			if (modread >= 4 && modread <= 5) return true;
 			break;
 		case DEMOD_ASK:
-			if (modread == 0) return TRUE;
+			if (modread == 0) return true;
 			break;
 		case DEMOD_PSK1:
-			if (modread == 1) return TRUE;
+			if (modread == 1) return true;
 			break;
 		case DEMOD_PSK2:
-			if (modread == 2) return TRUE;
+			if (modread == 2) return true;
 			break;
 		case DEMOD_PSK3:
-			if (modread == 3) return TRUE;
+			if (modread == 3) return true;
 			break;
 		case DEMOD_NRZ:
-			if (modread == 7) return TRUE;
+			if (modread == 7) return true;
 			break;
 		case DEMOD_BI:
-			if (modread == 6) return TRUE;
+			if (modread == 6) return true;
 			break;
 		default:
-			return FALSE;
+			return false;
 	}
-	return FALSE;
+	return false;
 }
 
 int convertQ5bitRate(uint8_t bitRateRead) {
@@ -702,7 +720,7 @@ int convertQ5bitRate(uint8_t bitRateRead) {
 
 bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t	clk){
 
-	if ( DemodBufferLen < 64 ) return FALSE;
+	if ( DemodBufferLen < 64 ) return false;
 	uint8_t si = 0;
 	for (uint8_t idx = 28; idx < 64; idx++){
 		si = idx;
@@ -735,9 +753,9 @@ bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t	clk){
 		if (*fndBitRate < 0) continue;
 		*offset = idx;
 
-		return TRUE;
+		return true;
 	}
-	return FALSE;
+	return false;
 }
 
 bool testBitRate(uint8_t readRate, uint8_t clk){
@@ -750,7 +768,7 @@ bool testBitRate(uint8_t readRate, uint8_t clk){
 
 bool test(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk, bool *Q5){
 
-	if ( DemodBufferLen < 64 ) return FALSE;
+	if ( DemodBufferLen < 64 ) return false;
 	uint8_t si = 0;
 	for (uint8_t idx = 28; idx < 64; idx++){
 		si = idx;
@@ -768,28 +786,28 @@ bool test(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk, bool *Q5)
 		uint8_t extend   = PackBits(si, 1, DemodBuffer); si += 1;     //bit 15 extended mode
 		uint8_t modread  = PackBits(si, 5, DemodBuffer); si += 5+2+1; 
 		//uint8_t pskcr   = PackBits(si, 2, DemodBuffer); si += 2+1;  //could check psk cr
-		uint8_t nml01    = PackBits(si, 1, DemodBuffer); si += 1+5;   //bit 24, 30, 31 could be tested for 0 if not extended mode
-		uint8_t nml02    = PackBits(si, 2, DemodBuffer); si += 2;
+		//uint8_t nml01    = PackBits(si, 1, DemodBuffer); si += 1+5;   //bit 24, 30, 31 could be tested for 0 if not extended mode
+		//uint8_t nml02    = PackBits(si, 2, DemodBuffer); si += 2;
 		
 		//if extended mode
-		bool extMode =( (safer == 0x6 || safer == 0x9) && extend) ? TRUE : FALSE;
+		bool extMode =( (safer == 0x6 || safer == 0x9) && extend) ? true : false;
 
 		if (!extMode){
-			if (nml01 || nml02 || xtRate) continue;
+			if (xtRate) continue;  //nml01 || nml02 ||  caused issues on noralys tags
 		}
 		//test modulation
 		if (!testModulation(mode, modread)) continue;
 		if (!testBitRate(bitRate, clk)) continue;
 		*fndBitRate = bitRate;
 		*offset = idx;
-		*Q5 = FALSE;
-		return TRUE;
+		*Q5 = false;
+		return true;
 	}
 	if (testQ5(mode, offset, fndBitRate, clk)) {
-		*Q5 = TRUE;
-		return TRUE;
+		*Q5 = true;
+		return true;
 	}
-	return FALSE;
+	return false;
 }
 
 void printT55xxBlock(const char *blockNum){
@@ -839,6 +857,7 @@ int printConfiguration( t55xx_conf_block_t b){
 	PrintAndLog("Bit Rate   : %s", GetBitRateStr(b.bitrate) );
 	PrintAndLog("Inverted   : %s", (b.inverted) ? "Yes" : "No" );
 	PrintAndLog("Offset     : %d", b.offset);
+	PrintAndLog("Seq. Term. : %s", (b.ST) ? "Yes" : "No" );
 	PrintAndLog("Block0     : 0x%08X", b.block0);
 	PrintAndLog("");
 	return 0;
@@ -1371,11 +1390,9 @@ int CmdT55xxBruteForce(const char *Cmd) {
 	char buf[9];
 	char filename[FILE_PATH_SIZE]={0};
 	int keycnt = 0;
+	int ch;
 	uint8_t stKeyBlock = 20;
-	uint8_t *keyBlock = NULL, *p;
-	keyBlock = calloc(stKeyBlock, 6);
-	if (keyBlock == NULL) return 1;
-
+	uint8_t *keyBlock = NULL, *p = NULL;
 	uint32_t start_password = 0x00000000; //start password
 	uint32_t end_password   = 0xFFFFFFFF; //end   password
 	bool found = false;
@@ -1383,6 +1400,9 @@ int CmdT55xxBruteForce(const char *Cmd) {
 	char cmdp = param_getchar(Cmd, 0);
 	if (cmdp == 'h' || cmdp == 'H') return usage_t55xx_bruteforce();
 
+	keyBlock = calloc(stKeyBlock, 6);
+	if (keyBlock == NULL) return 1;
+
 	if (cmdp == 'i' || cmdp == 'I') {
 
 		int len = strlen(Cmd+2);
@@ -1417,6 +1437,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
 				if (!p) {
 					PrintAndLog("Cannot allocate memory for defaultKeys");
 					free(keyBlock);
+					fclose(f);
 					return 2;
 				}
 				keyBlock = p;
@@ -1431,6 +1452,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
 		
 		if (keycnt == 0) {
 			PrintAndLog("No keys found in file");
+			free(keyBlock);
 			return 1;
 		}
 		PrintAndLog("Loaded %d keys", keycnt);
@@ -1440,8 +1462,10 @@ int CmdT55xxBruteForce(const char *Cmd) {
 		for (uint16_t c = 0; c < keycnt; ++c ) {
 
 			if (ukbhit()) {
-				getchar();
+				ch = getchar();
+				(void)ch;
 				printf("\naborted via keyboard!\n");
+				free(keyBlock);
 				return 0;
 			}
 
@@ -1449,8 +1473,9 @@ int CmdT55xxBruteForce(const char *Cmd) {
 
 			PrintAndLog("Testing %08X", testpwd);
 
-			if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, TRUE, testpwd)) {
+			if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, testpwd)) {
 				PrintAndLog("Aquireing data from device failed. Quitting");
+				free(keyBlock);
 				return 0;
 			}
 
@@ -1458,10 +1483,12 @@ int CmdT55xxBruteForce(const char *Cmd) {
 
 			if ( found ) {
 				PrintAndLog("Found valid password: [%08X]", testpwd);
+				free(keyBlock);
 				return 0;
 			}
 		}
 		PrintAndLog("Password NOT found.");
+		free(keyBlock);
 		return 0;
 	}
 
@@ -1471,8 +1498,10 @@ int CmdT55xxBruteForce(const char *Cmd) {
 	start_password = param_get32ex(Cmd, 0, 0, 16);
 	end_password = param_get32ex(Cmd, 1, 0, 16);
 
-	if ( start_password >= end_password ) return usage_t55xx_bruteforce();
-
+	if ( start_password >= end_password ) {
+		free(keyBlock);
+		return usage_t55xx_bruteforce();
+	}
 	PrintAndLog("Search password range [%08X -> %08X]", start_password, end_password);
 
 	uint32_t i = start_password;
@@ -1482,13 +1511,16 @@ int CmdT55xxBruteForce(const char *Cmd) {
 		printf(".");
 		fflush(stdout);
 		if (ukbhit()) {
-			getchar();
+			ch = getchar();
+			(void)ch;
 			printf("\naborted via keyboard!\n");
+			free(keyBlock);
 			return 0;
 		}
 
-		if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, TRUE, i)) {
+		if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, i)) {
 			PrintAndLog("Aquireing data from device failed. Quitting");
+			free(keyBlock);
 			return 0;
 		}
 		found = tryDetectModulation();
@@ -1503,6 +1535,8 @@ int CmdT55xxBruteForce(const char *Cmd) {
 		PrintAndLog("Found valid password: [%08x]", i);
 	else
 		PrintAndLog("Password NOT found. Last tried: [%08x]", --i);
+
+	free(keyBlock);
 	return 0;
 }