\r
static void quicksort(uint32_t* const start, uint32_t* const stop)\r
{\r
- uint32_t *it = start + 1, *rit = stop;\r
- uint32_t tmp;\r
+ uint32_t *it = start + 1, *rit = stop, t;\r
\r
if(it > rit)\r
return;\r
++it;\r
else if(*rit > *start)\r
--rit;\r
- else {\r
- tmp = *it;\r
- *it = *rit;\r
- *rit = tmp;\r
- }\r
+ else\r
+ t = *it, *it = *rit, *rit = t;\r
\r
if(*rit >= *start)\r
--rit;\r
- if(rit != start) {\r
- tmp = *rit;\r
- *rit = *start;\r
- *start = tmp;\r
- }\r
+ if(rit != start)\r
+ t = *rit, *rit = *start, *start = t;\r
\r
quicksort(start, rit - 1);\r
quicksort(rit + 1, stop);\r
{\r
int out;\r
uint8_t ret;\r
- uint32_t tmp;\r
+ uint32_t t;\r
\r
s->odd &= 0xffffff;\r
- tmp = s->odd;\r
- s->odd = s->even;\r
- s->even = tmp;\r
+ t = s->odd, s->odd = s->even, s->even = t;\r
\r
out = s->even & 1;\r
out ^= LF_POLY_EVEN & (s->even >>= 1);\r
*/\r
uint8_t lfsr_rollback_byte(struct Crypto1State *s, uint32_t in, int fb)\r
{\r
-/* int i, ret = 0;\r
+ /*\r
+ int i, ret = 0;\r
for (i = 7; i >= 0; --i)\r
ret |= lfsr_rollback_bit(s, BIT(in, i), fb) << i;\r
*/\r
*/\r
uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)\r
{\r
-/* int i;\r
+ /*\r
+ int i;\r
uint32_t ret = 0;\r
for (i = 31; i >= 0; --i)\r
ret |= lfsr_rollback_bit(s, BEBIT(in, i), fb) << (i ^ 24);\r
static uint32_t fastfwd[2][8] = {\r
{ 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB},\r
{ 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980}};\r
+\r
+\r
/** lfsr_prefix_ks\r
*\r
* Is an exported helper function from the common prefix attack\r
* encrypt the NACK which is observed when varying only the 3 last bits of Nr\r
* only correct iff [NR_3] ^ NR_3 does not depend on Nr_3\r
*/\r
+ // TO VERIFY \r
uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd)\r
{\r
- uint32_t c, entry, *candidates = malloc(4 << 10);\r
- int i, size = 0, good;\r
+ uint32_t *candidates = malloc(4 << 10);\r
+ uint32_t c, entry;\r
+ int size = 0, i, good;\r
\r
if(!candidates)\r
return 0;\r
\r
/** lfsr_common_prefix\r
* Implentation of the common prefix attack.\r
+ * Requires the 28 bit constant prefix used as reader nonce (pfx)\r
+ * The reader response used (rr)\r
+ * The keystream used to encrypt the observed NACK's (ks)\r
+ * The parity bits (par)\r
+ * It returns a zero terminated list of possible cipher states after the\r
+ * tag nonce was fed in\r
*/\r
struct Crypto1State*\r
lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8])\r
s = statelist = malloc((sizeof *statelist) << 20);\r
if(!s || !odd || !even) {\r
free(statelist);\r
- statelist = 0;\r
- goto out;\r
+ free(odd);\r
+ free(even);\r
+ return 0;\r
}\r
\r
for(o = odd; *o + 1; ++o)\r
}\r
\r
s->odd = s->even = 0;\r
-out:\r
+\r
free(odd);\r
free(even);\r
+\r
return statelist;\r
}\r
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, US$
- Copyright (C) 2008-2008 bla <blapost@gmail.com>
+ Copyright (C) 2008-2014 bla <blapost@gmail.com>
*/
#ifndef CRAPTO1_INCLUDED
#define CRAPTO1_INCLUDED
uint8_t lfsr_rollback_byte(struct Crypto1State* s, uint32_t in, int fb);
uint32_t lfsr_rollback_word(struct Crypto1State* s, uint32_t in, int fb);
int nonce_distance(uint32_t from, uint32_t to);
+#define SWAPENDIAN(x)\
+ (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16)
+
#define FOREACH_VALID_NONCE(N, FILTER, FSIZE)\
uint32_t __n = 0,__M = 0, N = 0;\
int __i;\