-/* crapto1.c\r
+1/* crapto1.c\r
\r
This program is free software; you can redistribute it and/or\r
modify it under the terms of the GNU General Public License\r
/** nonce_distance\r
* x,y valid tag nonces, then prng_successor(x, nonce_distance(x, y)) = y\r
*/\r
-static uint16_t *dist;\r
+static uint16_t *dist = 0;\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 = 1, i = 1; i; ++i) {\r
+ for (x = 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
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
+ \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
+ sl.odd = odd ^ fastfwd[1][c];\r
+ sl.even = even ^ fastfwd[0][c];\r
\r
- lfsr_rollback_word(&s, 0, 0);\r
- lfsr_rollback_word(&s, prefix | c << 5, 1);\r
+ lfsr_rollback_bit(&sl, 0, 0);\r
+ lfsr_rollback_bit(&sl, 0, 0);\r
+ lfsr_rollback_bit(&sl, 0, 0);\r
+ lfsr_rollback_word(&sl, 0, 0);\r
+ lfsr_rollback_word(&sl, prefix | c << 5, 1);\r
\r
- sl->odd = s.odd;\r
- sl->even = s.even;\r
return ++sl;\r
}\r
\r
*(state_s + i) = key_recovered;
}
- PrintAndLog("zero");
if(!state)
return 1;
p1 = p3 = last_keylist;
p2 = state_s;
- PrintAndLog("one");
while ( *p1 != -1 && *p2 != -1 ) {
if (compar_int(p1, p2) == 0) {
printf("p1:%"llx" p2:%"llx" p3:%"llx" key:%012"llx"\n",(uint64_t)(p1-last_keylist),(uint64_t)(p2-state_s),(uint64_t)(p3-last_keylist),*p1);
while (compar_int(p1, p2) == 1) ++p2;
}
}
- key_count = p3 - last_keylist;;
+ key_count = p3 - last_keylist;
+ PrintAndLog("one A");
} else {
key_count = 0;
+ PrintAndLog("one B");
}
printf("key_count:%d\n", key_count);
// The list may still contain several key candidates. Test each of them with mfCheckKeys
uint8_t keyBlock[6] = {0,0,0,0,0,0};
uint64_t key64;
- PrintAndLog("two");
for (i = 0; i < key_count; i++) {
key64 = *(last_keylist + i);
num_to_bytes(key64, 6, keyBlock);
}
}
-
free(last_keylist);
last_keylist = state_s;
return 1;