X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/3ad48540d4d77f50cc62d16acb78f17019ef431d..d04b71c168abf2655583c7817127e1f68efa328f:/armsrc/legicrf.c

diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c
index 3fbdf5cb..d9c94106 100644
--- a/armsrc/legicrf.c
+++ b/armsrc/legicrf.c
@@ -81,37 +81,39 @@ static void setup_timer(void)
 /* Generate Keystream */
 static uint32_t get_key_stream(int skip, int count)
 {
-  uint32_t key=0; int i;
-
-  /* Use int to enlarge timer tc to 32bit */
-  legic_prng_bc += prng_timer->TC_CV;
-  prng_timer->TC_CCR = AT91C_TC_SWTRG;
-
-  /* If skip == -1, forward prng time based */
-  if(skip == -1) {
-     i  = (legic_prng_bc+SIM_SHIFT)/SIM_DIVISOR; /* Calculate Cycles based on timer */
-     i -= legic_prng_count(); /* substract cycles of finished frames */
-     i -= count; /* substract current frame length, rewidn to bedinning */
-     legic_prng_forward(i);
-  } else {
-     legic_prng_forward(skip);
-  }
+	uint32_t key=0; int i;
+
+	/* Use int to enlarge timer tc to 32bit */
+	legic_prng_bc += prng_timer->TC_CV;
+	prng_timer->TC_CCR = AT91C_TC_SWTRG;
+
+	/* If skip == -1, forward prng time based */
+	if(skip == -1) {
+		i  = (legic_prng_bc+SIM_SHIFT)/SIM_DIVISOR; /* Calculate Cycles based on timer */
+		i -= legic_prng_count(); /* substract cycles of finished frames */
+		i -= count; /* substract current frame length, rewidn to bedinning */
+		legic_prng_forward(i);
+	} else {
+		legic_prng_forward(skip);
+	}
 
-  /* Write Time Data into LOG */
-  if(count == 6) { i = -1; } else { i = legic_read_count; }
-  ((uint8_t*)BigBuf)[OFFSET_LOG+128+i] = legic_prng_count();
-  ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4]   = (legic_prng_bc >> 0) & 0xff;
-  ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4+1] = (legic_prng_bc >> 8) & 0xff;
-  ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4+2] = (legic_prng_bc >>16) & 0xff;
-  ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4+3] = (legic_prng_bc >>24) & 0xff;
-  ((uint8_t*)BigBuf)[OFFSET_LOG+384+i] = count;
-
-  /* Generate KeyStream */
-  for(i=0; i<count; i++) {
-    key |= legic_prng_get_bit() << i;
-    legic_prng_forward(1);
-  }
-  return key;
+	/* Write Time Data into LOG */
+	uint8_t *BigBuf = BigBuf_get_addr();
+	i = (count == 6) ? -1 : legic_read_count;
+
+	BigBuf[OFFSET_LOG+128+i] = legic_prng_count();
+	BigBuf[OFFSET_LOG+256+i*4]   = (legic_prng_bc >> 0) & 0xff;
+	BigBuf[OFFSET_LOG+256+i*4+1] = (legic_prng_bc >> 8) & 0xff;
+	BigBuf[OFFSET_LOG+256+i*4+2] = (legic_prng_bc >>16) & 0xff;
+	BigBuf[OFFSET_LOG+256+i*4+3] = (legic_prng_bc >>24) & 0xff;
+	BigBuf[OFFSET_LOG+384+i] = count;
+
+	/* Generate KeyStream */
+	for(i=0; i<count; i++) {
+		key |= legic_prng_get_bit() << i;
+		legic_prng_forward(1);
+	}
+	return key;
 }
 
 /* Send a frame in tag mode, the FPGA must have been set up by
@@ -144,11 +146,11 @@ static void frame_send_tag(uint16_t response, int bits, int crypt)
       int nextbit = timer->TC_CV + TAG_TIME_BIT;
       int bit = response & 1;
       response = response >> 1;
-      if(bit) {
+      if(bit)
          AT91C_BASE_PIOA->PIO_SODR = GPIO_SSC_DOUT;
-      } else {
+      else
          AT91C_BASE_PIOA->PIO_CODR = GPIO_SSC_DOUT;
-      }
+      
       while(timer->TC_CV < nextbit) ;
    }
    AT91C_BASE_PIOA->PIO_CODR = GPIO_SSC_DOUT;
@@ -170,11 +172,11 @@ static void frame_send_rwd(uint32_t data, int bits)
 		int bit = data & 1;
 		data = data >> 1;
 
-		if(bit ^ legic_prng_get_bit()) {
+		if(bit ^ legic_prng_get_bit())
 			bit_end = starttime + RWD_TIME_1;
-		} else {
+		else
 			bit_end = starttime + RWD_TIME_0;
-		}
+		
 
 		/* RWD_TIME_PAUSE time off, then some time on, so that the complete bit time is
 		 * RWD_TIME_x, where x is the bit to be transmitted */
@@ -183,16 +185,15 @@ static void frame_send_rwd(uint32_t data, int bits)
 		AT91C_BASE_PIOA->PIO_SODR = GPIO_SSC_DOUT;
 		legic_prng_forward(1); /* bit duration is longest. use this time to forward the lfsr */
 
-		while(timer->TC_CV < bit_end) ;
+		while(timer->TC_CV < bit_end);
 	}
 
-	{
-		/* One final pause to mark the end of the frame */
-		int pause_end = timer->TC_CV + RWD_TIME_PAUSE;
-		AT91C_BASE_PIOA->PIO_CODR = GPIO_SSC_DOUT;
-		while(timer->TC_CV < pause_end) ;
-		AT91C_BASE_PIOA->PIO_SODR = GPIO_SSC_DOUT;
-	}
+	/* One final pause to mark the end of the frame */
+	int pause_end = timer->TC_CV + RWD_TIME_PAUSE;
+	AT91C_BASE_PIOA->PIO_CODR = GPIO_SSC_DOUT;
+	while(timer->TC_CV < pause_end) ;
+	AT91C_BASE_PIOA->PIO_SODR = GPIO_SSC_DOUT;
+
 
 	/* Reset the timer, to measure time until the start of the tag frame */
 	timer->TC_CCR = AT91C_TC_SWTRG;
@@ -238,8 +239,7 @@ static void frame_receive_rwd(struct legic_frame * const f, int bits, int crypt)
      * since we cannot compute it on the fly while reading */
 	legic_prng_forward(2);
 
-	if(crypt)
-	{
+	if(crypt) {
 		for(i=0; i<bits; i++) {
 			data |= legic_prng_get_bit() << i;
 			legic_prng_forward(1);
@@ -276,9 +276,9 @@ static void frame_receive_rwd(struct legic_frame * const f, int bits, int crypt)
 
 static void frame_append_bit(struct legic_frame * const f, int bit)
 {
-   if(f->bits >= 31) {
+   if(f->bits >= 31)
        return; /* Overflow, won't happen */
-   }
+  
    f->data |= (bit<<f->bits);
    f->bits++;
 }
@@ -426,6 +426,7 @@ int LegicRfReader(int offset, int bytes) {
 
 	LegicCommonInit();
 
+	uint8_t *BigBuf = BigBuf_get_addr();
 	memset(BigBuf, 0, 1024);
 
 	DbpString("setting up legic card");
@@ -446,12 +447,11 @@ int LegicRfReader(int offset, int bytes) {
 			Dbprintf("Unknown card format: %x",tag_type);
 			return -1;
 	}
-	if(bytes == -1) {
+	if(bytes == -1)
 		bytes = card_sz;
-	}
-	if(bytes+offset >= card_sz) {
+
+	if(bytes+offset >= card_sz)
 		bytes = card_sz-offset;
-	}
 
 	perform_setup_phase_rwd(SESSION_IV);
 
@@ -465,7 +465,7 @@ int LegicRfReader(int offset, int bytes) {
        		LED_C_OFF();
 	        return -1;
 		}
-		((uint8_t*)BigBuf)[byte_index] = r;
+		BigBuf[byte_index] = r;
         WDT_HIT();
 		byte_index++;
 		if(byte_index & 0x10) LED_C_ON(); else LED_C_OFF();
@@ -480,7 +480,8 @@ int LegicRfReader(int offset, int bytes) {
 
 void LegicRfWriter(int bytes, int offset) {
 	int byte_index=0, addr_sz=0;
-	
+	uint8_t *BigBuf = BigBuf_get_addr();
+
 	LegicCommonInit();
 	
 	DbpString("setting up legic card");
@@ -512,7 +513,7 @@ void LegicRfWriter(int bytes, int offset) {
 	perform_setup_phase_rwd(SESSION_IV);
     legic_prng_forward(2);
 	while(byte_index < bytes) {
-		int r = legic_write_byte(((uint8_t*)BigBuf)[byte_index+offset], byte_index+offset, addr_sz);
+		int r = legic_write_byte(BigBuf[byte_index+offset], byte_index+offset, addr_sz);
 		if((r != 0) || BUTTON_PRESS()) {
 			Dbprintf("operation aborted @ 0x%03.3x", byte_index);
 			switch_off_tag_rwd();
@@ -534,6 +535,8 @@ int timestamp;
 /* Handle (whether to respond) a frame in tag mode */
 static void frame_handle_tag(struct legic_frame const * const f)
 {
+	uint8_t *BigBuf = BigBuf_get_addr();
+
    /* First Part of Handshake (IV) */
    if(f->bits == 7) {
      if(f->data == SESSION_IV) {
@@ -582,9 +585,9 @@ static void frame_handle_tag(struct legic_frame const * const f)
       if(legic_state == STATE_CON) {
          int key   = get_key_stream(-1, 11); //legic_phase_drift, 11);
          int addr  = f->data ^ key; addr = addr >> 1;
-         int data = ((uint8_t*)BigBuf)[addr];
+         int data = BigBuf[addr];
          int hash = LegicCRC(addr, data, 11) << 8;
-         ((uint8_t*)BigBuf)[OFFSET_LOG+legic_read_count] = (uint8_t)addr;
+         BigBuf[OFFSET_LOG+legic_read_count] = (uint8_t)addr;
          legic_read_count++;
 
          //Dbprintf("Data:%03.3x, key:%03.3x, addr: %03.3x, read_c:%u", f->data, key, addr, read_c);
@@ -619,19 +622,19 @@ static void frame_handle_tag(struct legic_frame const * const f)
       int i;
       Dbprintf("IV: %03.3x", legic_prng_iv);
       for(i = 0; i<legic_read_count; i++) {
-         Dbprintf("Read Nb: %u, Addr: %u", i, ((uint8_t*)BigBuf)[OFFSET_LOG+i]);
+         Dbprintf("Read Nb: %u, Addr: %u", i, BigBuf[OFFSET_LOG+i]);
       }
 
       for(i = -1; i<legic_read_count; i++) {
          uint32_t t;
-         t  = ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4];
-         t |= ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4+1] << 8;
-         t |= ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4+2] <<16;
-         t |= ((uint8_t*)BigBuf)[OFFSET_LOG+256+i*4+3] <<24;
+         t  = BigBuf[OFFSET_LOG+256+i*4];
+         t |= BigBuf[OFFSET_LOG+256+i*4+1] << 8;
+         t |= BigBuf[OFFSET_LOG+256+i*4+2] <<16;
+         t |= BigBuf[OFFSET_LOG+256+i*4+3] <<24;
 
          Dbprintf("Cycles: %u, Frame Length: %u, Time: %u", 
-            ((uint8_t*)BigBuf)[OFFSET_LOG+128+i],
-            ((uint8_t*)BigBuf)[OFFSET_LOG+384+i],
+            BigBuf[OFFSET_LOG+128+i],
+            BigBuf[OFFSET_LOG+384+i],
             t);
       }
    }
@@ -706,7 +709,7 @@ void LegicRfSimulate(int phase, int frame, int reqresp)
 
    LED_B_ON();
    DbpString("Starting Legic emulator, press button to end");
-   while(!BUTTON_PRESS()) {
+   while(!BUTTON_PRESS() && !usb_poll_validate_length()) {
       int level = !!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_DIN);
       int time = timer->TC_CV;