X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f8ada309e9e521b0e57f67fad111ae1500b660f4..484b2b741d999b77017299fb8be40ac5df40a371:/armsrc/mifarecmd.c

diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c
index a77a2dd3..4c1fe1b6 100644
--- a/armsrc/mifarecmd.c
+++ b/armsrc/mifarecmd.c
@@ -34,9 +34,9 @@ void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	
 	// variables
 	byte_t isOK = 0;
-	byte_t dataoutbuf[16];
-	uint8_t uid[10];
-	uint32_t cuid;
+	byte_t dataoutbuf[16] = {0x00};
+	uint8_t uid[10] = {0x00};
+	uint32_t cuid = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
@@ -44,6 +44,7 @@ void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
+	set_tracing(true);
 
 	LED_A_ON();
 	LED_B_OFF();
@@ -96,6 +97,7 @@ void MifareUC_Auth(uint8_t arg0, uint8_t *keybytes){
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
+	set_tracing(true);
 
 	if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {
 		if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");
@@ -131,6 +133,7 @@ void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain)
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
+	set_tracing(true);
 
 	int len = iso14443a_select_card(NULL, NULL, NULL, true, 0);
 	if(!len) {
@@ -193,8 +196,8 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	// variables
 	byte_t isOK = 0;
 	byte_t dataoutbuf[16 * 16];
-	uint8_t uid[10];
-	uint32_t cuid;
+	uint8_t uid[10] = {0x00};
+	uint32_t cuid = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
@@ -202,7 +205,8 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
-
+	set_tracing(true);
+	
 	LED_A_ON();
 	LED_B_OFF();
 	LED_C_OFF();
@@ -258,7 +262,8 @@ void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain)
 	// free eventually allocated BigBuf memory
 	BigBuf_free();
 	clear_trace();
-
+	set_tracing(true);
+	
 	// params
 	uint8_t blockNo = arg0;
 	uint16_t blocks = arg1;
@@ -352,15 +357,15 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	uint8_t blockNo = arg0;
 	uint8_t keyType = arg1;
 	uint64_t ui64Key = 0;
-	byte_t blockdata[16];
+	byte_t blockdata[16] = {0x00};
 
 	ui64Key = bytes_to_num(datain, 6);
 	memcpy(blockdata, datain + 10, 16);
 	
 	// variables
 	byte_t isOK = 0;
-	uint8_t uid[10];
-	uint32_t cuid;
+	uint8_t uid[10] = {0x00};
+	uint32_t cuid = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
@@ -368,7 +373,8 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
-
+	set_tracing(true);
+	
 	LED_A_ON();
 	LED_B_OFF();
 	LED_C_OFF();
@@ -426,6 +432,7 @@ void MifareUWriteBlockCompat(uint8_t arg0, uint8_t *datain)
 	LED_A_ON(); LED_B_OFF(); LED_C_OFF();
 
 	clear_trace();
+	set_tracing(true);
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	if(!iso14443a_select_card(uid, NULL, NULL, true, 0)) {
@@ -473,7 +480,8 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain)
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
-
+	set_tracing(true);
+	
 	if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {
 		if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");
 		OnError(0);
@@ -532,7 +540,8 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	clear_trace();
-
+	set_tracing(true);
+	
 	if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {
 		if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");
 		OnError(0);
@@ -607,18 +616,18 @@ int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity) {
 void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags, uint8_t *datain)
 {
 	uint64_t ui64Key = 0;
-	uint8_t uid[10];
-	uint32_t cuid;
+	uint8_t uid[10] = {0x00};
+	uint32_t cuid = 0;
 	uint8_t cascade_levels = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
-	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
+	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
 	int16_t isOK = 0;
-	uint8_t par_enc[1];
+	uint8_t par_enc[1] = {0x00};
 	uint8_t nt_par_enc = 0;
-	uint8_t buf[USB_CMD_DATA_SIZE];
-	uint32_t timeout;
+	uint8_t buf[USB_CMD_DATA_SIZE] = {0x00};
+	uint32_t timeout = 0;
 	
 	uint8_t blockNo = arg0 & 0xff;
 	uint8_t keyType = (arg0 >> 8) & 0xff;
@@ -747,19 +756,19 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 	
 	// variables
 	uint16_t rtr, i, j, len;
-	uint16_t davg;
+	uint16_t davg = 0;
 	static uint16_t dmin, dmax;
-	uint8_t uid[10];
-	uint32_t cuid, nt1, nt2, nttmp, nttest, ks1;
-	uint8_t par[1];
-	uint32_t target_nt[2], target_ks[2];
+	uint8_t uid[10] = {0x00};
+	uint32_t cuid = 0, nt1, nt2, nttmp, nttest, ks1;
+	uint8_t par[1] = {0x00};
+	uint32_t target_nt[2] = {0x00}, target_ks[2] = {0x00};
 	
-	uint8_t par_array[4];
+	uint8_t par_array[4] = {0x00};
 	uint16_t ncount = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
-	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
+	uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
 
 	uint32_t auth1_time, auth2_time;
 	static uint16_t delta_time;
@@ -967,8 +976,8 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	// variables
 	int i;
 	byte_t isOK = 0;
-	uint8_t uid[10];
-	uint32_t cuid;
+	uint8_t uid[10] = {0x00};
+	uint32_t cuid = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
@@ -982,35 +991,31 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	LED_C_OFF();
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
-	if (clearTrace) clear_trace();
+	if (clearTrace) 
+		clear_trace();
+	
 	set_tracing(TRUE);
 
-	for (i = 0; i < keyCount; i++) {
-		if(mifare_classic_halt(pcs, cuid)) {
+	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 (!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {
 			if (OLD_MF_DBGLEVEL >= 1)	Dbprintf("ChkKeys: Can't select card");
 			break;
-		};
+		}
 
 		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))
 			continue;
-		};
 		
 		isOK = 1;
 		break;
 	}
-	
-	//  ----------------------------- crypto1 destroy
 	crypto1_destroy(pcs);
 	
 	LED_B_ON();
     cmd_send(CMD_ACK,isOK,0,0,datain + i * 6,6);
-	LED_B_OFF();
-
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
 	set_tracing(FALSE);
@@ -1043,13 +1048,13 @@ void MifareEMemClr(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
 
 void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
 	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
-	//emlSetMem(datain, arg0, arg1); // data, block num, blocks count	 
+	if (arg2==0) arg2 = 16; // backwards compat... default bytewidth
 	emlSetMem_xt(datain, arg0, arg1, arg2); // data, block num, blocks count, block byte width
 }
 
 void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
 	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
-	byte_t buf[USB_CMD_DATA_SIZE];
+	byte_t buf[USB_CMD_DATA_SIZE] = {0x00};
 	emlGetMem(buf, arg0, arg1); // data, block num, blocks count (max 4)
 
 	LED_B_ON();
@@ -1065,15 +1070,15 @@ void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 	uint8_t numSectors = arg0;
 	uint8_t keyType = arg1;
 	uint64_t ui64Key = 0;
-	uint32_t cuid;
+	uint32_t cuid = 0;
 	struct Crypto1State mpcs = {0, 0};
 	struct Crypto1State *pcs;
 	pcs = &mpcs;
 
 	// variables
-	byte_t dataoutbuf[16];
-	byte_t dataoutbuf2[16];
-	uint8_t uid[10];
+	byte_t dataoutbuf[16] = {0x00};
+	byte_t dataoutbuf2[16] = {0x00};
+	uint8_t uid[10] = {0x00};
 
 	LED_A_ON();
 	LED_B_OFF();
@@ -1111,7 +1116,7 @@ void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 				isOK = false;
 				if (MF_DBGLEVEL >= 1)	Dbprintf("Error reading sector %2d block %2d", sectorNo, blockNo);
 				break;
-			};
+			}
 			if (isOK) {
 				if (blockNo < NumBlocksPerSector(sectorNo) - 1) {
 					emlSetMem(dataoutbuf, FirstBlockOfSector(sectorNo) + blockNo, 1);
@@ -1125,9 +1130,9 @@ void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 
 	}
 
-	if(mifare_classic_halt(pcs, cuid)) {
-		if (MF_DBGLEVEL >= 1)	Dbprintf("Halt error");
-	};
+	if(mifare_classic_halt(pcs, cuid))
+		if (MF_DBGLEVEL >= 1)
+			Dbprintf("Halt error");
 
 	//  ----------------------------- crypto1 destroy
 	crypto1_destroy(pcs);
@@ -1164,15 +1169,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;
+	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();
@@ -1182,65 +1187,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;
+		}	
 
-		ReaderTransmit(wupC2, sizeof(wupC2), NULL);
-		if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-			if (MF_DBGLEVEL >= MF_DBG_ERROR)	Dbprintf("wupC2 error");
-			OnErrorMagic(MAGIC_WUPC);
-		};
-	}
+		// 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;
+			}
 
-	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);
-	};
-	
-	memcpy(data, datain, 16);
-	AppendCrc14443a(data, 16);
+			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");
+			errormsg = 4;
+			break;
+		}
 	
-	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);
-	};	
+		memcpy(data, datain, 16);
+		AppendCrc14443a(data, 16);
 	
-	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();
@@ -1250,11 +1273,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));
 	
@@ -1266,42 +1291,52 @@ 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");
-			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;
+			}
+		}
 
-	// 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);
-	};
-	
-	memcpy(data, receivedAnswer, sizeof(data));
-	
-	// send HALT
-	if (workFlags & MAGIC_HALT) 
-		mifare_classic_halt_ex(NULL);
-	
-	LED_B_ON();
-	
+		// 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);
+			break;
+		}
+		isOK = true;
+		break;
+	}
 	// 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();
 }
@@ -1309,19 +1344,19 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
 void MifareCIdent(){
 	
 	// variables
-	byte_t isOK = 1;	
-	uint8_t receivedAnswer[1];
-	uint8_t receivedAnswerPar[1];
+	bool isOK = true;	
+	uint8_t receivedAnswer[1] = {0x00};
+	uint8_t receivedAnswerPar[1] = {0x00};
 
 	ReaderTransmitBitsPar(wupC1,7,0, NULL);
 	if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-		isOK = 0;
-	};
+		isOK = false;
+	}
 
 	ReaderTransmit(wupC2, sizeof(wupC2), NULL);
 	if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-		isOK = 0;
-	};
+		isOK = false;
+	}
 
 	// removed the if,  since some magic tags misbehavies and send an answer to it.
 	mifare_classic_halt(NULL, 0);
@@ -1348,12 +1383,13 @@ void MifareCollectNonces(uint32_t arg0, uint32_t arg1){
 
 void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain){
 
-	byte_t dataout[11] = {0x00};
+	byte_t dataout[12] = {0x00};
 	uint8_t uid[10] = {0x00};
-	uint32_t cuid = 0x00;
+	uint32_t cuid = 0;
     
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 	clear_trace();
+	set_tracing(true);
 
 	int len = iso14443a_select_card(uid, NULL, &cuid, true, 0);
 	if(!len) {