]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhfmfhard.c
FIX: several calls to nonce2key/nonce2key_ex has problems with not clearing up memor...
[proxmark3-svn] / client / cmdhfmfhard.c
index fcf3a94979de836321363a4f4f08840fbe563cfa..a6b8bc51e9dc6194b1688dc488664b537bb9b268 100644 (file)
@@ -19,6 +19,7 @@
 #define GOOD_BYTES_REQUIRED    13              // default 28, could be smaller == faster
 #define MIN_NONCES_REQUIRED    4000            // 4000-5000 could be good
 #define NONCES_TRIGGER         2500            // every 2500 nonces check if we can crack the key
+#define CRACKING_THRESHOLD     39.00f          // as 2^39
 
 #define END_OF_LIST_MARKER             0xFFFFFFFF
 
@@ -115,7 +116,6 @@ static statelist_t *candidates = NULL;
 
 bool thread_check_started = false;
 bool thread_check_done = false;
-bool cracking = false;
 bool field_off = false;
 
 pthread_t thread_check;
@@ -765,7 +765,6 @@ static int acquire_nonces(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_
        UsbCommand resp;
 
        field_off = false;
-       cracking = false;
        thread_check_started = false;
        thread_check_done = false;
 
@@ -774,7 +773,7 @@ static int acquire_nonces(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_
        clearCommandBuffer();
 
        do {
-               if (cracking) {
+               if (thread_check_started && !thread_check_done) {
                        sleep(3);
                        continue;
                }
@@ -1276,7 +1275,7 @@ static bool TestIfKeyExists(uint64_t key)
                }
                count += (p_odd - p->states[ODD_STATE]) * (p_even - p->states[EVEN_STATE]);
                if (found_odd && found_even) {
-                       PrintAndLog("Key Found after testing %lld (2^%1.1f) out of %lld (2^%1.1f) keys. ", 
+                       PrintAndLog("\nKey Found after testing %lld (2^%1.1f) out of %lld (2^%1.1f) keys. ", 
                                count,
                                log(count)/log(2), 
                                maximum_states,
@@ -1376,7 +1375,7 @@ static bool generate_candidates(uint16_t sum_a0, uint16_t sum_a8)
                        fprintf(fstats, "%1.1f;", 0.0);
                }
        }
-       if (kcalc < 39.00f) return true;
+       if (kcalc < CRACKING_THRESHOLD) return true;
 
        return false;
 }
@@ -1653,14 +1652,12 @@ static void* check_thread()
        num_good_first_bytes = estimate_second_byte_sum();
 
        clock_t time1 = clock();
-       cracking = generate_candidates(first_byte_Sum, nonces[best_first_bytes[0]].Sum8_guess);
+       bool cracking = generate_candidates(first_byte_Sum, nonces[best_first_bytes[0]].Sum8_guess);
        time1 = clock() - time1;
-       if ( time1 > 0 ) PrintAndLog("Time for generating key candidates list: %1.0f seconds", ((float)time1)/CLOCKS_PER_SEC);
-       if (known_target_key != -1) brute_force();
+       if (time1 > 0) PrintAndLog("Time for generating key candidates list: %1.0f seconds", ((float)time1)/CLOCKS_PER_SEC);
 
-       if (cracking) {
+       if (cracking || known_target_key != -1) {
                field_off = brute_force(); // switch off field with next SendCommand and then finish
-               cracking = false;
        }
 
        thread_check_done = true;
@@ -1701,8 +1698,10 @@ static bool brute_force(void)
                if (maximum_states == 0) return false; // prevent keyspace reduction error (2^-inf)
 
                PrintAndLog("Brute force phase starting.");
-               time_t start, end;
-               time(&start);
+
+//             clock_t time1 = clock();                
+               time_t start1, end1;
+               time(&start1);
                keys_found = 0;
                foundkey = 0;
 
@@ -1749,11 +1748,16 @@ static bool brute_force(void)
                        pthread_join(threads[i], 0);
                }
 
-               time(&end);
-               unsigned long  elapsed_time = difftime(end, start);
+               time(&end1);
+               unsigned long elapsed_time = difftime(end1, start1);
+               // time1 = clock() - time1;
+               // if ( time1 > 0 ) {
+                       // ((float)time1)/CLOCKS_PER_SEC
+               // }
 
                if (keys_found && TestIfKeyExists(foundkey)) {
-                       PrintAndLog("Success! Tested %"PRIu32" states, found %u keys after %u seconds", total_states_tested, keys_found, elapsed_time);
+                       printf("ICE: %u | %u | %u \n", start1, end1, elapsed_time);
+                       PrintAndLog("Success! Found %u keys after %u seconds", keys_found, elapsed_time);
                        PrintAndLog("\nFound key: %012"PRIx64"\n", foundkey);
                        ret = true;
                } else {
@@ -1808,13 +1812,23 @@ int mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBloc
                fstats = NULL;
        } else {
                init_nonce_memory();
-               if (nonce_file_read) {          // use pre-acquired data from file nonces.bin
+               if (nonce_file_read) { // use pre-acquired data from file nonces.bin
                        if (read_nonce_file() != 0) {
                                return 3;
                        }
                        Check_for_FilterFlipProperties();
                        num_good_first_bytes = MIN(estimate_second_byte_sum(), GOOD_BYTES_REQUIRED);
-               } else {                                        // acquire nonces.
+                       PrintAndLog("Number of first bytes with confidence > %2.1f%%: %d", CONFIDENCE_THRESHOLD*100.0, num_good_first_bytes);
+
+                       clock_t time1 = clock();
+                       bool cracking = generate_candidates(first_byte_Sum, nonces[best_first_bytes[0]].Sum8_guess);
+                       time1 = clock() - time1;
+                       if (time1 > 0)
+                               PrintAndLog("Time for generating key candidates list: %1.0f seconds", ((float)time1)/CLOCKS_PER_SEC);
+
+                       if (cracking)
+                               brute_force();
+               } else { // acquire nonces.
                        uint16_t is_OK = acquire_nonces(blockNo, keyType, key, trgBlockNo, trgKeyType, nonce_file_write, slow);
                        if (is_OK != 0) {
                                return is_OK;
@@ -1837,22 +1851,10 @@ int mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBloc
                        // best_first_bytes[8],
                        // best_first_bytes[9]  );
 
-               //PrintAndLog("Number of first bytes with confidence > %2.1f%%: %d", CONFIDENCE_THRESHOLD*100.0, num_good_first_bytes);
-
-               //clock_t time1 = clock();
-               //generate_candidates(first_byte_Sum, nonces[best_first_bytes[0]].Sum8_guess);
-               //time1 = clock() - time1;
-               //if ( time1 > 0 )
-                       //PrintAndLog("Time for generating key candidates list: %1.0f seconds", ((float)time1)/CLOCKS_PER_SEC);
-
-               //brute_force();
-
                free_nonces_memory();
                free_statelist_cache();
                free_candidates_memory(candidates);
                candidates = NULL;
        }
        return 0;
-}
-
-
+}
\ No newline at end of file
Impressum, Datenschutz