X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/aebe77905baf1f22cdf83e6abf2135a1b6e4d46c..046fd7660898dfc48ea917a3cab5448d292f144e:/client/cmdhf.c

diff --git a/client/cmdhf.c b/client/cmdhf.c
index dc843eae..1a088676 100644
--- a/client/cmdhf.c
+++ b/client/cmdhf.c
@@ -36,7 +36,6 @@ int CmdHFTune(const char *Cmd)
   return 0;
 }
 
-
 void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
 {
 	switch(cmd[0])
@@ -87,9 +86,15 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
 	case MIFARE_MAGICWIPEC:			snprintf(exp,size,"MAGIC WIPEC"); break;
 	case MIFARE_ULC_AUTH_1 :		snprintf(exp,size,"AUTH "); break;
 	case MIFARE_ULC_AUTH_2 : 		snprintf(exp,size,"AUTH_ANSW"); break;
-	case MIFARE_ULEV1_AUTH :		snprintf(exp,size,"PWD-AUTH"); break;
+	case MIFARE_ULEV1_AUTH :	
+		if ( cmdsize == 7 )
+			snprintf(exp,size,"PWD-AUTH KEY: 0x%02x%02x%02x%02x", cmd[1], cmd[2], cmd[3], cmd[4] );
+		else
+			snprintf(exp,size,"PWD-AUTH");
+		break;
+
 	case MIFARE_ULEV1_FASTREAD : {
-		if ( cmdsize >=3 && cmd[2] < 0x21)
+		if ( cmdsize >=3 && cmd[2] <= 0xE6)
 			snprintf(exp,size,"READ RANGE (%d-%d)",cmd[1],cmd[2]); 
 		else
 			snprintf(exp,size,"?");
@@ -449,11 +454,11 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 	if (data_len > 2) {
 		switch (protocol) {
 			case ICLASS:
-			crcStatus = iclass_CRC_check(isResponse, frame, data_len);
+				crcStatus = iclass_CRC_check(isResponse, frame, data_len);
 				break;
 			case ISO_14443B:
 			case TOPAZ:
-			crcStatus = iso14443B_CRC_check(isResponse, frame, data_len);
+				crcStatus = iso14443B_CRC_check(isResponse, frame, data_len);
 				break;
 			case ISO_14443A:
 				crcStatus = iso14443A_CRC_check(isResponse, frame, data_len);
@@ -467,7 +472,6 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 	//2 Not crc-command
 
 	//--- Draw the data column
-	//char line[16][110];
 	char line[16][110];
 
 	for (int j = 0; j < data_len && j/16 < 16; j++) {
@@ -484,27 +488,22 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 		} else {
 			snprintf(line[j/16]+(( j % 16) * 4),110, "%02x  ", frame[j]);
 		}
-
 	}
 
 	if (markCRCBytes) {
-		if(crcStatus == 0 || crcStatus == 1)
-	{//CRC-command
+		//CRC-command
+		if(crcStatus == 0 || crcStatus == 1) {
 			char *pos1 = line[(data_len-2)/16]+(((data_len-2) % 16) * 4);
-		(*pos1) = '[';
+			(*pos1) = '[';
 			char *pos2 = line[(data_len)/16]+(((data_len) % 16) * 4);
 			sprintf(pos2, "%c", ']');
 		}
 	}
 
-	if(data_len == 0)
-	{
-		if(data_len == 0){
-			sprintf(line[0],"<empty trace - possible error>");
-		}
+	if(data_len == 0){
+		sprintf(line[0],"<empty trace - possible error>");
 	}
 	//--- Draw the CRC column
-
 	char *crc = (crcStatus == 0 ? "!crc" : (crcStatus == 1 ? " ok " : "    "));
 
 	EndOfTransmissionTimestamp = timestamp + duration;
@@ -531,9 +530,9 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 				(j == num_lines-1) ? crc : "    ",
 				(j == num_lines-1) ? explanation : "");
 		} else {
-			PrintAndLog("           |           |     | %-64s| %s| %s",
+			PrintAndLog("            |            |     |%-64s | %s| %s",
 				line[j],
-				(j == num_lines-1)?crc:"    ",
+				(j == num_lines-1) ? crc : "    ",
 				(j == num_lines-1) ? explanation : "");
 		}
 	}
@@ -542,7 +541,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
 	
 	if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) {
 		uint32_t next_timestamp = *((uint32_t *)(trace + tracepos));
-			PrintAndLog(" %9d | %9d | %s | fdt (Frame Delay Time): %d",
+			PrintAndLog(" %10d | %10d | %s |fdt (Frame Delay Time): %d",
 				(EndOfTransmissionTimestamp - first_timestamp),
 				(next_timestamp - first_timestamp),
 				"   ",
@@ -656,6 +655,32 @@ int CmdHFList(const char *Cmd)
 	return 0;
 }
 
+int CmdHFSearch(const char *Cmd){
+	int ans = 0;
+	PrintAndLog("");
+	ans = CmdHF14AReader("s");
+	if (ans > 0) {
+		PrintAndLog("\nValid ISO14443A Tag Found - Quiting Search\n");
+		return ans;
+	} 
+	ans = HFiClassReader("", false, false);
+	if (ans) {
+		PrintAndLog("\nValid iClass Tag (or PicoPass Tag) Found - Quiting Search\n");
+		return ans;
+	}
+	ans = HF15Reader("", false);
+	if (ans) {
+		PrintAndLog("\nValid ISO15693 Tag Found - Quiting Search\n");
+		return ans;
+	}
+
+
+	//14b has issues currently...
+	//ans = CmdHF14BRead(Cmd);
+	//if (ans > 0) return ans;	
+
+	return 0;
+}
 
 static command_t CommandTable[] = 
 {
@@ -672,6 +697,7 @@ static command_t CommandTable[] =
   {"topaz",			CmdHFTopaz,		1, "{ TOPAZ (NFC Type 1) RFIDs... }"},
   {"tune",			CmdHFTune,      0, "Continuously measure HF antenna tuning"},
   {"list",			CmdHFList,      1, "List protocol data in trace buffer"},
+  {"search",      CmdHFSearch,      1, "Search for known HF tags [preliminary]"},
 	{NULL, NULL, 0, NULL}
 };