-/* 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
{\r
uint32_t i;\r
for(i = 0; i < 1 << 20; ++i)\r
- filterlut[i] = filter(i);\r
+ filterlut[i] = filter(i);\r
}\r
#define filter(x) (filterlut[(x) & 0xfffff])\r
#endif\r
return statelist;\r
}\r
\r
-static const uint32_t S1[] = { 0x62141, 0x310A0, 0x18850, 0x0C428, 0x06214,\r
+static const uint32_t S1[] = { 0x62141, 0x310A0, 0x18850, 0x0C428, 0x06214,\r
0x0310A, 0x85E30, 0xC69AD, 0x634D6, 0xB5CDE, 0xDE8DA, 0x6F46D, 0xB3C83,\r
0x59E41, 0xA8995, 0xD027F, 0x6813F, 0x3409F, 0x9E6FA};\r
static const uint32_t S2[] = { 0x3A557B00, 0x5D2ABD80, 0x2E955EC0, 0x174AAF60,\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
+ \r
+ uint32_t c = 0;\r
+\r
+ sl->odd = odd ^ fastfwd[1][c];\r
+ sl->even = even ^ fastfwd[0][c];\r
+ \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
+ return ++sl;\r
+}\r
\r
/** lfsr_common_prefix\r
* Implentation of the common prefix attack.\r
odd = lfsr_prefix_ks(ks, 1);\r
even = lfsr_prefix_ks(ks, 0);\r
\r
- s = statelist = malloc((sizeof *statelist) << 21);\r
+ s = statelist = malloc((sizeof *statelist) << 20);\r
if(!s || !odd || !even) {\r
free(statelist);\r
- free(odd);\r
- free(even);\r
- return 0;\r
+ statelist = 0;\r
+ goto out;\r
}\r
\r
for(o = odd; *o + 1; ++o)\r
}\r
\r
s->odd = s->even = 0;\r
+out:\r
+ free(odd);\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
+\r
+ // in this version, -1 signifies end of states \r
+ s->odd = s->even = -1;\r
+\r
+out:\r
free(odd);\r
free(even);\r
return statelist;\r