X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f9eeab99a40339f16155688dd834b013dfc74b3a..713f5d019c07c048e9f7b0afc1c91995dc616ea3:/client/cmdhflegic.c?ds=sidebyside

diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c
index 155d2759..3cc6c406 100644
--- a/client/cmdhflegic.c
+++ b/client/cmdhflegic.c
@@ -149,7 +149,16 @@ int usage_legic_esave(void){
 	PrintAndLog("      hf legic esave 2 myfile");
 	return 0;
 }
-
+int usage_legic_wipe(void){
+	PrintAndLog("Fills a legic tag memory with zeros. From byte7 and to the end.");
+	PrintAndLog(" Usage:  hf legic wipe [h]");
+	PrintAndLog("Options:");
+	PrintAndLog("      h             : this help");
+	PrintAndLog("");
+	PrintAndLog("Samples:");	
+	PrintAndLog("      hf legic wipe");
+	return 0;
+}
 /*
  *  Output BigBuf and deobfuscate LEGIC RF tag data.
  *  This is based on information given in the talk held
@@ -627,14 +636,13 @@ int CmdLegicRfWrite(const char *Cmd) {
 		PrintAndLog("############# DANGER ################");
 		PrintAndLog("# changing the DCF is irreversible  #");
 		PrintAndLog("#####################################");
-		PrintAndLog("do you really want to continue? y(es) n(o)");		
-		char answer;
-		sscanf("%c", &answer);
-		bool exit = !(answer == 'n' || answer == 'N');
-		if (exit)
+		char *answer = NULL;
+		answer = readline("do you really want to continue? y(es) n(o) : ");
+		bool overwrite = (answer[0] == 'y' || answer[0] == 'Y');
+		if (!overwrite){
+			PrintAndLog("command cancelled");
 			return 0;
-		printf("ICE DCF:  %c answer, %d\n", answer, exit);
-		return 0;
+		}
 	}
 	
 	legic_chk_iv(&IV);
@@ -1174,6 +1182,61 @@ int CmdLegicESave(const char *Cmd) {
 	return 0;
 }
 
+int CmdLegicWipe(const char *Cmd){
+
+	char cmdp = param_getchar(Cmd, 0);
+	
+	if ( cmdp == 'h' || cmdp == 'H') return usage_legic_wipe();
+	
+	// tagtype
+	legic_card_select_t card;
+	if (legic_get_type(&card)) {
+		PrintAndLog("Failed to identify tagtype");
+		return 1;
+	}
+	
+	// set up buffer
+	uint8_t *data = malloc(card.cardsize);
+	if (!data) {
+		PrintAndLog("Fail, cannot allocate memory");
+		return 2;		
+	}
+	memset(data, 0, card.cardsize);
+	
+	legic_print_type(card.cardsize, 0);
+
+	printf("Erasing");
+	
+	// transfer to device
+	size_t len = 0;
+	UsbCommand c = {CMD_WRITER_LEGIC_RF, {0, 0, 0x55}};
+	UsbCommand resp;
+	for(size_t i = 7; i < card.cardsize; i += USB_CMD_DATA_SIZE) {
+		
+		printf(".");
+		len = MIN((card.cardsize - i), USB_CMD_DATA_SIZE);		
+		c.arg[0] = i; // offset
+		c.arg[1] = len; // number of bytes
+		memcpy(c.d.asBytes, data+i, len); 
+		clearCommandBuffer();
+		SendCommand(&c);
+	
+		if (!WaitForResponseTimeout(CMD_ACK, &resp, 4000)) {
+			PrintAndLog("command execution time out");
+			free(data);	
+			return 3;
+		}
+		uint8_t isOK = resp.arg[0] & 0xFF;
+		if ( !isOK ) {
+			PrintAndLog("failed writing tag [msg = %u]", resp.arg[1] & 0xFF);
+			free(data);	
+			return 4;
+		}
+	}
+	printf("ok\n");
+	return 0;
+}
+
 int CmdLegicList(const char *Cmd) {
 	CmdHFList("legic");
 	return 0;
@@ -1192,6 +1255,7 @@ static command_t CommandTable[] =  {
 	{"eload",	CmdLegicELoad,		1, "Load binary dump to emulator memory"},
 	{"esave",	CmdLegicESave,		1, "Save emulator memory to binary file"},
 	{"list",	CmdLegicList,		1, "[Deprecated] List LEGIC history"},
+	{"wipe",	CmdLegicWipe,		1, "Wipe a LEGIC Prime tag"},
 	{NULL, NULL, 0, NULL}
 };