]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/nonce2key/nonce2key.c
fix: crapto3.3 sometimes crashing with hf mf mifare on Fudan clones (no par, all...
[proxmark3-svn] / client / nonce2key / nonce2key.c
index 2c47bc50213dcf767f9d12d342df1c0945082e62..6573b39da72a100a0c22c3fa9191c628ab59cf95 100644 (file)
 // MIFARE Darkside hack
 //-----------------------------------------------------------------------------
 
-#define __STDC_FORMAT_MACROS
-#include <inttypes.h>
-
 #include "nonce2key.h"
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include "mifarehost.h"
 #include "ui.h"
+#include "util.h"
+#include "crapto1/crapto1.h"
 
 int compar_state(const void * a, const void * b) {
        // didn't work: (the result is truncated to 32 bits)
@@ -30,7 +33,7 @@ int compar_state(const void * a, const void * b) {
 int nonce2key(uint32_t uid, uint32_t nt, uint32_t nr, uint64_t par_info, uint64_t ks_info, uint64_t * key) {
   struct Crypto1State *state;
   uint32_t i, pos, rr, nr_diff, key_count;//, ks1, ks2;
-  byte_t bt, ks3x[8], par[8][8];
+  uint8_t bt, ks3x[8], par[8][8];
   uint64_t key_recovered;
   int64_t *state_s;
   static uint32_t last_uid;
@@ -70,17 +73,17 @@ 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, par_info==0);
+       state = lfsr_common_prefix(nr, rr, ks3x, par, (par_info == 0));
        state_s = (int64_t*)state;
        
        //char filename[50] ;
     //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);
@@ -96,9 +99,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;
@@ -113,12 +115,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;
        }
@@ -136,7 +137,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;
                }
@@ -160,8 +161,8 @@ bool mfkey32(nonces_t data, uint64_t *outputkey) {
        uint32_t ar0_enc = data.ar;  // first encrypted reader response
        uint32_t nr1_enc = data.nr2; // second encrypted reader challenge
        uint32_t ar1_enc = data.ar2; // second encrypted reader response
-       clock_t t1 = clock();
-       bool isSuccess = FALSE;
+       uint64_t t1 = msclock();
+       bool isSuccess = false;
        uint8_t counter=0;
 
        s = lfsr_recovery32(ar0_enc ^ prng_successor(nt, 64), 0);
@@ -181,8 +182,8 @@ bool mfkey32(nonces_t data, uint64_t *outputkey) {
                }
        }
        isSuccess = (counter == 1);
-       t1 = clock() - t1;
-       //if ( t1 > 0 ) PrintAndLog("Time in mfkey32: %.0f ticks \nFound %d possible keys", (float)t1, counter);
+       t1 = msclock() - t1;
+       //if ( t1 > 0 ) PrintAndLog("Time in mfkey32: %.1f seconds \nFound %d possible keys", (float)t1/1000.0, counter);
        *outputkey = ( isSuccess ) ? outkey : 0;
        crypto1_destroy(s);
        /* //un-comment to save all keys to a stats.txt file 
@@ -208,11 +209,11 @@ bool tryMfk32_moebius(nonces_t data, uint64_t *outputkey) {
        uint32_t nt1     = data.nonce2; // second tag challenge (nonce)
        uint32_t nr1_enc = data.nr2; // second encrypted reader challenge
        uint32_t ar1_enc = data.ar2; // second encrypted reader response        
-       bool isSuccess = FALSE;
+       bool isSuccess = false;
        int counter = 0;
        
        //PrintAndLog("Enter mfkey32_moebius");
-       clock_t t1 = clock();
+       uint64_t t1 = msclock();
 
        s = lfsr_recovery32(ar0_enc ^ prng_successor(nt0, 64), 0);
   
@@ -233,8 +234,8 @@ bool tryMfk32_moebius(nonces_t data, uint64_t *outputkey) {
                }
        }
        isSuccess       = (counter == 1);
-       t1 = clock() - t1;
-       //if ( t1 > 0 ) PrintAndLog("Time in mfkey32_moebius: %.0f ticks \nFound %d possible keys", (float)t1,counter);
+       t1 = msclock() - t1;
+       //if ( t1 > 0 ) PrintAndLog("Time in mfkey32_moebius: %.1f seconds \nFound %d possible keys", (float)t1/1000.0, counter);
        *outputkey = ( isSuccess ) ? outkey : 0;
        crypto1_destroy(s);
        /* // un-comment to output all keys to stats.txt
@@ -265,7 +266,7 @@ int tryMfk64(uint32_t uid, uint32_t nt, uint32_t nr_enc, uint32_t ar_enc, uint32
        struct Crypto1State *revstate;
        
        PrintAndLog("Enter mfkey64");
-       clock_t t1 = clock();
+       uint64_t t1 = msclock();
        
        // Extract the keystream from the messages
        ks2 = ar_enc ^ prng_successor(nt, 64);
@@ -280,8 +281,8 @@ int tryMfk64(uint32_t uid, uint32_t nt, uint32_t nr_enc, uint32_t ar_enc, uint32
        crypto1_destroy(revstate);
        *outputkey = key;
        
-       t1 = clock() - t1;
-       if ( t1 > 0 ) PrintAndLog("Time in mfkey64: %.0f ticks \n", (float)t1);
+       t1 = msclock() - t1;
+       if ( t1 > 0 ) PrintAndLog("Time in mfkey64: %.1f seconds \n", (float)t1/1000.0);
        return 0;
 }
 
Impressum, Datenschutz