X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/3649b640e6a7f70e460791db18ed7cb96d9cfff6..a930542b0a47f298f172aff7afe4dd8e2595a17b:/armsrc/iso15693.c

diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c
index 884ed976..e65e7958 100644
--- a/armsrc/iso15693.c
+++ b/armsrc/iso15693.c
@@ -58,14 +58,12 @@
 // *) document all the functions
 
 
-#include "../include/proxmark3.h"
+#include "proxmark3.h"
 #include "util.h"
 #include "apps.h"
 #include "string.h"
-#include "../common/iso15693tools.h"
-#include "../common/cmd.h"
-#include "crapto1.h"
-#include "mifareutil.h"
+#include "iso15693tools.h"
+#include "cmd.h"
 
 #define arraylen(x) (sizeof(x)/sizeof((x)[0]))
 
@@ -297,21 +295,19 @@ static void TransmitTo15693Reader(const uint8_t *cmd, int len, int *samples, int
 //		number of decoded bytes
 static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed)
 {
-	int c = 0;
-	uint8_t *dest = (uint8_t *)BigBuf;
-	int getNext = 0;
+	uint8_t *dest = BigBuf_get_addr();
 
+	int c = 0;
+	int getNext = FALSE;
 	int8_t prev = 0;
 
-// NOW READ RESPONSE
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
-	//spindelay(60);	// greg - experiment to get rid of some of the 0 byte/failed reads
-	c = 0;
-	getNext = FALSE;
+	SpinDelay(100);	// greg - experiment to get rid of some of the 0 byte/failed reads
+
 	for(;;) {
-		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
+		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))
 			AT91C_BASE_SSC->SSC_THR = 0x43;
-		}
+
 		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
 			int8_t b;
 			b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
@@ -321,18 +317,7 @@ static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *
 			// every other is Q. We just want power, so abs(I) + abs(Q) is
 			// close to what we want.
 			if(getNext) {
-				int8_t r;
-
-				if(b < 0) {
-					r = -b;
-				} else {
-					r = b;
-				}
-				if(prev < 0) {
-					r -= prev;
-				} else {
-					r += prev;
-				}
+				int8_t r = ABS(b) + ABS(prev);
 
 				dest[c++] = (uint8_t)r;
 
@@ -439,50 +424,35 @@ static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *
 	} // "end if correlation > 0" 	(max/(arraylen(FrameSOF)/skip))
 	return k; // return the number of bytes demodulated
 
-///	DbpString("CRC=%04x", Iso15693Crc(outBuf, k-2));
-
+//	DbpString("CRC=%04x", Iso15693Crc(outBuf, k-2));
 }
 
 
 // Now the GetISO15693 message from sniffing command
 static int GetIso15693AnswerFromSniff(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed)
 {
-	int c = 0;
-	uint8_t *dest = (uint8_t *)BigBuf;
-	int getNext = 0;
+	uint8_t *dest = BigBuf_get_addr();
 
+	int c = 0;
+	int getNext = FALSE;
 	int8_t prev = 0;
 
-    // NOW READ RESPONSE
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
-	//spindelay(60);	// greg - experiment to get rid of some of the 0 byte/failed reads
-	c = 0;
-	getNext = FALSE;
+	SpinDelay(100);	// greg - experiment to get rid of some of the 0 byte/failed reads
+
 	for(;;) {
-		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
+		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))
 			AT91C_BASE_SSC->SSC_THR = 0x43;
-		}
+
 		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
-			int8_t b;
-			b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
+			int8_t b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
 
 			// The samples are correlations against I and Q versions of the
 			// tone that the tag AM-modulates, so every other sample is I,
 			// every other is Q. We just want power, so abs(I) + abs(Q) is
 			// close to what we want.
 			if(getNext) {
-				int8_t r;
-
-				if(b < 0) {
-					r = -b;
-				} else {
-					r = b;
-				}
-				if(prev < 0) {
-					r -= prev;
-				} else {
-					r += prev;
-				}
+				int8_t r = ABS(b) + ABS(prev);
 
 				dest[c++] = (uint8_t)r;
 
@@ -599,7 +569,7 @@ static void BuildIdentifyRequest(void);
 //-----------------------------------------------------------------------------
 void AcquireRawAdcSamplesIso15693(void)
 {
-	uint8_t *dest =  mifare_get_bigbufptr();
+	uint8_t *dest = BigBuf_get_addr();
 
 	int c = 0;
 	int getNext = 0;
@@ -651,18 +621,7 @@ void AcquireRawAdcSamplesIso15693(void)
 			// every other is Q. We just want power, so abs(I) + abs(Q) is
 			// close to what we want.
 			if(getNext) {
-				int8_t r;
-
-				if(b < 0) {
-					r = -b;
-				} else {
-					r = b;
-				}
-				if(prev < 0) {
-					r -= prev;
-				} else {
-					r += prev;
-				}
+				int8_t r = ABS(b) + ABS(prev);
 
 				dest[c++] = (uint8_t)r;
 
@@ -681,7 +640,7 @@ void AcquireRawAdcSamplesIso15693(void)
 
 void RecordRawAdcSamplesIso15693(void)
 {
-	uint8_t *dest =  mifare_get_bigbufptr();
+	uint8_t *dest = BigBuf_get_addr();
 
 	int c = 0;
 	int getNext = 0;
@@ -692,8 +651,8 @@ void RecordRawAdcSamplesIso15693(void)
 	FpgaSetupSsc();
 
 	// Start from off (no field generated)
-   	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-   	SpinDelay(200);
+	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+	SpinDelay(200);
 
 	SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
 
@@ -716,18 +675,7 @@ void RecordRawAdcSamplesIso15693(void)
 			// every other is Q. We just want power, so abs(I) + abs(Q) is
 			// close to what we want.
 			if(getNext) {
-				int8_t r;
-
-				if(b < 0) {
-					r = -b;
-				} else {
-					r = b;
-				}
-				if(prev < 0) {
-					r -= prev;
-				} else {
-					r += prev;
-				}
+				int8_t r = ABS(b) + ABS(prev);
 
 				dest[c++] = (uint8_t)r;
 
@@ -842,8 +790,9 @@ static void BuildReadBlockRequest(uint8_t *uid, uint8_t blockNumber )
 	uint16_t crc;
 	// one sub-carrier, inventory, 1 slot, fast rate
 	// AFI is at bit 5 (1<<4) when doing an INVENTORY
-	cmd[0] = 0; //(1 << 2) | (1 << 5) | (1 << 1);
-	cmd[1] = 0;
+    //(1 << 2) | (1 << 5) | (1 << 1);
+	cmd[0] = 0; // 
+	cmd[1] = 0; // DSFID (data storage format identifier).  0x00 = not supported
 	// 64-bit UID
 	cmd[2] = uid[7]; //0x32;
 	cmd[3] = uid[6]; //0x4b;
@@ -879,12 +828,12 @@ int SendDataTag(uint8_t *send, int sendlen, int init, int speed, uint8_t **recv)
 	LED_C_OFF();
 	LED_D_OFF();
 	
+	if (init) Iso15693InitReader();
+
 	int answerLen=0;
-	uint8_t *answer = (((uint8_t *)BigBuf) + 3660);
-	if (recv!=NULL) memset(BigBuf + 3660, 0, 100);
+	uint8_t *answer = BigBuf_get_addr() + 3660;
+	if (recv != NULL) memset(answer, 0, 100);
 
-	if (init) Iso15693InitReader();
-	
 	if (!speed) {
 		// low speed (1 out of 256)
 		CodeIso15693AsReader256(send, sendlen);
@@ -905,10 +854,7 @@ int SendDataTag(uint8_t *send, int sendlen, int init, int speed, uint8_t **recv)
 		*recv=answer;
 	}
 
-	LED_A_OFF();
-	LED_B_OFF();
-	LED_C_OFF();
-	LED_D_OFF();
+	LEDsoff();
 	
 	return answerLen;
 }
@@ -994,17 +940,13 @@ void SetDebugIso15693(uint32_t debug) {
 // Simulate an ISO15693 reader, perform anti-collision and then attempt to read a sector
 // all demodulation performed in arm rather than host. - greg
 //-----------------------------------------------------------------------------
-void ReaderIso15693(uint32_t parameter )
+void ReaderIso15693(uint32_t parameter)
 {
 	LED_A_ON();
 	LED_B_ON();
 	LED_C_OFF();
 	LED_D_OFF();
 
-	uint8_t *answer1 = (((uint8_t *)BigBuf) + 3660); //
-	uint8_t *answer2 = (((uint8_t *)BigBuf) + 3760);
-	uint8_t *answer3 = (((uint8_t *)BigBuf) + 3860);
-
 	int answerLen1 = 0;
 	int answerLen2 = 0;
 	int answerLen3 = 0;
@@ -1015,20 +957,22 @@ void ReaderIso15693(uint32_t parameter )
 	int elapsed = 0;
 	uint8_t TagUID[8] = {0x00};
 
-	 
-	// Blank arrays
-	memset(BigBuf + 3660, 0x00, 300);
-
 	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
+	uint8_t *answer1 = BigBuf_get_addr() + 3660;
+	uint8_t *answer2 = BigBuf_get_addr() + 3760;
+	uint8_t *answer3 = BigBuf_get_addr() + 3860;
+	// Blank arrays
+	memset(answer1, 0x00, 300);
+
 	SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
 	// Setup SSC
 	FpgaSetupSsc();
 
 	// Start from off (no field generated)
-   	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-   	SpinDelay(200);
-	
+	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+	SpinDelay(200);
+
 	// Give the tags time to energize
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
 	SpinDelay(200);
@@ -1067,7 +1011,7 @@ void ReaderIso15693(uint32_t parameter )
 	Dbhexdump(answerLen1,answer1,true);
 
 	// UID is reverse
-	if (answerLen1 >= 12) 
+	if (answerLen1>=12) 
 		Dbprintf("UID = %02hX%02hX%02hX%02hX%02hX%02hX%02hX%02hX",
 			TagUID[7],TagUID[6],TagUID[5],TagUID[4],
 			TagUID[3],TagUID[2],TagUID[1],TagUID[0]);
@@ -1081,14 +1025,14 @@ void ReaderIso15693(uint32_t parameter )
 	DbdecodeIso15693Answer(answerLen3,answer3);
 	Dbhexdump(answerLen3,answer3,true);
 
- 	// read all pages
-	if (answerLen1 >= 12 && DEBUG) {
+	// read all pages
+	if (answerLen1>=12 && DEBUG) {
 		i=0;			
-		while (i < 32) {  // sanity check, assume max 32 pages
+		while (i<32) {  // sanity check, assume max 32 pages
 			BuildReadBlockRequest(TagUID,i);
-			TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait);  
-			answerLen2 = GetIso15693AnswerFromTag(answer2, 100, &samples, &elapsed);
-			if (answerLen2 > 0) {
+	      TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait);  
+         answerLen2 = GetIso15693AnswerFromTag(answer2, 100, &samples, &elapsed);
+			if (answerLen2>0) {
 				Dbprintf("READ SINGLE BLOCK %d returned %d octets:",i,answerLen2);
 				DbdecodeIso15693Answer(answerLen2,answer2);
 				Dbhexdump(answerLen2,answer2,true);
@@ -1113,28 +1057,23 @@ void SimTagIso15693(uint32_t parameter, uint8_t *uid)
 	LED_C_OFF();
 	LED_D_OFF();
 
-	uint8_t *buf = (((uint8_t *)BigBuf) + 3660); //
-	
 	int answerLen1 = 0;
 	int samples = 0;
 	int tsamples = 0;
 	int wait = 0;
 	int elapsed = 0;
-	
-	memset(buf, 0x00, 100);
-	
-	// Inventory response
-	BuildInventoryResponse(uid);
-	
+
 	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
-	SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
+	uint8_t *buf = BigBuf_get_addr() + 3660;
+	memset(buf, 0x00, 100);
 
+	SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
 	FpgaSetupSsc();
 
 	// Start from off (no field generated)
     FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-    SpinDelay(200);
+	SpinDelay(200);
 
 	LED_A_OFF();
 	LED_B_OFF();
@@ -1148,13 +1087,20 @@ void SimTagIso15693(uint32_t parameter, uint8_t *uid)
 	{
 		// Build a suitable reponse to the reader INVENTORY cocmmand
 		// not so obsvious, but in the call to BuildInventoryResponse,  the command is copied to the global ToSend buffer used below.
-		TransmitTo15693Reader(ToSend, ToSendMax, &tsamples, &wait);
+		
+		BuildInventoryResponse(uid);
+	
+		TransmitTo15693Reader(ToSend,ToSendMax, &tsamples, &wait);
 	}
 
 	Dbprintf("%d octets read from reader command: %x %x %x %x %x %x %x %x %x", answerLen1,
 		buf[0], buf[1], buf[2],	buf[3],
 		buf[4], buf[5],	buf[6], buf[7], buf[8]);
 
+	Dbprintf("Simulationg uid: %x %x %x %x %x %x %x %x",
+		uid[0], uid[1], uid[2],	uid[3],
+		uid[4], uid[5],	uid[6], uid[7]);
+
 	LED_A_OFF();
 	LED_B_OFF();
 	LED_C_OFF();
@@ -1211,7 +1157,7 @@ void BruteforceIso15693Afi(uint32_t speed)
 void DirectTag15693Command(uint32_t datalen,uint32_t speed, uint32_t recv, uint8_t data[]) {
 
 	int recvlen=0;
-	uint8_t *recvbuf=(uint8_t *)BigBuf;
+	uint8_t *recvbuf = BigBuf_get_addr();
 //	UsbCommand n;
 	
 	if (DEBUG) {