]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Upgrade crapto1 library to v3.3 (#232)
authorpwpiwi <pwpiwi@users.noreply.github.com>
Sun, 12 Mar 2017 14:05:54 +0000 (15:05 +0100)
committerGitHub <noreply@github.com>
Sun, 12 Mar 2017 14:05:54 +0000 (15:05 +0100)
- fix standalone tools mfkey32, mfkey64 and nonce2key to use common crapto1 library
- fix compiler warnings in tools/mfkey/mfkey64.c and tools/nonce2key/nonce2key.c
- allow crapto1.c to compile on ARM hosts
- add @iceman1001's readme.txt to tools/mfkey

client/Makefile
client/nonce2key/nonce2key.c
common/crapto1/crapto1.c
common/crapto1/crapto1.h
common/crapto1/crypto1.c
tools/mfkey/Makefile
tools/mfkey/mfkey32.c
tools/mfkey/mfkey64.c
tools/nonce2key/Makefile
tools/nonce2key/nonce2key.c

index 0a4fc1608abd5d41ff3536c820a9a440d044524d..9d650c9f8a8c4db603682cf3a969ca7eef7afd02 100644 (file)
@@ -9,7 +9,7 @@ include ../common/Makefile.common
 CC=gcc
 CXX=g++
 #COMMON_FLAGS = -m32
-VPATH = ../common ../zlib ../tools
+VPATH = ../common ../zlib
 OBJDIR = obj
 
 LDLIBS = -L/opt/local/lib -L/usr/local/lib -lreadline -lpthread -lm
index 68cd1cd9e97a696d8cef67be00405978866f9a28..5378c0466ae80685cdd6bc4352b1549c9da3f153 100644 (file)
@@ -72,8 +72,8 @@ int nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint64_t par_info, uint64_
     printf("%01x|\n", par[i][7]);
   }
   
-       if (par_info==0)
-               PrintAndLog("parity is all zero,try special attack!just wait for few more seconds...");
+       if (par_info == 0)
+               PrintAndLog("Parity is all zero, trying special attack! Just wait for few more seconds...");
   
        state = lfsr_common_prefix(nr, rr, ks3x, par);
        state_s = (int64_t*)state;
@@ -82,7 +82,7 @@ int nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint64_t par_info, uint64_
     //sprintf(filename, "nt_%08x_%d.txt", nt, nr);
     //printf("name %s\n", filename);
        //FILE* fp = fopen(filename,"w");
-       for (i = 0; (state) && ((state + i)->odd != -1); i++)
+       for (i = 0; (state) && *(state_s + i); i++)
        {
                lfsr_rollback_word(state+i, uid^nt, 0);
                crypto1_get_lfsr(state + i, &key_recovered);
@@ -98,9 +98,8 @@ int nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint64_t par_info, uint64_
        *(state_s + i) = -1;
        
        //Create the intersection:
-       if (par_info == 0 )
-               if ( last_keylist != NULL)
-               {
+       if (par_info == 0 ) {
+               if (last_keylist != NULL) {
                        int64_t *p1, *p2, *p3;
                        p1 = p3 = last_keylist; 
                        p2 = state_s;
@@ -115,12 +114,11 @@ int nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint64_t par_info, uint64_
                                        while (compar_state(p1, p2) == 1) ++p2;
                                }
                        }
-                       key_count = p3 - last_keylist;;
-               }
-               else
+                       key_count = p3 - last_keylist;
+               } else {
                        key_count = 0;
-       else
-       {
+               }
+       } else {
                last_keylist = state_s;
                key_count = i;
        }
@@ -138,7 +136,7 @@ int nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint64_t par_info, uint64_
                        *key = key64;
                        free(last_keylist);
                        last_keylist = NULL;
-                       if (par_info ==0)
+                       if (par_info == 0)
                                free(state);
                        return 0;
                }
index 6a194c4629a605739ddb012d3382fd2e51eb53c3..82c5b65bc2a8e32ca5e38e117192cefa24a0f59c 100644 (file)
        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>
 */
 #include "crapto1.h"
 #include <stdlib.h>
-#include <stdbool.h>
 
 #if !defined LOWMEM && defined __GNUC__
 static uint8_t filterlut[1 << 20];
@@ -95,12 +94,10 @@ static void bucket_sort_intersect(uint32_t* const estart, uint32_t* const estop,
                bucket_info->numbuckets = nonempty_bucket;
                }
 }
-
 /** binsearch
  * Binary search for the first occurence of *stop's MSB in sorted [start,stop]
  */
-static inline uint32_t*
-binsearch(uint32_t *start, uint32_t *stop)
+static inline uint32_t* binsearch(uint32_t *start, uint32_t *stop)
 {
        uint32_t mid, val = *stop & 0xff000000;
        while(start != stop)
@@ -132,41 +129,34 @@ static inline void
 extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in)
 {
        in <<= 24;
-
-       for(uint32_t *p = tbl; p <= *end; p++) {
-               *p <<= 1;
-               if(filter(*p) != filter(*p | 1)) {                              // replace
-                       *p |= filter(*p) ^ bit;
-                       update_contribution(p, m1, m2);
-                       *p ^= in;
-               } else if(filter(*p) == bit) {                                  // insert
-                       *++*end = p[1];
-                       p[1] = p[0] | 1;
-                       update_contribution(p, m1, m2);
-                       *p++ ^= in;
-                       update_contribution(p, m1, m2);
-                       *p ^= in;
-               } else {                                                                                // drop
-                       *p-- = *(*end)--;
-               }
-       }
-
+       for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)
+               if(filter(*tbl) ^ filter(*tbl | 1)) {
+                       *tbl |= filter(*tbl) ^ bit;
+                       update_contribution(tbl, m1, m2);
+                       *tbl ^= in;
+               } else if(filter(*tbl) == bit) {
+                       *++*end = tbl[1];
+                       tbl[1] = tbl[0] | 1;
+                       update_contribution(tbl, m1, m2);
+                       *tbl++ ^= in;
+                       update_contribution(tbl, m1, m2);
+                       *tbl ^= in;
+               } else
+                       *tbl-- = *(*end)--;
 }
-
-
 /** extend_table_simple
  * using a bit of the keystream extend the table of possible lfsr states
  */
-static inline void
-extend_table_simple(uint32_t *tbl, uint32_t **end, int bit)
+static inline void extend_table_simple(uint32_t *tbl, uint32_t **end, int bit)
 {
        for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)
-               if(filter(*tbl) ^ filter(*tbl | 1)) {   // replace
+               if(filter(*tbl) ^ filter(*tbl | 1))
                        *tbl |= filter(*tbl) ^ bit;
-               } else if(filter(*tbl) == bit) {                // insert
+               else if(filter(*tbl) == bit) {
                        *++*end = *++tbl;
                        *tbl = tbl[-1] | 1;
-               } else                                                                  // drop
+
+               } else
                        *tbl-- = *(*end)--;
 }
 
@@ -179,7 +169,7 @@ recover(uint32_t *o_head, uint32_t *o_tail, uint32_t oks,
        uint32_t *e_head, uint32_t *e_tail, uint32_t eks, int rem,
        struct Crypto1State *sl, uint32_t in, bucket_array_t bucket)
 {
-       uint32_t *o, *e;
+       uint32_t *o, *e, i;
        bucket_info_t bucket_info;
 
        if(rem == -1) {
@@ -188,24 +178,26 @@ recover(uint32_t *o_head, uint32_t *o_tail, uint32_t oks,
                        for(o = o_head; o <= o_tail; ++o, ++sl) {
                                sl->even = *o;
                                sl->odd = *e ^ parity(*o & LF_POLY_ODD);
+                               sl[1].odd = sl[1].even = 0;
                        }
                }
-               sl->odd = sl->even = 0;
                return sl;
        }
 
-       for(uint32_t i = 0; i < 4 && rem--; i++) {
-               extend_table(o_head, &o_tail, (oks >>= 1) & 1,
-                       LF_POLY_EVEN << 1 | 1, LF_POLY_ODD << 1, 0);
+       for(i = 0; i < 4 && rem--; i++) {
+               oks >>= 1;
+               eks >>= 1;
+               in >>= 2;
+               extend_table(o_head, &o_tail, oks & 1, LF_POLY_EVEN << 1 | 1,
+                            LF_POLY_ODD << 1, 0);
                if(o_head > o_tail)
                        return sl;
 
-               extend_table(e_head, &e_tail, (eks >>= 1) & 1,
-                       LF_POLY_ODD, LF_POLY_EVEN << 1 | 1, (in >>= 2) & 3);
+               extend_table(e_head, &e_tail, eks & 1, LF_POLY_ODD,
+                            LF_POLY_EVEN << 1 | 1, in & 3);
                if(e_head > e_tail)
                        return sl;
        }
-
        bucket_sort_intersect(e_head, e_tail, o_head, o_tail, &bucket_info, bucket);
 
        for (int i = bucket_info.numbuckets - 1; i >= 0; i--) {
@@ -228,7 +220,6 @@ struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
        uint32_t *even_head = 0, *even_tail = 0, eks = 0;
        int i;
 
-       // split the keystream into an odd and even part
        for(i = 31; i >= 0; i -= 2)
                oks = oks << 1 | BEBIT(ks2, i);
        for(i = 30; i >= 0; i -= 2)
@@ -238,6 +229,8 @@ struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
        even_head = even_tail = malloc(sizeof(uint32_t) << 21);
        statelist =  malloc(sizeof(struct Crypto1State) << 18);
        if(!odd_tail-- || !even_tail-- || !statelist) {
+               free(statelist);
+               statelist = 0;
                goto out;
        }
        statelist->odd = statelist->even = 0;
@@ -253,7 +246,6 @@ struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
                }
 
 
-       // initialize statelists: add all possible states which would result into the rightmost 2 bits of the keystream
        for(i = 1 << 20; i >= 0; --i) {
                if(filter(i) == (oks & 1))
                        *++odd_tail = i;
@@ -261,22 +253,15 @@ struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
                        *++even_tail = i;
        }
 
-       // extend the statelists. Look at the next 8 Bits of the keystream (4 Bit each odd and even):
        for(i = 0; i < 4; i++) {
                extend_table_simple(odd_head,  &odd_tail, (oks >>= 1) & 1);
                extend_table_simple(even_head, &even_tail, (eks >>= 1) & 1);
        }
 
-       // the statelists now contain all states which could have generated the last 10 Bits of the keystream.
-       // 22 bits to go to recover 32 bits in total. From now on, we need to take the "in"
-       // parameter into account.
-
-       in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00);            // Byte swapping
-
+       in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00);
        recover(odd_head, odd_tail, oks,
                even_head, even_tail, eks, 11, statelist, in << 1, bucket);
 
-
 out:
        free(odd_head);
        free(even_head);
@@ -324,12 +309,12 @@ struct Crypto1State* lfsr_recovery64(uint32_t ks2, uint32_t ks3)
        sl->odd = sl->even = 0;
 
        for(i = 30; i >= 0; i -= 2) {
-               oks[i >> 1] = BIT(ks2, i ^ 24);
-               oks[16 + (i >> 1)] = BIT(ks3, i ^ 24);
+               oks[i >> 1] = BEBIT(ks2, i);
+               oks[16 + (i >> 1)] = BEBIT(ks3, i);
        }
        for(i = 31; i >= 0; i -= 2) {
-               eks[i >> 1] = BIT(ks2, i ^ 24);
-               eks[16 + (i >> 1)] = BIT(ks3, i ^ 24);
+               eks[i >> 1] = BEBIT(ks2, i);
+               eks[16 + (i >> 1)] = BEBIT(ks3, i);
        }
 
        for(i = 0xfffff; i >= 0; --i) {
@@ -380,41 +365,44 @@ struct Crypto1State* lfsr_recovery64(uint32_t ks2, uint32_t ks3)
 /** lfsr_rollback_bit
  * Rollback the shift register in order to get previous states
  */
-void lfsr_rollback_bit(struct Crypto1State *s, uint32_t in, int fb)
+uint8_t lfsr_rollback_bit(struct Crypto1State *s, uint32_t in, int fb)
 {
        int out;
-       uint32_t tmp;
-
+       uint8_t ret;
+       uint32_t t;
+       
        s->odd &= 0xffffff;
-       tmp = s->odd;
-       s->odd = s->even;
-       s->even = tmp;
+       t = s->odd, s->odd = s->even, s->even = t;
 
        out = s->even & 1;
        out ^= LF_POLY_EVEN & (s->even >>= 1);
        out ^= LF_POLY_ODD & s->odd;
        out ^= !!in;
-       out ^= filter(s->odd) & !!fb;
+       out ^= (ret = filter(s->odd)) & !!fb;
 
        s->even |= parity(out) << 23;
+       return ret;
 }
 /** lfsr_rollback_byte
  * Rollback the shift register in order to get previous states
  */
-void lfsr_rollback_byte(struct Crypto1State *s, uint32_t in, int fb)
+uint8_t lfsr_rollback_byte(struct Crypto1State *s, uint32_t in, int fb)
 {
-       int i;
+       int i, ret=0;
        for (i = 7; i >= 0; --i)
-               lfsr_rollback_bit(s, BEBIT(in, i), fb);
+               ret |= lfsr_rollback_bit(s, BIT(in, i), fb) << i;
+       return ret;
 }
 /** lfsr_rollback_word
  * Rollback the shift register in order to get previous states
  */
-void lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)
+uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)
 {
        int i;
+       uint32_t ret = 0;
        for (i = 31; i >= 0; --i)
-               lfsr_rollback_bit(s, BEBIT(in, i), fb);
+               ret |= lfsr_rollback_bit(s, BEBIT(in, i), fb) << (i ^ 24);
+       return ret;
 }
 
 /** nonce_distance
@@ -440,112 +428,86 @@ int nonce_distance(uint32_t from, uint32_t to)
 static uint32_t fastfwd[2][8] = {
        { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB},
        { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980}};
-
-
 /** lfsr_prefix_ks
  *
  * Is an exported helper function from the common prefix attack
  * Described in the "dark side" paper. It returns an -1 terminated array
  * of possible partial(21 bit) secret state.
  * The required keystream(ks) needs to contain the keystream that was used to
- * encrypt the NACK which is observed when varying only the 4 last bits of Nr
+ * encrypt the NACK which is observed when varying only the 3 last bits of Nr
  * only correct iff [NR_3] ^ NR_3 does not depend on Nr_3
  */
 uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd)
 {
-       uint32_t *candidates = malloc(4 << 21);
-       uint32_t c,  entry;
-       int size, i;
-
+       uint32_t c, entry, *candidates = malloc(4 << 10);
+       int i, size = 0, good;
+       
        if(!candidates)
                return 0;
 
-       size = (1 << 21) - 1;
-       for(i = 0; i <= size; ++i)
-               candidates[i] = i;
-
-       for(c = 0;  c < 8; ++c)
-               for(i = 0;i <= size; ++i) {
-                       entry = candidates[i] ^ fastfwd[isodd][c];
-
-                       if(filter(entry >> 1) == BIT(ks[c], isodd))
-                               if(filter(entry) == BIT(ks[c], isodd + 2))
-                                       continue;
-
-                       candidates[i--] = candidates[size--];
+       for(i = 0; i < 1 << 21; ++i) {
+               for(c = 0, good = 1; good && c < 8; ++c) {
+                       entry = i ^ fastfwd[isodd][c];
+                       good &= (BIT(ks[c], isodd) == filter(entry >> 1));
+                       good &= (BIT(ks[c], isodd + 2) == filter(entry));
                }
-
-       candidates[size + 1] = -1;
+               if(good)
+                       candidates[size++] = i;
+       }
+       
+       candidates[size] = -1;
 
        return candidates;
 }
 
-/** brute_top
+/** check_pfx_parity
  * helper function which eliminates possible secret states using parity bits
  */
 static struct Crypto1State*
-brute_top(uint32_t prefix, uint32_t rresp, unsigned char parities[8][8],
-                 uint32_t odd, uint32_t even, struct Crypto1State* sl)
+check_pfx_parity(uint32_t prefix, uint32_t rresp, uint8_t parities[8][8],
+               uint32_t odd, uint32_t even, struct Crypto1State* sl)
 {
-       struct Crypto1State s;
-       uint32_t ks1, nr, ks2, rr, ks3, good, c;
+       uint32_t ks1, nr, ks2, rr, ks3, c, good = 1, no_par = 1;
 
-       bool no_par = true;
        for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                        if (parities[i][j] != 0) {
-                               no_par = false;
+                               no_par = 0;
                                break;
                        }
                }
        }
 
-       for(c = 0; c < 8; ++c) {
-               s.odd = odd ^ fastfwd[1][c];
-               s.even = even ^ fastfwd[0][c];
+       for(c = 0; good && c < 8; ++c) {
+               sl->odd = odd ^ fastfwd[1][c];
+               sl->even = even ^ fastfwd[0][c];
 
-               lfsr_rollback_bit(&s, 0, 0);
-               lfsr_rollback_bit(&s, 0, 0);
-               lfsr_rollback_bit(&s, 0, 0);
+               lfsr_rollback_bit(sl, 0, 0);
+               lfsr_rollback_bit(sl, 0, 0);
 
-               lfsr_rollback_word(&s, 0, 0);
-               lfsr_rollback_word(&s, prefix | c << 5, 1);
-
-               sl->odd = s.odd;
-               sl->even = s.even;
+               ks3 = lfsr_rollback_bit(sl, 0, 0);
+               ks2 = lfsr_rollback_word(sl, 0, 0);
+               ks1 = lfsr_rollback_word(sl, prefix | c << 5, 1);
 
                if (no_par)
                        break;
 
-               ks1 = crypto1_word(&s, prefix | c << 5, 1);
-               ks2 = crypto1_word(&s,0,0);
-               ks3 = crypto1_word(&s, 0,0);
                nr = ks1 ^ (prefix | c << 5);
                rr = ks2 ^ rresp;
 
-               good = 1;
                good &= parity(nr & 0x000000ff) ^ parities[c][3] ^ BIT(ks2, 24);
                good &= parity(rr & 0xff000000) ^ parities[c][4] ^ BIT(ks2, 16);
                good &= parity(rr & 0x00ff0000) ^ parities[c][5] ^ BIT(ks2,  8);
                good &= parity(rr & 0x0000ff00) ^ parities[c][6] ^ BIT(ks2,  0);
-               good &= parity(rr & 0x000000ff) ^ parities[c][7] ^ BIT(ks3, 24);
-
-               if(!good)
-                       return sl;
+               good &= parity(rr & 0x000000ff) ^ parities[c][7] ^ ks3;
        }
 
-       return ++sl;
+       return sl + good;
 }
 
 
 /** lfsr_common_prefix
  * Implentation of the common prefix attack.
- * Requires the 28 bit constant prefix used as reader nonce (pfx)
- * The reader response used (rr)
- * The keystream used to encrypt the observed NACK's (ks)
- * The parity bits (par)
- * It returns a zero terminated list of possible cipher states after the
- * tag nonce was fed in
  */
 struct Crypto1State*
 lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8])
@@ -556,29 +518,24 @@ lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8])
        odd = lfsr_prefix_ks(ks, 1);
        even = lfsr_prefix_ks(ks, 0);
 
-       statelist = malloc((sizeof *statelist) << 21);  //how large should be?
-       if(!statelist || !odd || !even)
-       {
-                               free(statelist);
-                               free(odd);
-                               free(even);
-                               return 0;
+       s = statelist = malloc((sizeof *statelist) << 20);
+       if(!s || !odd || !even) {
+               free(statelist);
+               statelist = 0;
+                goto out;
        }
 
-       s = statelist;
-       for(o = odd; *o != -1; ++o)
-               for(e = even; *e != -1; ++e)
+       for(o = odd; *o + 1; ++o)
+               for(e = even; *e + 1; ++e)
                        for(top = 0; top < 64; ++top) {
-                               *o = (*o & 0x1fffff) | (top << 21);
-                               *e = (*e & 0x1fffff) | (top >> 3) << 21;
-                               s = brute_top(pfx, rr, par, *o, *e, s);
+                               *o += 1 << 21;
+                               *e += (!(top & 7) + 1) << 21;
+                               s = check_pfx_parity(pfx, rr, par, *o, *e, s);
                        }
 
-       s->odd = s->even = -1;
-       //printf("state count = %d\n",s-statelist);
-
+       s->odd = s->even = 0;
+out:
        free(odd);
        free(even);
-
        return statelist;
 }
index 741d2008a7a699922ecbfbc25ff4afcc0df07dd9..aef59b03d8215747cd044eeb2e59b141301b3716 100644 (file)
@@ -15,7 +15,7 @@
     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
@@ -44,9 +44,9 @@ struct Crypto1State*
 lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8]);
 
 
-void lfsr_rollback_bit(struct Crypto1State* s, uint32_t in, int fb);
-void lfsr_rollback_byte(struct Crypto1State* s, uint32_t in, int fb);
-void lfsr_rollback_word(struct Crypto1State* s, uint32_t in, int fb);
+uint8_t lfsr_rollback_bit(struct Crypto1State* s, uint32_t in, int fb);
+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 FOREACH_VALID_NONCE(N, FILTER, FSIZE)\
        uint32_t __n = 0,__M = 0, N = 0;\
index f3bb0d73fef0661a7829ac33791d5d59f1148e0f..a3f64a9f36a4fec38922f59cf76d63869a752529 100644 (file)
 #define SWAPENDIAN(x)\
        (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16)
 
-#if defined(__arm__)
+#if defined(__arm__) && !defined(__linux__) && !defined(_WIN32)                        // bare metal ARM lacks malloc()/free()
 void crypto1_create(struct Crypto1State *s, uint64_t key)
 {
-#else
-struct Crypto1State * crypto1_create(uint64_t key)
-{
-       struct Crypto1State *s = malloc(sizeof(*s));
-#endif
        int i;
 
        for(i = 47;s && i > 0; i -= 2) {
                s->odd  = s->odd  << 1 | BIT(key, (i - 1) ^ 7);
                s->even = s->even << 1 | BIT(key, i ^ 7);
        }
-#if defined(__arm__)   
        return;
-#else
-       return s;
-#endif
 }
-#if defined(__arm__)
 void crypto1_destroy(struct Crypto1State *state)
 {
        state->odd = 0;
        state->even = 0;
 }
 #else
+struct Crypto1State * crypto1_create(uint64_t key)
+{
+       struct Crypto1State *s = malloc(sizeof(*s));
+       int i;
+
+       for(i = 47;s && i > 0; i -= 2) {
+               s->odd  = s->odd  << 1 | BIT(key, (i - 1) ^ 7);
+               s->even = s->even << 1 | BIT(key, i ^ 7);
+       }
+       return s;
+}
 void crypto1_destroy(struct Crypto1State *state)
 {
        free(state);
@@ -65,8 +66,7 @@ void crypto1_get_lfsr(struct Crypto1State *state, uint64_t *lfsr)
 }
 uint8_t crypto1_bit(struct Crypto1State *s, uint8_t in, int is_encrypted)
 {
-       uint32_t feedin;
-       uint32_t tmp;
+       uint32_t feedin, t;
        uint8_t ret = filter(s->odd);
 
        feedin  = ret & !!is_encrypted;
@@ -75,9 +75,7 @@ uint8_t crypto1_bit(struct Crypto1State *s, uint8_t in, int is_encrypted)
        feedin ^= LF_POLY_EVEN & s->even;
        s->even = s->even << 1 | parity(feedin);
 
-       tmp = s->odd;
-       s->odd = s->even;
-       s->even = tmp;
+       t = s->odd, s->odd = s->even, s->even = t;
 
        return ret;
 }
@@ -94,8 +92,8 @@ uint32_t crypto1_word(struct Crypto1State *s, uint32_t in, int is_encrypted)
 {
        uint32_t i, ret = 0;
 
-       for (i = 0; i < 4; ++i, in <<= 8)
-               ret = ret << 8 | crypto1_byte(s, in >> 24, is_encrypted);
+       for (i = 0; i < 32; ++i)
+               ret |= crypto1_bit(s, BEBIT(in, i), is_encrypted) << (i ^ 24);
 
        return ret;
 }
index f4f7eb82c02d496e0039d79e8d18a7a17ee8d59b..73ce032f8f14093d298cf7c1cc5eadf4de06a62d 100755 (executable)
@@ -1,17 +1,20 @@
+VPATH = ../../common/crapto1
 CC = gcc
 LD = gcc
-CFLAGS = -Wall -Winline -O4
+CFLAGS = -I../../common -Wall -O4
 LDFLAGS =
 
-OBJS = crapto1.o crypto1.o
-HEADERS = 
-EXES = mfkey64 mfkey32
-LIBS =
-       
-all: $(OBJS) $(EXES) $(LIBS)
+OBJS = crypto1.o crapto1.o
+EXES = mfkey32 mfkey64
+WINEXES = $(patsubst %, %.exe, $(EXES))
 
-% : %.c $(OBJS)
-       $(LD) $(CFLAGS) -o $@ $< $(OBJS) $(LDFLAGS)
+all: $(OBJS) $(EXES)
+
+%.o : %.c
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+% : %.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $<
 
 clean: 
-       rm -f $(OBJS) $(EXES) $(LIBS) 
+       rm -f $(OBJS) $(EXES) $(WINEXES)
index 44fee4a289bfd6369b4d953684313bcb9024b20c..a018c5dfbbabc3c989357876da14a2def99e1dff 100755 (executable)
@@ -1,5 +1,5 @@
 #include <inttypes.h>
-#include "crapto1.h"
+#include "crapto1/crapto1.h"
 #include <stdio.h>
 #include <stdlib.h>
 
index e7eb9dbee30c42a308f4dc2646df4656fb085a78..4b9b29ee32ea50c7bfebffdca254e7989b5babd5 100755 (executable)
@@ -1,5 +1,5 @@
 #include <inttypes.h>
-#include "crapto1.h"
+#include "crapto1/crapto1.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -34,7 +34,7 @@ int main (int argc, char *argv[]) {
   for (int i = 0; i < encc; i++) {
     enclen[i] = strlen(argv[i + 6]) / 2;
     for (int i2 = 0; i2 < enclen[i]; i2++) {
-      sscanf(argv[i+6] + i2*2,"%2x", (uint8_t*)&enc[i][i2]);
+      sscanf(argv[i+6] + i2*2,"%2x", (unsigned int *)&enc[i][i2]);
     }
   }
   printf("Recovering key for:\n");
index 54abf80e1560dd96e60a877a7b61cbfd343d24e9..11e019de0657b7f4d8c8470412f80f8dc04d489a 100644 (file)
@@ -1,22 +1,21 @@
+VPATH = ../../common/crapto1
 CC = gcc
 LD = gcc
-CFLAGS = -Wall -O4 -c
+CFLAGS = -I../../common -Wall -O4
 LDFLAGS =
 
 OBJS = crypto1.o crapto1.o
 HEADERS = crapto1.h
 EXES = nonce2key
+WINEXES = $(patsubst %, %.exe, $(EXES))
 
 all: $(OBJS) $(EXES)
 
 %.o : %.c
-       $(CC) $(CFLAGS) -o $@ $<
+       $(CC) $(CFLAGS) -c -o $@ $<
 
 % : %.c
-       $(LD) $(LDFLAGS) -o $@ $(OBJS) $<
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $<
 
-crypto1test: libnfc $(OBJS)
-       $(LD) $(LDFLAGS) -o crypto1test crypto1test.c $(OBJS)
 clean: 
-       rm -f $(OBJS) $(EXES)
+       rm -f $(OBJS) $(EXES) $(WINEXES)
index cc22ce77cb5a726980ae6fc45a6f73177e459014..b789dca4c748bf22b97c9ea78deb46ca96a8fb1f 100644 (file)
@@ -1,13 +1,13 @@
-#include "crapto1.h"
+#include "crapto1/crapto1.h"
 #include <inttypes.h>
 #include <stdio.h>
 typedef unsigned char byte_t;
 
 int main(const int argc, const char* argv[]) {
   struct Crypto1State *state;
-  uint32_t pos, uid, nt, nr, rr, nr_diff, ks1, ks2;
+  uint32_t pos, uid, nt, nr, rr, nr_diff;
   byte_t bt, i, ks3x[8], par[8][8];
-  uint64_t key, key_recovered;
+  uint64_t key_recovered;
   uint64_t par_info;
   uint64_t ks_info;
   nr = rr = 0;
Impressum, Datenschutz