diff --git a/tools/mfc/card_only/staticnested_0nt.c b/tools/mfc/card_only/staticnested_0nt.c index be910d219..a0e121cf6 100644 --- a/tools/mfc/card_only/staticnested_0nt.c +++ b/tools/mfc/card_only/staticnested_0nt.c @@ -91,7 +91,7 @@ static uint8_t valid_nonce(uint32_t Nt, uint32_t ks1, uint8_t nt_par_enc) { (oddparity8((Nt >> 8) & 0xFF) == (((nt_par_enc >> 1) & 1) ^ BIT(ks1, 0))); } -static bool search_match(NtData *pND, NtData *pND0, uint64_t key) { +static bool search_match(const NtData *pND, const NtData *pND0, uint64_t key) { bool ret = 0; struct Crypto1State *s; s = crypto1_create(0); @@ -170,9 +170,11 @@ static void *generate_and_intersect_keys(void *threadarg) { fprintf(stderr, "\nMalloc error in generate_and_intersect_keys!\n"); pthread_exit(NULL); } + if (revstate_start == NULL) { revstate_start = revstate; } + uint32_t keyCount0 = 0; while ((revstate->odd != 0x0) || (revstate->even != 0x0)) { lfsr_rollback_word(revstate, nt_probe, 0); @@ -185,7 +187,7 @@ static void *generate_and_intersect_keys(void *threadarg) { (*data->keyCount[nonce_index])++; pthread_mutex_unlock(data->keyCount_mutex[nonce_index]); if (*data->keyCount[nonce_index] == KEY_SPACE_SIZE_STEP2) { - fprintf(stderr, "No space left on result_keys[%d], abort!\n", nonce_index); + fprintf(stderr, "No space left on result_keys[%u], abort!\n", nonce_index); i = endPos; break; } @@ -193,12 +195,12 @@ static void *generate_and_intersect_keys(void *threadarg) { } revstate++; } + free(revstate_start); revstate_start = NULL; pthread_mutex_lock(data->keyCount_mutex[0]); (*data->keyCount[0]) += keyCount0; - keyCount0 = 0; pthread_mutex_unlock(data->keyCount_mutex[0]); } @@ -236,8 +238,10 @@ static uint64_t **unpredictable_nested(NtpKs1List *pNKL, uint32_t keyCounts[]) { for (int i = 0; i < NUM_THREADS; i++) { if (thread_status[i]) activeThreads++; } + // Spawn new threads if there are available slots for (uint32_t t = 0; activeThreads < NUM_THREADS && startPos < pNKL->NtDataList[0].sizeNK && t < NUM_THREADS; t++) { + if (!thread_status[t]) { uint32_t endPos = startPos + chunk_size; if (endPos > pNKL->NtDataList[0].sizeNK) { @@ -249,6 +253,7 @@ static uint64_t **unpredictable_nested(NtpKs1List *pNKL, uint32_t keyCounts[]) { thread_data[t].endPos = endPos; thread_data[t].thread_id = t; thread_data[t].num_nonces = pNKL->nr_nonces; + for (uint32_t i = 0; i < MAX_NR_NONCES; i++) { thread_data[t].result_keys[i] = result_keys[i]; thread_data[t].keyCount[i] = &keyCounts[i]; @@ -273,9 +278,9 @@ static uint64_t **unpredictable_nested(NtpKs1List *pNKL, uint32_t keyCounts[]) { pthread_mutex_unlock(&status_mutex); printf("\33[2K\rProgress: %02.1f%%", (double)(startPos + 1) * 100 / pNKL->NtDataList[0].sizeNK); - printf(" keys[%d]:%9i", 0, keyCounts[0]); + printf(" keys[%d]:%9u", 0, keyCounts[0]); for (uint32_t nonce_index = 1; nonce_index < pNKL->nr_nonces; nonce_index++) { - printf(" keys[%d]:%5i", nonce_index, keyCounts[nonce_index]); + printf(" keys[%u]:%5u", nonce_index, keyCounts[nonce_index]); } fflush(stdout); } @@ -287,6 +292,7 @@ static uint64_t **unpredictable_nested(NtpKs1List *pNKL, uint32_t keyCounts[]) { for (int i = 0; i < NUM_THREADS; i++) { if (thread_status[i]) activeThreads++; } + while (activeThreads) { pthread_cond_wait(&status_cond, &status_mutex); activeThreads = 0; @@ -317,10 +323,10 @@ static void analyze_keys(uint64_t **keys, uint32_t keyCounts[MAX_NR_NONCES], uin printf("Analyzing keys...\n"); for (uint32_t i = 0; i < nr_nonces; i++) { if (i == 0) { - printf("nT(%i): %i key candidates\n", i, keyCounts[i]); + printf("nT(%u): %u key candidates\n", i, keyCounts[i]); continue; } else { - printf("nT(%i): %i key candidates matching nT(0)\n", i, keyCounts[i]); + printf("nT(%u): %u key candidates matching nT(0)\n", i, keyCounts[i]); } for (uint32_t j = 0; j < keyCounts[i]; j++) { uint64_t key = keys[i][j]; @@ -343,12 +349,15 @@ static void analyze_keys(uint64_t **keys, uint32_t keyCounts[MAX_NR_NONCES], uin } for (uint32_t i = 0; i < combined_length; i++) { + if (combined_counts[i] > 1) { printf("Key %012" PRIx64 " found in %d arrays: 0", combined_keys[i], combined_counts[i] + 1); + for (uint32_t ii = 1; ii < nr_nonces; ii++) { for (uint32_t j = 0; j < keyCounts[ii]; j++) { + if (combined_keys[i] == keys[ii][j]) { - printf(", %2i", ii); + printf(", %2u", ii); } } } @@ -417,10 +426,18 @@ int main(int argc, char *const argv[]) { } nttest = prng_successor(nttest, 1); } - printf("uid=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i %i/%i: %d\n", authuid, nt_enc, - nt_par_err_arr[0], nt_par_err_arr[1], nt_par_err_arr[2], nt_par_err_arr[3], - (nt_par_enc >> 3) & 1, (nt_par_enc >> 2) & 1, (nt_par_enc >> 1) & 1, nt_par_enc & 1, - NKL.nr_nonces + 1, (argc - 1) / 3, j); + printf("uid=%08x nt_enc=%08x nt_par_err=%i%i%i%i nt_par_enc=%i%i%i%i %u/%i: %u\n" + , authuid + , nt_enc + , nt_par_err_arr[0], nt_par_err_arr[1], nt_par_err_arr[2], nt_par_err_arr[3] + , (nt_par_enc >> 3) & 1 + , (nt_par_enc >> 2) & 1 + , (nt_par_enc >> 1) & 1 + , nt_par_enc & 1 + , NKL.nr_nonces + 1 + , (argc - 1) / 3 + , j + ); pNtData->authuid = authuid; pNtData->sizeNK = j;