X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/e6ee6c4cd135c29fcd3812e0ceea8fe17497700d..1a5ff2c2a7feaaf2ba6dc83bee611d1cab5f4527:/armsrc/mifarecmd.c

diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c
index 42dee56e..7e3e9293 100644
--- a/armsrc/mifarecmd.c
+++ b/armsrc/mifarecmd.c
@@ -2,6 +2,9 @@
 // Merlok - June 2011, 2012
 // Gerhard de Koning Gans - May 2008
 // Hagen Fritsch - June 2010
+// Midnitesnake - Dec 2013
+// Andy Davies  - Apr 2014
+// Iceman - May 2014
 //
 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
 // at your option, any later version. See the LICENSE.txt file for the text of
@@ -12,9 +15,12 @@
 
 #include "mifarecmd.h"
 #include "apps.h"
+#include "util.h"
+#include "desfire.h"
+#include "../common/crc.h"
 
 //-----------------------------------------------------------------------------
-// Select, Authenticate, Read a MIFARE tag. 
+// Select, Authenticaate, Read an MIFARE tag. 
 // read block
 //-----------------------------------------------------------------------------
 void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
@@ -36,8 +42,6 @@ void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 
 	// clear trace
  	iso14a_clear_trace();
-//	iso14a_set_tracing(false);
-
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
 	LED_A_ON();
@@ -78,11 +82,71 @@ void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,16);
 	LED_B_OFF();
 
-	// Thats it...
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
-//  iso14a_set_tracing(TRUE);
+}
+
+
+void MifareUC_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_ultra_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...
+	LEDsoff();
+}
+void MifareUC_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);
+    
+	LED_A_ON();
+	LED_B_OFF();
+	LED_C_OFF();
+	
+	if(mifare_ultra_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,11);
+	LED_B_OFF();
+    
+	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+	LEDsoff();
 }
 
 void MifareUReadBlock(uint8_t arg0,uint8_t *datain)
@@ -126,20 +190,13 @@ void MifareUReadBlock(uint8_t arg0,uint8_t *datain)
 	
 	if (MF_DBGLEVEL >= 2)	DbpString("READ BLOCK FINISHED");
     
-	// add trace trailer
-	memset(uid, 0x44, 4);
-	LogTrace(uid, 4, 0, 0, TRUE);
 	LED_B_ON();
-        cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,16);
+    cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,16);
 	LED_B_OFF();
-    
-    
-    // Thats it...
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
 }
 
-
 //-----------------------------------------------------------------------------
 // Select, Authenticate, Read a MIFARE tag. 
 // read sector (data = 4 x 16 bytes = 64 bytes, or 16 x 16 bytes = 256 bytes)
@@ -153,7 +210,7 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	ui64Key = bytes_to_num(datain, 6);
 	
 	// variables
-	byte_t isOK;
+	byte_t isOK = 0;
 	byte_t dataoutbuf[16 * 16];
 	uint8_t uid[10];
 	uint32_t cuid;
@@ -163,7 +220,6 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 
 	// clear trace
  	iso14a_clear_trace();
-//	iso14a_set_tracing(false);
 
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
@@ -195,7 +251,6 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 		if (MF_DBGLEVEL >= 1)	Dbprintf("Halt error");
 	}
 
-	
 	//  ----------------------------- crypto1 destroy
 	crypto1_destroy(pcs);
 	
@@ -208,40 +263,40 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	// Thats it...
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
-//  iso14a_set_tracing(TRUE);
 }
 
-
-void MifareUReadCard(uint8_t arg0, uint8_t *datain)
+void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain)
 {
   // params
         uint8_t sectorNo = arg0;
-        
+        int Pages=arg1;
+	int count_Pages=0;
         // variables
         byte_t isOK = 0;
-        byte_t dataoutbuf[16 * 4];
+        byte_t dataoutbuf[44 * 4];
         uint8_t uid[10];
         uint32_t cuid;
 
         // clear trace
         iso14a_clear_trace();
-//      iso14a_set_tracing(false);
 
 		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
         LED_A_ON();
         LED_B_OFF();
         LED_C_OFF();
-
+        Dbprintf("Pages %d",Pages);
         while (true) {
                 if(!iso14443a_select_card(uid, NULL, &cuid)) {
                 if (MF_DBGLEVEL >= 1)   Dbprintf("Can't select card");
                         break;
                 };
-		for(int sec=0;sec<16;sec++){
+		for(int sec=0;sec<Pages;sec++){
                     if(mifare_ultra_readblock(cuid, sectorNo * 4 + sec, dataoutbuf + 4 * sec)) {
                     if (MF_DBGLEVEL >= 1)   Dbprintf("Read block %d error",sec);
                         break;
+                    }else{
+		      count_Pages++;
                     };
                 }
                 if(mifare_ultra_halt(cuid)) {
@@ -252,11 +307,13 @@ void MifareUReadCard(uint8_t arg0, uint8_t *datain)
                 isOK = 1;
                 break;
         }
-        
+        Dbprintf("Pages read %d",count_Pages);
         if (MF_DBGLEVEL >= 2) DbpString("READ CARD FINISHED");
 
         LED_B_ON();
-		cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64);
+	if (Pages==16) cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64);
+	if (Pages==44 && count_Pages==16) cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64);
+	if (Pages==44 && count_Pages>16) cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,176);
         LED_B_OFF();
 
         // Thats it...
@@ -291,7 +348,6 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 
 	// clear trace
 	iso14a_clear_trace();
-//  iso14a_set_tracing(false);
 
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
@@ -337,11 +393,8 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 	// Thats it...
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
-//  iso14a_set_tracing(TRUE);
-
 }
 
-
 void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
 {
         // params
@@ -358,7 +411,6 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
 
         // clear trace
         iso14a_clear_trace();
-	//  iso14a_set_tracing(false);
 
 		iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
@@ -399,7 +451,6 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
 //  iso14a_set_tracing(TRUE);
 }
 
-
 void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain)
 {
 	// params
@@ -415,7 +466,6 @@ void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain)
 
 	// clear trace
 	iso14a_clear_trace();
-	//  iso14a_set_tracing(false);
 
 	iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
 
@@ -449,15 +499,11 @@ void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain)
 	cmd_send(CMD_ACK,isOK,0,0,0,0);
 	LED_B_OFF();
 
-
 	// Thats it...
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 	LEDsoff();
-//  iso14a_set_tracing(TRUE);
-
 }
 
-
 // Return 1 if the nonce is invalid else return 0
 int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, byte_t * parity) {
 	return ((oddparity((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity((NtEnc >> 24) & 0xFF) ^ BIT(Ks1,16))) & \
@@ -757,7 +803,6 @@ void MifareSetDbgLvl(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
 	Dbprintf("Debug level: %d", MF_DBGLEVEL);
 }
 
-
 //-----------------------------------------------------------------------------
 // Work with emulator memory
 // 
@@ -766,14 +811,11 @@ void MifareEMemClr(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
 	emlClearMem();
 }
 
-
 void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
 	emlSetMem(datain, arg0, arg1); // data, block num, blocks count
 }
 
-
 void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
-
 	byte_t buf[48];
 	emlGetMem(buf, arg0, arg1); // data, block num, blocks count (max 4)
 
@@ -782,7 +824,6 @@ void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
 	LED_B_OFF();
 }
 
-
 //-----------------------------------------------------------------------------
 // Load a card into the emulator memory
 //