X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/94422fa23f2a9fe21d9d13286bde0e4e06a74c4f..4b8ee00f0dfd98dcaaecaaae108355893a90c04c:/armsrc/appmain.c?ds=inline

diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index ec686b13..22657815 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -34,6 +34,7 @@
 // Craig Young - 14a stand-alone code
 #ifdef WITH_ISO14443a_StandAlone
  #include "iso14443a.h"
+ #include "protocols.h"
 #endif
 
 #define abs(x) ( ((x)<0) ? -(x) : (x) )
@@ -350,7 +351,6 @@ void SendStatus(void)
 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF)
 
 #define OPTS 2
-
 void StandAloneMode()
 {
 	DbpString("Stand-alone mode! No PC necessary.");
@@ -364,13 +364,9 @@ void StandAloneMode()
 	LED(LED_GREEN,	200);
 	LED(LED_ORANGE, 200);
 	LED(LED_RED,	200);
-
 }
-
 #endif
 
-
-
 #ifdef WITH_ISO14443a_StandAlone
 void StandAloneMode14a()
 {
@@ -387,6 +383,8 @@ void StandAloneMode14a()
 	uint32_t uid_tmp2 = 0;
 	iso14a_card_select_t hi14a_card[OPTS];
 
+	uint8_t params = (MAGIC_SINGLE | MAGIC_DATAIN);
+					
 	LED(selected + 1, 0);
 
 	for (;;)
@@ -429,7 +427,7 @@ void StandAloneMode14a()
 						SpinDelay(300);
 					}
 				}
-				if (!iso14443a_select_card(uid, &hi14a_card[selected], &cuid))
+				if (!iso14443a_select_card(uid, &hi14a_card[selected], &cuid, true, 0))
 					continue;
 				else
 				{
@@ -480,87 +478,84 @@ void StandAloneMode14a()
 		else if (iGotoClone==1)
 		{
 			iGotoClone=0;
-					LEDsoff();
-					LED(selected + 1, 0);
-					LED(LED_ORANGE, 250);
+			LEDsoff();
+			LED(selected + 1, 0);
+			LED(LED_ORANGE, 250);
 
+			// record
+			Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected, uid_1st[selected]);
 
-					// record
-					Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected, uid_1st[selected]);
+			// wait for button to be released
+			// Delay cloning until card is in place
+			while(BUTTON_PRESS())
+				WDT_HIT();
 
-					// wait for button to be released
-					while(BUTTON_PRESS())
-					{
-						// Delay cloning until card is in place
-						WDT_HIT();
-					}
-					Dbprintf("Starting clone. [Bank: %u]", selected);
-					// need this delay to prevent catching some weird data
-					SpinDelay(500);
-					// Begin clone function here:
-					/* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards:
-							UsbCommand c = {CMD_MIFARE_CSETBLOCK, {wantWipe, params & (0xFE | (uid == NULL ? 0:1)), blockNo}};
-							memcpy(c.d.asBytes, data, 16);
-							SendCommand(&c);
-
-						Block read is similar:
-							UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, 0, blockNo}};
-						We need to imitate that call with blockNo 0 to set a uid.
-
-						The get and set commands are handled in this file:
-							// Work with "magic Chinese" card
-							case CMD_MIFARE_CSETBLOCK:
-									MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
-									break;
-							case CMD_MIFARE_CGETBLOCK:
-									MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
-									break;
-
-						mfCSetUID provides example logic for UID set workflow:
-							-Read block0 from card in field with MifareCGetBlock()
-							-Configure new values without replacing reserved bytes
-									memcpy(block0, uid, 4); // Copy UID bytes from byte array
-									// Mifare UID BCC
-									block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5
-									Bytes 5-7 are reserved SAK and ATQA for mifare classic
-							-Use mfCSetBlock(0, block0, oldUID, wantWipe, CSETBLOCK_SINGLE_OPER) to write it
-					*/
-					uint8_t oldBlock0[16] = {0}, newBlock0[16] = {0}, testBlock0[16] = {0};
-					// arg0 = Flags == CSETBLOCK_SINGLE_OPER=0x1F, arg1=returnSlot, arg2=blockNo
-			MifareCGetBlock(0x3F, 1, 0, oldBlock0);
+			Dbprintf("Starting clone. [Bank: %u]", selected);
+			// need this delay to prevent catching some weird data
+			SpinDelay(500);
+			// Begin clone function here:
+			/* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards:
+					UsbCommand c = {CMD_MIFARE_CSETBLOCK, {params & (0xFE | (uid == NULL ? 0:1)), blockNo, 0}};
+					memcpy(c.d.asBytes, data, 16);
+					SendCommand(&c);
+
+				Block read is similar:
+					UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, blockNo, 0}};
+				We need to imitate that call with blockNo 0 to set a uid.
+
+				The get and set commands are handled in this file:
+					// Work with "magic Chinese" card
+					case CMD_MIFARE_CSETBLOCK:
+							MifareCSetBlock(c->arg[0], c->arg[1], c->d.asBytes);
+							break;
+					case CMD_MIFARE_CGETBLOCK:
+							MifareCGetBlock(c->arg[0], c->arg[1], c->d.asBytes);
+							break;
+
+				mfCSetUID provides example logic for UID set workflow:
+					-Read block0 from card in field with MifareCGetBlock()
+					-Configure new values without replacing reserved bytes
+							memcpy(block0, uid, 4); // Copy UID bytes from byte array
+							// Mifare UID BCC
+							block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5
+							Bytes 5-7 are reserved SAK and ATQA for mifare classic
+					-Use mfCSetBlock(0, block0, oldUID, wantWipe, MAGIC_SINGLE) to write it
+			*/
+			uint8_t oldBlock0[16] = {0}, newBlock0[16] = {0}, testBlock0[16] = {0};
+			// arg0 = Flags, arg1=blockNo
+			MifareCGetBlock(params, 0, oldBlock0);
 			if (oldBlock0[0] == 0 && oldBlock0[0] == oldBlock0[1]  && oldBlock0[1] == oldBlock0[2] && oldBlock0[2] == oldBlock0[3]) {
 				Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected);
 				playing = 1;
 			}
 			else {
-					Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0[0],oldBlock0[1],oldBlock0[2],oldBlock0[3]);
-					memcpy(newBlock0,oldBlock0,16);
-					// Copy uid_1st for bank (2nd is for longer UIDs not supported if classic)
-
-					newBlock0[0] = uid_1st[selected]>>24;
-					newBlock0[1] = 0xFF & (uid_1st[selected]>>16);
-					newBlock0[2] = 0xFF & (uid_1st[selected]>>8);
-					newBlock0[3] = 0xFF & (uid_1st[selected]);
-					newBlock0[4] = newBlock0[0]^newBlock0[1]^newBlock0[2]^newBlock0[3];
-					// arg0 = needWipe, arg1 = workFlags, arg2 = blockNo, datain
-					MifareCSetBlock(0, 0xFF,0, newBlock0);
-				MifareCGetBlock(0x3F, 1, 0, testBlock0);
-					if (memcmp(testBlock0,newBlock0,16)==0)
-					{
-						DbpString("Cloned successfull!");
-						cardRead[selected] = 0; // Only if the card was cloned successfully should we clear it
+				Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0[0],oldBlock0[1],oldBlock0[2],oldBlock0[3]);
+				memcpy(newBlock0,oldBlock0,16);
+				// Copy uid_1st for bank (2nd is for longer UIDs not supported if classic)
+
+				newBlock0[0] = uid_1st[selected]>>24;
+				newBlock0[1] = 0xFF & (uid_1st[selected]>>16);
+				newBlock0[2] = 0xFF & (uid_1st[selected]>>8);
+				newBlock0[3] = 0xFF & (uid_1st[selected]);
+				newBlock0[4] = newBlock0[0]^newBlock0[1]^newBlock0[2]^newBlock0[3];
+
+				// arg0 = workFlags, arg1 = blockNo, datain
+				MifareCSetBlock(params, 0, newBlock0);
+				MifareCGetBlock(params, 0, testBlock0);
+				
+				if (memcmp(testBlock0, newBlock0, 16)==0) {
+					DbpString("Cloned successfull!");
+					cardRead[selected] = 0; // Only if the card was cloned successfully should we clear it
 					playing = 0;
 					iGotoRecord = 1;
-				selected = (selected + 1) % OPTS;
-				}
-				else {
+					selected = (selected + 1) % OPTS;
+				} else {
 					Dbprintf("Clone failed. Back to replay mode on bank[%d]", selected);
 					playing = 1;
 				}
 			}
 			LEDsoff();
 			LED(selected + 1, 0);
-
 		}
 		// Change where to record (or begin playing)
 		else if (playing==1) // button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected])
@@ -640,8 +635,7 @@ void SamyRun()
 	// Turn on selected LED
 	LED(selected + 1, 0);
 
-	for (;;)
-	{
+	for (;;) {
 		usb_poll();
 		WDT_HIT();
 
@@ -672,49 +666,41 @@ void SamyRun()
 			LEDsoff();
 			LED(selected + 1, 0);
 			// Finished recording
-
 			// If we were previously playing, set playing off
 			// so next button push begins playing what we recorded
-			playing = 0;
-			
-			cardRead = 1;
-	
+			playing = 0;			
+			cardRead = 1;	
 		}
+		else if (button_pressed > 0 && cardRead == 1) {
+			LEDsoff();
+			LED(selected + 1, 0);
+			LED(LED_ORANGE, 0);
 
-		else if (button_pressed > 0 && cardRead == 1)
-		{
-					LEDsoff();
-					LED(selected + 1, 0);
-					LED(LED_ORANGE, 0);
-
-					// record
-					Dbprintf("Cloning %x %x %x", selected, high[selected], low[selected]);
+			// record
+			Dbprintf("Cloning %x %x %x", selected, high[selected], low[selected]);
 
-					// wait for button to be released
-					while(BUTTON_PRESS())
-						WDT_HIT();
+			// wait for button to be released
+			while(BUTTON_PRESS())
+				WDT_HIT();
 
-					/* need this delay to prevent catching some weird data */
-					SpinDelay(500);
+			/* need this delay to prevent catching some weird data */
+			SpinDelay(500);
 
-					CopyHIDtoT55x7(high[selected], low[selected], 0, 0);
-					Dbprintf("Cloned %x %x %x", selected, high[selected], low[selected]);
+			CopyHIDtoT55x7(high[selected], low[selected], 0, 0);
+			Dbprintf("Cloned %x %x %x", selected, high[selected], low[selected]);
 
-					LEDsoff();
-					LED(selected + 1, 0);
-					// Finished recording
+			LEDsoff();
+			LED(selected + 1, 0);
+			// Finished recording
 
-					// If we were previously playing, set playing off
-					// so next button push begins playing what we recorded
-					playing = 0;
-					
-					cardRead = 0;
-			
+			// If we were previously playing, set playing off
+			// so next button push begins playing what we recorded
+			playing = 0;			
+			cardRead = 0;			
 		}
 
 		// Change where to record (or begin playing)
-		else if (button_pressed)
-		{
+		else if (button_pressed) {
 			// Next option if we were previously playing
 			if (playing)
 				selected = (selected + 1) % OPTS;
@@ -731,15 +717,16 @@ void SamyRun()
 				// wait for button to be released
 				while(BUTTON_PRESS())
 					WDT_HIT();
+				
 				Dbprintf("%x %x %x", selected, high[selected], low[selected]);
-				CmdHIDsimTAG(high[selected], low[selected], 0);
+				CmdHIDsimTAG(high[selected], low[selected], 0);		
 				DbpString("Done playing");
-				if (BUTTON_HELD(1000) > 0)
-					{
+				
+				if (BUTTON_HELD(1000) > 0) {
 					DbpString("Exiting");
 					LEDsoff();
 					return;
-					}
+				}
 
 				/* We pressed a button so ignore it here with a delay */
 				SpinDelay(300);
@@ -1005,12 +992,10 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			break;
 		case CMD_AWID_DEMOD_FSK: // Set realtime AWID demodulation
 			CmdAWIDdemodFSK(c->arg[0], 0, 0, 1);
-                        break;
+			break;
         case CMD_VIKING_CLONE_TAG:
-            CopyViKingtoT55x7(c->arg[0],c->arg[1]);
+			CopyVikingtoT55xx(c->arg[0], c->arg[1], c->arg[2]);
             break;
-
-    
 #endif
 
 #ifdef WITH_HITAG
@@ -1133,6 +1118,9 @@ void UsbPacketReceived(uint8_t *packet, int len)
 		case CMD_MIFAREU_WRITEBL:
 			MifareUWriteBlock(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
+		case CMD_MIFARE_ACQUIRE_ENCRYPTED_NONCES:
+			MifareAcquireEncryptedNonces(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+			break;
 		case CMD_MIFARE_NESTED:
 			MifareNested(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
 			break;
@@ -1162,10 +1150,10 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			
 		// Work with "magic Chinese" card
 		case CMD_MIFARE_CSETBLOCK:
-			MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+			MifareCSetBlock(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
 		case CMD_MIFARE_CGETBLOCK:
-			MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+			MifareCGetBlock(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
 		case CMD_MIFARE_CIDENT:
 			MifareCIdent();
@@ -1196,7 +1184,6 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			break;
 
 		case CMD_MIFARE_COLLECT_NONCES:
-			MifareCollectNonces(c->arg[0], c->arg[1]);
 			break;
 #endif