X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/23b80a733436e88426c2b857950674768eb2b8a2..f0cf62cd734219c2f8b012a4e3ba42520344bce4:/armsrc/mifarecmd.c?ds=sidebyside

diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c
index b9b8098a..fc480a38 100644
--- a/armsrc/mifarecmd.c
+++ b/armsrc/mifarecmd.c
@@ -601,7 +601,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 = 141; i < 1200; i++) {
 				nttmp = prng_successor(nttmp, 1);
-				if (nttmp == nt2) {break;}
+				if (nttmp == nt2) break;
 			}
 
 			if (i != 1200) {
@@ -937,32 +937,26 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 	
 	// variables
 	byte_t isOK = 0;
-	uint8_t uid[10];
-	uint8_t d_block[18];
+	uint8_t uid[10] = {0x00};
+	uint8_t d_block[18] = {0x00};
 	uint32_t cuid;
 	
-	memset(uid, 0x00, 10);
 	uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();
 	uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
 	
+	// reset FPGA and LED
 	if (workFlags & 0x08) {
-		// clear trace
-		iso14a_clear_trace();
-		iso14a_set_tracing(TRUE);
-
-		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
-
 		LED_A_ON();
 		LED_B_OFF();
 		LED_C_OFF();
-	
-		SpinDelay(300);
-		FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-		SpinDelay(100);
-		FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);
+		
+		iso14a_clear_trace();
+		iso14a_set_tracing(TRUE);
+		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 	}
 
 	while (true) {
+
 		// get UID from chip
 		if (workFlags & 0x01) {
 			if(!iso14443a_select_card(uid, NULL, &cuid)) {
@@ -1041,7 +1035,6 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 	LED_B_OFF();
 
 	if ((workFlags & 0x10) || (!isOK)) {
-		// Thats it...
 		FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 		LEDsoff();
 	}
@@ -1064,28 +1057,20 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 	
 	// variables
 	byte_t isOK = 0;
-	uint8_t data[18];
+	uint8_t data[18] = {0x00};
 	uint32_t cuid = 0;
 	
-	memset(data, 0x00, 18);
 	uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();
 	uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
 	
 	if (workFlags & 0x08) {
-		// clear trace
-		iso14a_clear_trace();
-		iso14a_set_tracing(TRUE);
-
-		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
-
 		LED_A_ON();
 		LED_B_OFF();
 		LED_C_OFF();
-	
-		SpinDelay(300);
-		FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-		SpinDelay(100);
-		FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);
+
+		iso14a_clear_trace();
+		iso14a_set_tracing(TRUE);
+		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 	}
 
 	while (true) {
@@ -1131,3 +1116,107 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 	}
 }
 
+void MifareCIdent(){
+  
+	// card commands
+	uint8_t wupC1[]       = { 0x40 }; 
+	uint8_t wupC2[]       = { 0x43 }; 
+	
+	// variables
+	byte_t isOK = 1;
+	
+	uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();
+	uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
+
+	ReaderTransmitBitsPar(wupC1,7,0, NULL);
+	if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+		isOK = 0;
+	};
+
+	ReaderTransmit(wupC2, sizeof(wupC2), NULL);
+	if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
+		isOK = 0;
+	};
+
+	if (mifare_classic_halt(NULL, 0)) {
+		isOK = 0;
+	};
+
+	cmd_send(CMD_ACK,isOK,0,0,0,0);
+}
+
+			//
+// DESFIRE
+//
+
+void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain){
+	// variables
+	byte_t isOK = 0;
+	byte_t dataoutbuf[16];
+	uint8_t uid[10];
+	uint32_t cuid;
+    
+	// clear trace
+	iso14a_clear_trace();
+	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
+    
+	LED_A_ON();
+	LED_B_OFF();
+	LED_C_OFF();
+	
+
+	if(!iso14443a_select_card(uid, NULL, &cuid)) {
+          if (MF_DBGLEVEL >= 1)	Dbprintf("Can't select card, something went wrong before auth");
+	};
+
+	if(mifare_desfire_des_auth1(cuid, dataoutbuf)){
+	  if (MF_DBGLEVEL >= 1)	Dbprintf("Authentication part1: Fail.");    
+	}
+
+	isOK=1;
+	if (MF_DBGLEVEL >= 2)	DbpString("AUTH 1 FINISHED");
+    
+	LED_B_ON();
+        cmd_send(CMD_ACK,isOK,cuid,0,dataoutbuf,11);
+	LED_B_OFF();
+	  
+	// Thats it...
+	//FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+	LEDsoff();
+}
+
+void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain){
+	// params
+	uint32_t cuid = arg0;
+	uint8_t key[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+	// variables
+	byte_t isOK = 0;
+	byte_t dataoutbuf[16];
+    
+	memcpy(key, datain, 16);
+	// clear trace
+	//iso14a_clear_trace();
+	//iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
+    
+	LED_A_ON();
+	LED_B_OFF();
+	LED_C_OFF();
+
+//	Dbprintf("Sending %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+//		 key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],
+//		 key[9],key[10],key[11],key[12],key[13],key[14],key[15]);
+	
+	if(mifare_desfire_des_auth2(cuid, key, dataoutbuf)){
+	    if (MF_DBGLEVEL >= 1) Dbprintf("Authentication part2: Fail...");    
+	}
+	isOK=1;
+	if (MF_DBGLEVEL >= 2)	DbpString("AUTH 2 FINISHED");
+    
+	LED_B_ON();
+        cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,12);
+	LED_B_OFF();
+    
+    // Thats it...
+	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+	LEDsoff();
+}
\ No newline at end of file