X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/0b53530a100fb2fdcee2e292423e2dc7f501e026..8eeb3c6a0b4a5b3e47604c9c4443dd330920188f:/armsrc/mifarecmd.c

diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c
index b933fc7b..2ab076b6 100644
--- a/armsrc/mifarecmd.c
+++ b/armsrc/mifarecmd.c
@@ -14,11 +14,6 @@
 //-----------------------------------------------------------------------------
 
 #include "mifarecmd.h"
-#include "apps.h"
-#include "util.h"
-#include "crc.h"
-#include "protocols.h"
-#include "parity.h"
 
 //-----------------------------------------------------------------------------
 // Select, Authenticate, Read a MIFARE tag. 
@@ -641,13 +636,17 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags,
 	LED_A_ON();
 	LED_C_OFF();
 
+	BigBuf_free(); BigBuf_Clear_ext(false);	
+	clear_trace();
+	set_tracing(FALSE);
+	
 	if (initialize) {
 		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
-		clear_trace();
-		set_tracing(FALSE);
 	}
+	
 	LED_C_ON();
 	
+	uint8_t dummy_answer = 0;	
 	uint16_t num_nonces = 0;
 	bool have_uid = false;
 	for (uint16_t i = 0; i <= USB_CMD_DATA_SIZE - 9; ) {
@@ -698,7 +697,6 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags,
 		}
 	
 		// send a dummy byte as reader response in order to trigger the cards authentication timeout
-		uint8_t dummy_answer = 0;
 		ReaderTransmit(&dummy_answer, 1, NULL);
 		timeout = GetCountSspClk() + AUTHENTICATION_TIMEOUT;
 		
@@ -727,7 +725,7 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags,
 	if (field_off) {
 		FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 		LEDsoff();
-		//set_tracing(FALSE);
+		set_tracing(FALSE);
 	}
 }
 
@@ -1360,25 +1358,53 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
 }
 
 void MifareCIdent(){
-	
+	#define GEN_1A 1
+	#define GEN_1B 2
+	#define GEN_2  4
 	// variables
-	bool isOK = true;	
-	uint8_t receivedAnswer[1] = {0x00};
-	uint8_t receivedAnswerPar[1] = {0x00};
-
+	uint8_t isGen = 0;
+	uint8_t rec[1] = {0x00};
+	uint8_t recpar[1] = {0x00};
+	
+	// Generation 1 test
 	ReaderTransmitBitsPar(wupC1, 7, NULL, NULL);
-	if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-		isOK = false;
-	}
-
+	if(!ReaderReceive(rec, recpar) || (rec[0] != 0x0a)) {
+		goto TEST2;
+	};
+	isGen = GEN_1B;
+	
 	ReaderTransmit(wupC2, sizeof(wupC2), NULL);
-	if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
-		isOK = false;
-	}
+	if(!ReaderReceive(rec, recpar) || (rec[0] != 0x0a)) {
+		goto OUT;
+	};	
+	isGen = GEN_1A;
+	goto OUT;
+
+TEST2:;
+/*
+	// Generation 2 test
+	struct Crypto1State mpcs = {0, 0};
+	struct Crypto1State *pcs = &mpcs;
 
+	// halt previous.
+	mifare_classic_halt(NULL, 0);
+	
+	//select
+	if (!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {
+		goto OUT;
+	};
+	
+	// MIFARE_CLASSIC_WRITEBLOCK 0xA0
+	// ACK 0x0a
+	uint16_t len = mifare_sendcmd_short(pcs, 1, 0xA0, 0, rec, recpar, NULL);
+	if ((len != 1) || (rec[0] != 0x0A)) {   
+		isGen = GEN_2;	
+	};
+	*/
+OUT:;
 	// removed the if,  since some magic tags misbehavies and send an answer to it.
 	mifare_classic_halt(NULL, 0);
-	cmd_send(CMD_ACK,isOK,0,0,0,0);
+	cmd_send(CMD_ACK,isGen, 0, 0, 0, 0);
 }
 
 void OnSuccessMagic(){