X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/65c2d21d05bc22181206d32e985d2c0920200da1..0db11b71efad3781186cc2da9f31686a6562d065:/armsrc/mifarecmd.c

diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c
index 7fa3f525..c68a50e5 100644
--- a/armsrc/mifarecmd.c
+++ b/armsrc/mifarecmd.c
@@ -771,7 +771,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
 
 	uint32_t auth1_time, auth2_time;
-	static uint16_t delta_time;
+	static uint16_t delta_time = 0;
 
 	LED_A_ON();
 	LED_C_OFF();
@@ -822,12 +822,8 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 				rtr--;
 				continue;
 			};
+			auth2_time = (delta_time) ? auth1_time + delta_time : 0;
 
-			if (delta_time) {
-				auth2_time = auth1_time + delta_time;
-			} else {
-				auth2_time = 0;
-			}
 			if(mifare_classic_authex(pcs, cuid, blockNo, keyType, ui64Key, AUTH_NESTED, &nt2, &auth2_time)) {
 				if (MF_DBGLEVEL >= 1)	Dbprintf("Nested: Auth2 error");
 				rtr--;
@@ -836,7 +832,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 
 			nttmp = prng_successor(nt1, 100);				//NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160
 			for (i = 101; i < 1200; i++) {
-				nttmp = prng_successor(nttmp, 1);
+				nttmp = prng_successor_one(nttmp);
 				if (nttmp == nt2) break;
 			}
 
@@ -896,6 +892,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 
 			// nested authentication
 			auth2_time = auth1_time + delta_time;
+
 			len = mifare_sendcmd_short(pcs, AUTH_NESTED, 0x60 + (targetKeyType & 0x01), targetBlockNo, receivedAnswer, par, &auth2_time);
 			if (len != 4) {
 				if (MF_DBGLEVEL >= 1)	Dbprintf("Nested: Auth2 error len=%d", len);
@@ -906,14 +903,18 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 			if (MF_DBGLEVEL >= 3) Dbprintf("Nonce#%d: Testing nt1=%08x nt2enc=%08x nt2par=%02x", i+1, nt1, nt2, par[0]);
 			
 			// Parity validity check
-			for (j = 0; j < 4; j++) {
-				par_array[j] = (oddparity8(receivedAnswer[j]) != ((par[0] >> (7-j)) & 0x01));
-			}
+//			for (j = 0; j < 4; j++) {
+//				par_array[j] = (oddparity8(receivedAnswer[j]) != ((par[0] >> (7-j)) & 0x01));
+//			}
+			par_array[0] = (oddparity8(receivedAnswer[0]) != ((par[0] >> (7-0)) & 0x01));
+			par_array[1] = (oddparity8(receivedAnswer[1]) != ((par[0] >> (7-1)) & 0x01));
+			par_array[2] = (oddparity8(receivedAnswer[2]) != ((par[0] >> (7-2)) & 0x01));
+			par_array[3] = (oddparity8(receivedAnswer[3]) != ((par[0] >> (7-3)) & 0x01));
 			
 			ncount = 0;
 			nttest = prng_successor(nt1, dmin - 1);
 			for (j = dmin; j < dmax + 1; j++) {
-				nttest = prng_successor(nttest, 1);
+				nttest = prng_successor_one(nttest);
 				ks1 = nt2 ^ nttest;
 
 				if (valid_nonce(nttest, nt2, ks1, par_array)){
@@ -942,7 +943,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 	//  ----------------------------- crypto1 destroy
 	crypto1_destroy(pcs);
 	
-	byte_t buf[4 + 4 * 4];
+	byte_t buf[4 + 4 * 4] = {0};
 	memcpy(buf, &cuid, 4);
 	memcpy(buf+4, &target_nt[0], 4);
 	memcpy(buf+8, &target_ks[0], 4);
@@ -986,9 +987,9 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	int OLD_MF_DBGLEVEL = MF_DBGLEVEL;	
 	MF_DBGLEVEL = MF_DBG_NONE;
 	
+	LEDsoff();
 	LED_A_ON();
-	LED_B_OFF();
-	LED_C_OFF();
+	
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	if (clearTrace) 
@@ -997,8 +998,6 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	set_tracing(TRUE);
 
 	for (i = 0; i < keyCount; ++i) {
-		if (mifare_classic_halt(pcs, cuid))
-			if (MF_DBGLEVEL >= 1)	Dbprintf("ChkKeys: Halt error");
 
 		if (!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {
 			if (OLD_MF_DBGLEVEL >= 1)	Dbprintf("ChkKeys: Can't select card");
@@ -1006,19 +1005,23 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 		}
 
 		ui64Key = bytes_to_num(datain + i * 6, 6);
-		if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST))
+		if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) {
+			if (mifare_classic_halt(pcs, cuid))
+				if (MF_DBGLEVEL >= 1)	Dbprintf("ChkKeys: Halt error");
 			continue;
+		}
 		
 		isOK = 1;
 		break;
 	}
-	crypto1_destroy(pcs);
 	
 	LED_B_ON();
     cmd_send(CMD_ACK,isOK,0,0,datain + i * 6,6);
+
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
 	set_tracing(FALSE);
+	crypto1_destroy(pcs);
 	
 	// restore debug level
 	MF_DBGLEVEL = OLD_MF_DBGLEVEL;	
@@ -1169,15 +1172,15 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
 	uint8_t workFlags = arg0;
 	uint8_t blockNo = arg1;
 	
-	Dbprintf("ICE :: CSetBlocks Flags %02x", workFlags);
-	
 	// variables
+	bool isOK = false; //assume we will get an error
+	uint8_t errormsg = 0x00;
 	uint8_t uid[10] = {0x00};
 	uint8_t data[18] = {0x00};
 	uint32_t cuid = 0;
 	
-	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
-	uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];
+	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
+	uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};
 
 	if (workFlags & MAGIC_INIT) {
 		LED_A_ON();
@@ -1187,65 +1190,83 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
 		set_tracing(TRUE);
 	}
 
-	// read UID and return to client
-	if (workFlags & MAGIC_UID) {
-		if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("Can't select card");
-			OnErrorMagic(MAGIC_UID);
+	//loop doesn't loop just breaks out if error
+	while (true) {
+		// read UID and return to client with write
+		if (workFlags & MAGIC_UID) {
+			if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("Can't select card");
+				errormsg = MAGIC_UID;
+				// break;
+			}
+			
+			if ( mifare_classic_halt_ex(NULL) ) break;
 		}
-	}
 	
-	// wipe tag, fill it with zeros
-	if (workFlags & MAGIC_WIPE){
-		ReaderTransmitBitsPar(wupC1,7,0, NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC1 error");
-			OnErrorMagic(MAGIC_WIPE);
-		}
+		// wipe tag, fill it with zeros
+		if (workFlags & MAGIC_WIPE){
+			ReaderTransmitBitsPar(wupC1,7,0, NULL);
+			if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC1 error");
+				errormsg = MAGIC_WIPE;
+				break;
+			}
 
-		ReaderTransmit(wipeC, sizeof(wipeC), NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wipeC error");
-			OnErrorMagic(MAGIC_WIPE);
-		}
-	}	
+			ReaderTransmit(wipeC, sizeof(wipeC), NULL);
+			if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wipeC error");
+				errormsg = MAGIC_WIPE;
+				break;
+			}
 
-	// write block
-	if (workFlags & MAGIC_WUPC) {
-		ReaderTransmitBitsPar(wupC1,7,0, NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC1 error");
-			OnErrorMagic(MAGIC_WUPC);
-		}
+			if ( mifare_classic_halt_ex(NULL) ) break;
+		}	
+
+		// write block
+		if (workFlags & MAGIC_WUPC) {
+			ReaderTransmitBitsPar(wupC1,7,0, NULL);
+			if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC1 error");
+				errormsg = MAGIC_WUPC;
+				break;
+			}
 
-		ReaderTransmit(wupC2, sizeof(wupC2), NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC2 error");
-			OnErrorMagic(MAGIC_WUPC);
+			ReaderTransmit(wupC2, sizeof(wupC2), NULL);
+			if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC2 error");
+				errormsg = MAGIC_WUPC;
+				break;
+			}
 		}
-	}
 
-	if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) {
-		if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("write block send command error");
-		OnErrorMagic(4);
-	}
+		if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) {
+			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("write block send command error");
+			errormsg = 4;
+			break;
+		}
 	
-	memcpy(data, datain, 16);
-	AppendCrc14443a(data, 16);
+		memcpy(data, datain, 16);
+		AppendCrc14443a(data, 16);
 	
-	ReaderTransmit(data, sizeof(data), NULL);
-	if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) {
-		if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("write block send data error");
-		OnErrorMagic(0);
-	}	
-	
-	if (workFlags & MAGIC_OFF) 
-		mifare_classic_halt_ex(NULL);
+		ReaderTransmit(data, sizeof(data), NULL);
+		if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) {
+			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("write block send data error");
+			errormsg = 0;
+			break;
+		}	
 	
-	LED_B_ON();
-	// check if uid is cuid?
-	cmd_send(CMD_ACK,1,0,0,uid,sizeof(uid));
-	LED_B_OFF();
+		if (workFlags & MAGIC_OFF) 
+			if ( mifare_classic_halt_ex(NULL) ) break;
+		
+		isOK = true;
+		break;
+
+	} // end while	
+
+	if (isOK )
+		cmd_send(CMD_ACK,1,0,0,uid,sizeof(uid));
+	else
+		OnErrorMagic(errormsg);
 
 	if (workFlags & MAGIC_OFF)
 		OnSuccessMagic();
@@ -1255,11 +1276,13 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
     
 	uint8_t workFlags = arg0;
 	uint8_t blockNo = arg1;
-
+	uint8_t errormsg = 0x00;
+	bool isOK = false; //assume we will get an error
+	
 	// variables
 	uint8_t data[MAX_MIFARE_FRAME_SIZE];
-	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
-	uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];
+	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
+	uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};
 	
 	memset(data, 0x00, sizeof(data));
 	
@@ -1271,42 +1294,51 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
 		set_tracing(TRUE);
 	}
 
-	if (workFlags & MAGIC_WUPC) {
-		ReaderTransmitBitsPar(wupC1,7,0, NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
-			OnErrorMagic(MAGIC_WUPC);
+	//loop doesn't loop just breaks out if error or done
+	while (true) {
+		if (workFlags & MAGIC_WUPC) {
+			ReaderTransmitBitsPar(wupC1,7,0, NULL);
+			if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
+				errormsg = MAGIC_WUPC;
+				break;
+			}
+
+			ReaderTransmit(wupC2, sizeof(wupC2), NULL);
+			if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+				if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");
+				errormsg = MAGIC_WUPC;
+				break;
+			}
 		}
 
-		ReaderTransmit(wupC2, sizeof(wupC2), NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");
-			OnErrorMagic(MAGIC_WUPC);
+		// read block		
+		if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {
+			if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");
+			errormsg = 0;
+			break;
 		}
-	}
+		
+		memcpy(data, receivedAnswer, sizeof(data));
+		
+		// send HALT
+		if (workFlags & MAGIC_HALT)
+			mifare_classic_halt_ex(NULL);
 
-	// read block		
-	if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {
-		if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");
-		OnErrorMagic(0);
+		isOK = true;
+		break;
 	}
-	
-	memcpy(data, receivedAnswer, sizeof(data));
-	
-	// send HALT
-	if (workFlags & MAGIC_HALT) 
-		mifare_classic_halt_ex(NULL);
-	
-	LED_B_ON();
-	
 	// if MAGIC_DATAIN, the data stays on device side.
-	if (workFlags & MAGIC_DATAIN)
-		memcpy(datain, data, sizeof(data));
-	else
-		cmd_send(CMD_ACK,1,0,0,data,sizeof(data));
+	if (workFlags & MAGIC_DATAIN) {
+		if (isOK)
+			memcpy(datain, data, sizeof(data));
+	} else {
+		if (isOK) 
+			cmd_send(CMD_ACK,1,0,0,data,sizeof(data));	
+		else 
+			OnErrorMagic(errormsg);	
+	}
 	
-	LED_B_OFF();
-
 	if (workFlags & MAGIC_OFF)
 		OnSuccessMagic();
 }