]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/nonce2key/crapto1.c
FIX: Some Coverity Scan warnings. fread, not initialised etc etc
[proxmark3-svn] / client / nonce2key / crapto1.c
index 36e21a1ce9b13ddccae09772c407c72c6095c007..c17cea7a5566922cae6563c1edea72ed3bf300be 100644 (file)
@@ -26,7 +26,7 @@ static void __attribute__((constructor)) fill_lut()
 {\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
@@ -158,7 +158,14 @@ struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
        // allocate memory for out of place bucket_sort\r
        bucket_array_t bucket;\r
        \r
-       if ( !bucket_malloc(bucket) ) goto out;\r
+       for (uint32_t i = 0; i < 2; i++) {\r
+               for (uint32_t j = 0; j <= 0xff; j++) {\r
+                       bucket[i][j].head = malloc(sizeof(uint32_t)<<14);\r
+                       if (!bucket[i][j].head) {\r
+                                goto out;\r
+                       }\r
+               }\r
+       }\r
 \r
        // initialize statelists: add all possible states which would result into the rightmost 2 bits of the keystream\r
        for(i = 1 << 20; i >= 0; --i) {\r
@@ -181,13 +188,15 @@ struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
        recover(odd_head, odd_tail, oks, even_head, even_tail, eks, 11, statelist, in << 1, bucket);\r
 \r
 out:\r
+       for (uint32_t i = 0; i < 2; i++)\r
+               for (uint32_t j = 0; j <= 0xff; j++)\r
+                       free(bucket[i][j].head);\r
        free(odd_head);\r
        free(even_head);\r
-       bucket_free(bucket);\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
@@ -374,7 +383,7 @@ uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)
 /** 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
@@ -382,7 +391,7 @@ int nonce_distance(uint32_t from, uint32_t to)
                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
@@ -458,6 +467,24 @@ static struct Crypto1State* check_pfx_parity(uint32_t prefix, uint32_t rresp, ui
 \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
@@ -477,12 +504,11 @@ struct Crypto1State* lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8]
        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
@@ -494,8 +520,45 @@ struct Crypto1State* lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8]
                        }\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
+       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
-}
\ No newline at end of file
+}\r
Impressum, Datenschutz