From: iceman1001 <iceman@iuse.se>
Date: Mon, 26 Sep 2016 10:58:11 +0000 (+0200)
Subject: CHG: and now that I do actually check on bitlenght, I can get a better annotation... 
X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/7c91c8bf24e2879751a23232b84077f459ee8789?ds=inline;hp=-c

CHG: and now that I do actually check on bitlenght, I can get a better annotation yet again. Looking at it raises a question, acknowledge is 0x19 or 0x39, they just don't match up with tagtype identification of  0x0D, 0x1D, 0x39.  I'll need to look at a 1024 tags response in a trace with a valid reader.
---

7c91c8bf24e2879751a23232b84077f459ee8789
diff --git a/client/cmdhf.c b/client/cmdhf.c
index 798f0e14..6701bee1 100644
--- a/client/cmdhf.c
+++ b/client/cmdhf.c
@@ -370,19 +370,20 @@ void annotateIso14443b(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize) {
 // 1 = read
 // 0 = write
 // Quite simpel tag
-void annotateLegic(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){
-	
-	uint8_t bitsend = cmd[0];
-	
+void annotateLegic(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){	
+	uint8_t bitsend = cmd[0];	
 	switch (bitsend){
 		case 7:
 			snprintf(exp, size, "IV 0x%02X", cmd[1]);
 			break;
 		case 6: {
-			if ( cmd[1] == LEGIC_HSK_22 ) 
-				snprintf(exp, size, "MIM22");
-			if ( cmd[1] == LEGIC_HSK_256 ) 
-				snprintf(exp, size, "MIN256/1024");			
+			switch ( cmd[1] ) {
+				case LEGIC_MIM_22:	 snprintf(exp, size, "MIM22"); break;
+				case LEGIC_MIM_256:	 snprintf(exp, size, "MIM256"); break;
+				case LEGIC_MIM_1024: snprintf(exp, size, "MIM1024"); break;
+				case LEGIC_ACK_22:	 snprintf(exp, size, "ACK 22"); break;
+				case LEGIC_ACK_256:	 snprintf(exp, size, "ACK 256/1024"); break;
+			}
 			break;
 		}
 		case 9:
@@ -681,14 +682,20 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 		}
 	}
 
-	if (data_len == 0 )
+	if (data_len == 0 ) {
 		sprintf(line[0],"<empty trace - possible error>");
+		return tracepos;
+	}
 
-	//--- Draw the CRC column
+	// Draw the CRC column
 	char *crc = (crcStatus == 0 ? "!crc" : (crcStatus == 1 ? " ok " : "    "));
 
 	EndOfTransmissionTimestamp = timestamp + duration;
 
+	// Always annotate LEGIC read/tag
+	if ( protocol == LEGIC )
+		annotateLegic(explanation,sizeof(explanation),frame,data_len);
+	
 	if (!isResponse)	{
 		switch(protocol) {
 			case ICLASS:		annotateIclass(explanation,sizeof(explanation),frame,data_len); break;
@@ -697,7 +704,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 			case ISO_14443B:	annotateIso14443b(explanation,sizeof(explanation),frame,data_len); break;
 			case TOPAZ:			annotateTopaz(explanation,sizeof(explanation),frame,data_len); break;
 			case ISO_7816_4:	annotateIso7816(explanation,sizeof(explanation),frame,data_len); break;
-			case LEGIC:			annotateLegic(explanation,sizeof(explanation),frame,data_len); break;
+
 			default:			break;
 		}
 	}
diff --git a/common/protocols.h b/common/protocols.h
index 38c72fc0..6ac6bc78 100644
--- a/common/protocols.h
+++ b/common/protocols.h
@@ -326,8 +326,11 @@ ISO 7816-4 Basic interindustry commands. For command APDU's.
 #define     MFDES_AUTHENTICATION_FRAME 		 0xAF
 
 // LEGIC Commands
-#define 	LEGIC_HSK_22	0x19
-#define 	LEGIC_HSK_256	0x39
+#define		LEGIC_MIM_22	0x0D
+#define		LEGIC_MIM_256	0x1D
+#define		LEGIC_MIM_1024	0x3D
+#define 	LEGIC_ACK_22	0x19
+#define 	LEGIC_ACK_256	0x39
 #define		LEGIC_READ		0x01
 #define 	LEGIC_WRITE		0x00