bool keysig_search(int method, uint8_t *enc_buf, size_t buf_sz, keysig_notify_fn_t notify, void *user, int nr_threads) { /* init producer */ producer_init(); /* init search */ keysig_search_init(); pthread_mutex_init(&g_keysig_search.mutex, NULL); g_keysig_search.enc_buf = enc_buf; g_keysig_search.enc_buf_sz = buf_sz; g_keysig_search.found_keysig = false; /* get methods */ routine_t worker_fn = NULL; routine_t producer_fn = NULL; if(method == KEYSIG_SEARCH_ASCII_HEX) { worker_fn = hex_worker; producer_fn = hex_producer; } /* create workers */ pthread_t *worker = malloc(sizeof(pthread_t) * nr_threads); pthread_t producer; for(int i = 0; i < nr_threads; i++) pthread_create(&worker[i], NULL, worker_fn, NULL); pthread_create(&producer, NULL, producer_fn, NULL); /* wait for all threads */ pthread_join(producer, NULL); for(int i = 0; i < nr_threads; i++) pthread_join(worker[i], NULL); free(worker); if(g_keysig_search.found_keysig) notify(user, g_keysig_search.key, g_keysig_search.sig); return g_keysig_search.found_keysig; }
bool keysig_search_ascii_stupid(uint8_t *cipher, keysig_notify_fn_t notify, void *user) { keysig_search_init(); memcpy(g_cipher, cipher, 8); g_notify = notify; g_user = user; #if 1 return search_stupid(4, 4) || search_stupid(3, 5) || search_stupid(5, 3) || search_stupid(2, 6) || search_stupid(6, 2) || search_stupid(1, 7) || search_stupid(7, 1) || search_stupid(0, 8) || search_stupid(8, 0); #else #define do(i) for(int a##i = 0; a##i < sizeof(hex_digits); a##i++) { g_key[i] = hex_digits[a##i]; #define od() } do(0)do(1)do(2)do(3)do(4)do(5)do(6)do(7) if(check_stupid()) return true; od()od()od()od()od()od()od()od() #undef do #undef od return false; #endif }
bool keysig_search_ascii_brute(uint8_t *cipher, keysig_notify_fn_t notify, void *user) { keysig_search_init(); return false; }