X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/92623113b43d1f36cb72e61b8ce29ac74cf7db71..refs/pull/58/head:/client/cmdhf.c

diff --git a/client/cmdhf.c b/client/cmdhf.c
index a55c41b2..07a4aa49 100644
--- a/client/cmdhf.c
+++ b/client/cmdhf.c
@@ -157,9 +157,28 @@ NXP/Philips CUSTOM COMMANDS
 #define MIFARE_ULC_AUTH_1       0x1A
 #define MIFARE_ULC_AUTH_2        0xAF
 
+/**
+06 00 = INITIATE
+0E xx = SELECT ID (xx = Chip-ID)
+0B = Get UID
+08 yy = Read Block (yy = block number)
+09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written)
+0C = Reset to Inventory
+0F = Completion
+0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate)
+**/
+
 #define ISO14443B_REQB         0x05
 #define ISO14443B_ATTRIB       0x1D
 #define ISO14443B_HALT         0x50
+#define ISO14443B_INITIATE     0x06
+#define ISO14443B_SELECT       0x0E
+#define ISO14443B_GET_UID      0x0B
+#define ISO14443B_READ_BLK     0x08
+#define ISO14443B_WRITE_BLK    0x09
+#define ISO14443B_RESET        0x0C
+#define ISO14443B_COMPLETION   0x0F
+#define ISO14443B_AUTHENTICATE 0x0A
 
 //First byte is 26
 #define ISO15693_INVENTORY     0x01
@@ -287,13 +306,33 @@ void annotateIso15693(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
 		}
 	}
 }
+
+/**
+06 00 = INITIATE
+0E xx = SELECT ID (xx = Chip-ID)
+0B = Get UID
+08 yy = Read Block (yy = block number)
+09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written)
+0C = Reset to Inventory
+0F = Completion
+0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate)
+**/
+
 void annotateIso14443b(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
 {
 	switch(cmd[0]){
 	case ISO14443B_REQB   : snprintf(exp,size,"REQB");break;
 	case ISO14443B_ATTRIB : snprintf(exp,size,"ATTRIB");break;
 	case ISO14443B_HALT   : snprintf(exp,size,"HALT");break;
-	default:                snprintf(exp,size ,"?");break;
+	case ISO14443B_INITIATE     : snprintf(exp,size,"INITIATE");break;
+	case ISO14443B_SELECT       : snprintf(exp,size,"SELECT(%d)",cmd[1]);break;
+	case ISO14443B_GET_UID      : snprintf(exp,size,"GET UID");break;
+	case ISO14443B_READ_BLK     : snprintf(exp,size,"READ_BLK(%d)", cmd[1]);break;
+	case ISO14443B_WRITE_BLK    : snprintf(exp,size,"WRITE_BLK(%d)",cmd[1]);break;
+	case ISO14443B_RESET        : snprintf(exp,size,"RESET");break;
+	case ISO14443B_COMPLETION   : snprintf(exp,size,"COMPLETION");break;
+	case ISO14443B_AUTHENTICATE : snprintf(exp,size,"AUTHENTICATE");break;
+	default                     : snprintf(exp,size ,"?");break;
 	}
 
 }
@@ -412,15 +451,18 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 	if (tracepos + data_len + parity_len > traceLen) {
 		return traceLen;
 	}
-
 	uint8_t *frame = trace + tracepos;
 	tracepos += data_len;
 	uint8_t *parityBytes = trace + tracepos;
 	tracepos += parity_len;
 
+
 	//--- Draw the data column
+	//char line[16][110];
 	char line[16][110];
-	for (int j = 0; j < data_len; j++) {
+
+	for (int j = 0; j < data_len && j/16 < 16; j++) {
+
 		int oddparity = 0x01;
 		int k;
 
@@ -429,11 +471,17 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 		}
 
 		uint8_t parityBits = parityBytes[j>>3];
-
 		if (isResponse && (oddparity != ((parityBits >> (7-(j&0x0007))) & 0x01))) {
-			sprintf(line[j/16]+((j%16)*4), "%02x! ", frame[j]);
+			snprintf(line[j/16]+(( j % 16) * 4),110, "%02x! ", frame[j]);
+
 		} else {
-			sprintf(line[j/16]+((j%16)*4), "%02x  ", frame[j]);
+			snprintf(line[j/16]+(( j % 16) * 4),110, "%02x! ", frame[j]);
+		}
+	}
+	if(data_len == 0)
+	{
+		if(data_len == 0){
+			sprintf(line[0],"<empty trace - possible error>");
 		}
 	}
 	//--- Draw the CRC column
@@ -478,8 +526,8 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 			annotateIso14443b(explanation,sizeof(explanation),frame,data_len);
 	}
 
-	int num_lines = (data_len - 1)/16 + 1;
-	for (int j = 0; j < num_lines; j++) {
+	int num_lines = MIN((data_len - 1)/16 + 1, 16);
+	for (int j = 0; j < num_lines ; j++) {
 		if (j == 0) {
 			PrintAndLog(" %9d | %9d | %s | %-64s| %s| %s",
 				(timestamp - first_timestamp),