X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/97d582a69235c88c8f30a88193769dbddb74e9b1..c8dd9b092edd38d71c179c5691a6f22f20b0a016:/client/cmdhfmf.c

diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c
index 80d93a46..6d0bebd7 100644
--- a/client/cmdhfmf.c
+++ b/client/cmdhfmf.c
@@ -667,12 +667,15 @@ int CmdHF14AMfRestore(const char *Cmd)
 	}
 	if ((fkeys = fopen("dumpkeys.bin","rb")) == NULL) {
 		PrintAndLog("Could not find file dumpkeys.bin");
+		fclose(fdump);
 		return 1;
 	}
 	
 	for (sectorNo = 0; sectorNo < numSectors; sectorNo++) {
 		if (fread(keyA[sectorNo], 1, 6, fkeys) == 0) {
 			PrintAndLog("File reading error (dumpkeys.bin).");
+			fclose(fdump);
+			fclose(fkeys);
 			return 2;
 		}
 	}
@@ -680,9 +683,12 @@ int CmdHF14AMfRestore(const char *Cmd)
 	for (sectorNo = 0; sectorNo < numSectors; sectorNo++) {
 		if (fread(keyB[sectorNo], 1, 6, fkeys) == 0) {
 			PrintAndLog("File reading error (dumpkeys.bin).");
+			fclose(fdump);
+			fclose(fkeys);
 			return 2;
 		}
 	}
+	fclose(fkeys);
 
 	PrintAndLog("Restoring dumpdata.bin to card");
 
@@ -693,6 +699,7 @@ int CmdHF14AMfRestore(const char *Cmd)
 			
 			if (fread(bldata, 1, 16, fdump) == 0) {
 				PrintAndLog("File reading error (dumpdata.bin).");
+				fclose(fdump);
 				return 2;
 			}
 					
@@ -727,7 +734,6 @@ int CmdHF14AMfRestore(const char *Cmd)
 	}
 	
 	fclose(fdump);
-	fclose(fkeys);
 	return 0;
 }
 
@@ -1888,7 +1894,6 @@ int CmdHF14AMfSniff(const char *Cmd){
 	uint8_t atqa[2];
 	uint8_t sak;
 	bool isTag;
-	uint32_t parity;
 	uint8_t buf[3000];
 	uint8_t * bufPtr = buf;
 	memset(buf, 0x00, 3000);
@@ -1955,14 +1960,17 @@ int CmdHF14AMfSniff(const char *Cmd){
 				printf(">\n");
 				PrintAndLog("received trace len: %d packages: %d", blockLen, pckNum);
 				num = 0;
-				while (bufPtr - buf + 9 < blockLen) {
-					isTag = bufPtr[3] & 0x80 ? true:false;
-					bufPtr += 4;
-					parity = *((uint32_t *)(bufPtr));
-					bufPtr += 4;
-					len = bufPtr[0];
-					bufPtr++;
-					if ((len == 14) && (bufPtr[0] == 0xff) && (bufPtr[1] == 0xff)) {
+				while (bufPtr - buf < blockLen) {
+					bufPtr += 6;	// ignore void timing information
+					len = *((uint16_t *)bufPtr);
+					if(len & 0x8000) {
+						isTag = true;
+						len &= 0x7fff;
+					} else {
+						isTag = false;
+					}
+					bufPtr += 2;
+					if ((len == 14) && (bufPtr[0] == 0xff) && (bufPtr[1] == 0xff) && (bufPtr[12] == 0xff) && (bufPtr[13] == 0xff)) {
 						memcpy(uid, bufPtr + 2, 7);
 						memcpy(atqa, bufPtr + 2 + 7, 2);
 						uid_len = (atqa[0] & 0xC0) == 0x40 ? 7 : 4;
@@ -1981,9 +1989,10 @@ int CmdHF14AMfSniff(const char *Cmd){
 					} else {
 						PrintAndLog("%s(%d):%s", isTag ? "TAG":"RDR", num, sprint_hex(bufPtr, len));
 						if (wantLogToFile) AddLogHex(logHexFileName, isTag ? "TAG: ":"RDR: ", bufPtr, len);
-						if (wantDecrypt) mfTraceDecode(bufPtr, len, parity, wantSaveToEmlFile);
+						if (wantDecrypt) mfTraceDecode(bufPtr, len, wantSaveToEmlFile);
 					}
 					bufPtr += len;
+					bufPtr += ((len-1)/8+1);	// ignore parity
 					num++;
 				}
 			}