X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/cd777a0545066d87b1e0f838cdee0604941919d7..9bef1216b98ab37573afa24195fe61f46e076232:/client/nonce2key/crapto1.c

diff --git a/client/nonce2key/crapto1.c b/client/nonce2key/crapto1.c
index c17cea7a..9f6f7f6b 100644
--- a/client/nonce2key/crapto1.c
+++ b/client/nonce2key/crapto1.c
@@ -383,7 +383,7 @@ uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)
 /** nonce_distance
  * x,y valid tag nonces, then prng_successor(x, nonce_distance(x, y)) = y
  */
-static uint16_t *dist;
+static uint16_t *dist = 0;
 int nonce_distance(uint32_t from, uint32_t to)
 {
 	uint16_t x, i;
@@ -391,7 +391,7 @@ int nonce_distance(uint32_t from, uint32_t to)
 		dist = malloc(2 << 16);
 		if(!dist)
 			return -1;
-		for (x = 1, i = 1; i; ++i) {
+		for (x = i = 1; i; ++i) {
 			dist[(x & 0xff) << 8 | x >> 8] = i;
 			x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
 		}
@@ -468,21 +468,18 @@ static struct Crypto1State* check_pfx_parity(uint32_t prefix, uint32_t rresp, ui
 	return sl + good;
 }
 static struct Crypto1State* check_pfx_parity_ex(uint32_t prefix, uint32_t odd, uint32_t even, struct Crypto1State* sl) {
-	struct Crypto1State s;
+	
 	uint32_t c = 0;
 
-	s.odd = odd ^ fastfwd[1][c];
-	s.even = even ^ fastfwd[0][c];
-	
-	lfsr_rollback_bit(&s, 0, 0);
-	lfsr_rollback_bit(&s, 0, 0);
-	lfsr_rollback_bit(&s, 0, 0);
+	sl->odd = odd ^ fastfwd[1][c];
+	sl->even = even ^ fastfwd[0][c];
 	
-	lfsr_rollback_word(&s, 0, 0);
-	lfsr_rollback_word(&s, prefix | c << 5, 1);
+	lfsr_rollback_bit(sl, 0, 0);
+	lfsr_rollback_bit(sl, 0, 0);
+	lfsr_rollback_bit(sl, 0, 0);
+	lfsr_rollback_word(sl, 0, 0);
+	lfsr_rollback_word(sl, prefix | c << 5, 1);
 	
-	sl->odd = s.odd;
-	sl->even = s.even;
 	return ++sl;
 }
 
@@ -541,24 +538,19 @@ struct Crypto1State* lfsr_common_prefix_ex(uint32_t pfx, uint8_t ks[8])
 		goto out;
 	}
 
-	// for(o = odd; *o + 1; ++o)
-		// for(e = even; *e + 1; ++e)
-			// for(top = 0; top < 64; ++top) {
-				// *o += 1 << 21;
-				// *e += (!(top & 7) + 1) << 21;
-				// s = check_pfx_parity_ex(pfx, *o, *e, s);
-			// }
-	for(o = odd; *o != -1; ++o)
-		for(e = even; *e != -1; ++e)
+	for(o = odd; *o + 1; ++o)
+		for(e = even; *e + 1; ++e)
 			for(top = 0; top < 64; ++top) {
-				*o = (*o & 0x1fffff) | (top << 21);
-				*e = (*e & 0x1fffff) | (top >> 3) << 21;
+				*o += 1 << 21;
+				*e += (!(top & 7) + 1) << 21;
 				s = check_pfx_parity_ex(pfx, *o, *e, s);
 			}
 
-	s->odd = s->even = -1;	
+	// in this version, -1 signifies end of states 
+	s->odd = s->even = -1;
+
 out:
 	free(odd);
 	free(even);
 	return statelist;
-}
+}
\ No newline at end of file