/** nonce_distance\r
* x,y valid tag nonces, then prng_successor(x, nonce_distance(x, y)) = y\r
*/\r
-static uint16_t *dist = 0;\r
+static uint16_t *dist;\r
int nonce_distance(uint32_t from, uint32_t to)\r
{\r
uint16_t x, i;\r
dist = malloc(2 << 16);\r
if(!dist)\r
return -1;\r
- for (x = i = 1; i; ++i) {\r
+ for (x = 1, i = 1; i; ++i) {\r
dist[(x & 0xff) << 8 | x >> 8] = i;\r
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;\r
}\r
\r
return sl + good;\r
}\r
+static struct Crypto1State* check_pfx_parity_ex(uint32_t prefix, uint32_t odd, uint32_t even, struct Crypto1State* sl) {\r
+ struct Crypto1State s;\r
+ uint32_t c = 0;\r
+\r
+ s.odd = odd ^ fastfwd[1][c];\r
+ s.even = even ^ fastfwd[0][c];\r
+ \r
+ lfsr_rollback_bit(&s, 0, 0);\r
+ lfsr_rollback_bit(&s, 0, 0);\r
+ lfsr_rollback_bit(&s, 0, 0);\r
+ \r
+ lfsr_rollback_word(&s, 0, 0);\r
+ lfsr_rollback_word(&s, prefix | c << 5, 1);\r
+ \r
+ sl->odd = s.odd;\r
+ sl->even = s.even;\r
+ return ++sl;\r
+}\r
\r
/** lfsr_common_prefix\r
* Implentation of the common prefix attack.\r
free(even);\r
return statelist;\r
}\r
+\r
+struct Crypto1State* lfsr_common_prefix_ex(uint32_t pfx, uint8_t ks[8])\r
+{\r
+ struct Crypto1State *statelist, *s;\r
+ uint32_t *odd, *even, *o, *e, top;\r
+\r
+ odd = lfsr_prefix_ks(ks, 1);\r
+ even = lfsr_prefix_ks(ks, 0);\r
+\r
+ s = statelist = malloc((sizeof *statelist) << 20);\r
+ if(!s || !odd || !even) {\r
+ free(statelist);\r
+ statelist = 0;\r
+ goto out;\r
+ }\r
+\r
+ // for(o = odd; *o + 1; ++o)\r
+ // for(e = even; *e + 1; ++e)\r
+ // for(top = 0; top < 64; ++top) {\r
+ // *o += 1 << 21;\r
+ // *e += (!(top & 7) + 1) << 21;\r
+ // s = check_pfx_parity_ex(pfx, *o, *e, s);\r
+ // }\r
+ for(o = odd; *o != -1; ++o)\r
+ for(e = even; *e != -1; ++e)\r
+ for(top = 0; top < 64; ++top) {\r
+ *o = (*o & 0x1fffff) | (top << 21);\r
+ *e = (*e & 0x1fffff) | (top >> 3) << 21;\r
+ s = check_pfx_parity_ex(pfx, *o, *e, s);\r
+ }\r
+\r
+ s->odd = s->even = -1; \r
+out:\r
+ free(odd);\r
+ free(even);\r
+ return statelist;\r
+}\r