X-Git-Url: https://www.flypig.org.uk/git/?a=blobdiff_plain;f=src%2Fhashcat.c;h=ab38fe2b2de3a6f3b79b908dd6407ec6a73107eb;hb=217f9e600443c575755244788eaab5b0db758b88;hp=42c41c6cd26a256ec7de1bc357a6fc4b5c129a38;hpb=7ba1322d7f0faf181de9b9b600a21d6fa8fb4bf9;p=hashcat.git diff --git a/src/hashcat.c b/src/hashcat.c index 42c41c6..ab38fe2 100644 --- a/src/hashcat.c +++ b/src/hashcat.c @@ -1,4 +1,4 @@ -/** + /** * Authors.....: Jens Steube * Gabriele Gristina * magnum @@ -150,6 +150,8 @@ double TARGET_MS_PROFILE[4] = { 2, 12, 96, 480 }; #define NUM_DEFAULT_BENCHMARK_ALGORITHMS 143 +#define NVIDIA_100PERCENTCPU_WORKAROUND 100 + #define global_free(attr) \ { \ myfree ((void *) data.attr); \ @@ -164,6 +166,12 @@ double TARGET_MS_PROFILE[4] = { 2, 12, 96, 480 }; attr = NULL; \ } +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +#define HC_API_CALL __stdcall +#else +#define HC_API_CALL +#endif + static uint default_benchmark_algorithms[NUM_DEFAULT_BENCHMARK_ALGORITHMS] = { 900, @@ -570,6 +578,7 @@ const char *USAGE_BIG[] = " 22 | Juniper Netscreen/SSG (ScreenOS) | Operating-Systems", " 501 | Juniper IVE | Operating-Systems", " 5800 | Android PIN | Operating-Systems", + " 13800 | Windows 8+ phone PIN/Password | Operating-Systems", " 8100 | Citrix Netscaler | Operating-Systems", " 8500 | RACF | Operating-Systems", " 7200 | GRUB 2 | Operating-Systems", @@ -1531,6 +1540,12 @@ void status_display () } #ifdef HAVE_HWMON + + if (data.devices_status == STATUS_EXHAUSTED) return; + if (data.devices_status == STATUS_CRACKED) return; + if (data.devices_status == STATUS_ABORTED) return; + if (data.devices_status == STATUS_QUIT) return; + if (data.gpu_temp_disable == 0) { hc_thread_mutex_lock (mux_adl); @@ -1614,6 +1629,7 @@ void status_display () hc_thread_mutex_unlock (mux_adl); } + #endif // HAVE_HWMON } @@ -2389,42 +2405,6 @@ static void save_hash () unlink (old_hashfile); } -static float find_kernel_power_div (const u64 total_left, const uint kernel_power_all) -{ - // function called only in case kernel_power_all > words_left - - float kernel_power_div = (float) (total_left) / kernel_power_all; - - kernel_power_div += kernel_power_div / 100; - - u32 kernel_power_new = (u32) (kernel_power_all * kernel_power_div); - - while (kernel_power_new < total_left) - { - kernel_power_div += kernel_power_div / 100; - - kernel_power_new = (u32) (kernel_power_all * kernel_power_div); - } - - if (data.quiet == 0) - { - clear_prompt (); - - //log_info (""); - - log_info ("INFO: approaching final keyspace, workload adjusted"); - log_info (""); - - fprintf (stdout, "%s", PROMPT); - - fflush (stdout); - } - - //if ((kernel_power_all * kernel_power_div) < 8) return 1; - - return kernel_power_div; -} - static void run_kernel (const uint kern_run, hc_device_param_t *device_param, const uint num, const uint event_update) { uint num_elements = num; @@ -3422,7 +3402,10 @@ static void run_cracker (hc_device_param_t *device_param, const uint pws_cnt) * result */ - check_cracked (device_param, salt_pos); + if (data.benchmark == 0) + { + check_cracked (device_param, salt_pos); + } /** * progress @@ -3816,7 +3799,7 @@ static void *thread_monitor (void *p) uint status_left = data.status_timer; #ifdef HAVE_HWMON - uint hwmon_check = 0; + uint hwmon_check = 0; int slowdown_warnings = 0; @@ -3884,7 +3867,7 @@ static void *thread_monitor (void *p) #ifdef HAVE_HWMON - if (1) + if (hwmon_check == 1) { hc_thread_mutex_lock (mux_adl); @@ -3894,35 +3877,47 @@ static void *thread_monitor (void *p) if (device_param->skipped) continue; - if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) continue; + if (device_param->device_vendor_id == VENDOR_ID_NV) + { + if (data.hm_nvapi) + { + NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 perfPolicies_info = { 0 }; + NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 perfPolicies_status = { 0 }; - const int temperature = hm_get_temperature_with_device_id (device_id); + perfPolicies_info.version = MAKE_NVAPI_VERSION (NV_GPU_PERF_POLICIES_INFO_PARAMS_V1, 1); + perfPolicies_status.version = MAKE_NVAPI_VERSION (NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1, 1); - const int threshold = data.hm_device[device_id].gpu_temp_threshold_slowdown; + hm_NvAPI_GPU_GetPerfPoliciesInfo (data.hm_nvapi, data.hm_device[device_id].nvapi, &perfPolicies_info); - if (temperature >= threshold) - { - if (slowdown_warnings < 3) - { - if (data.quiet == 0) clear_prompt (); + perfPolicies_status.info_value = perfPolicies_info.info_value; - log_info ("WARNING: Drivers temperature threshold (%dc) hit on GPU #%d, expect performance to drop...", threshold, device_id + 1); + hm_NvAPI_GPU_GetPerfPoliciesStatus (data.hm_nvapi, data.hm_device[device_id].nvapi, &perfPolicies_status); - if (slowdown_warnings == 2) + if (perfPolicies_status.throttle & 2) { - log_info (""); - } + if (slowdown_warnings < 3) + { + if (data.quiet == 0) clear_prompt (); + + log_info ("WARNING: Drivers temperature threshold hit on GPU #%d, expect performance to drop...", device_id + 1); + + if (slowdown_warnings == 2) + { + log_info (""); + } - if (data.quiet == 0) fprintf (stdout, "%s", PROMPT); - if (data.quiet == 0) fflush (stdout); + if (data.quiet == 0) fprintf (stdout, "%s", PROMPT); + if (data.quiet == 0) fflush (stdout); - slowdown_warnings++; + slowdown_warnings++; + } + } + else + { + slowdown_warnings = 0; + } } } - else - { - slowdown_warnings = 0; - } } hc_thread_mutex_unlock (mux_adl); @@ -4005,7 +4000,7 @@ static void *thread_monitor (void *p) { if (device_param->device_vendor_id == VENDOR_ID_AMD) { - hm_set_fanspeed_with_device_id_amd (device_id, fan_speed_new, 1); + hm_set_fanspeed_with_device_id_adl (device_id, fan_speed_new, 1); } else if (device_param->device_vendor_id == VENDOR_ID_NV) { @@ -4431,14 +4426,43 @@ static void pw_add (hc_device_param_t *device_param, const u8 *pw_buf, const int //} } -static u32 get_power (const u32 kernel_power) +static void set_kernel_power_final (const u64 kernel_power_final) +{ + if (data.quiet == 0) + { + clear_prompt (); + + //log_info (""); + + log_info ("INFO: approaching final keyspace, workload adjusted"); + log_info (""); + + fprintf (stdout, "%s", PROMPT); + + fflush (stdout); + } + + data.kernel_power_final = kernel_power_final; +} + +static u32 get_power (hc_device_param_t *device_param) { - if (data.kernel_power_div) + const u64 kernel_power_final = data.kernel_power_final; + + if (kernel_power_final) { - return (float) kernel_power * data.kernel_power_div; + const double device_factor = (double) device_param->hardware_power / data.hardware_power_all; + + const u64 words_left_device = CEIL ((double) kernel_power_final * device_factor); + + // work should be at least the hardware power available without any accelerator + + const u64 work = MAX (words_left_device, device_param->hardware_power); + + return work; } - return kernel_power; + return device_param->kernel_power; } static uint get_work (hc_device_param_t *device_param, const u64 max) @@ -4450,17 +4474,19 @@ static uint get_work (hc_device_param_t *device_param, const u64 max) device_param->words_off = words_cur; + const u64 kernel_power_all = data.kernel_power_all; + const u64 words_left = words_base - words_cur; - if (data.kernel_power_all > words_left) + if (words_left < kernel_power_all) { - if (data.kernel_power_div == 0) + if (data.kernel_power_final == 0) { - data.kernel_power_div = find_kernel_power_div (words_left, data.kernel_power_all); + set_kernel_power_final (words_left); } } - const u32 kernel_power = get_power (device_param->kernel_power); + const u32 kernel_power = get_power (device_param); uint work = MIN (words_left, kernel_power); @@ -4507,7 +4533,7 @@ static void *thread_calc_stdin (void *p) uint words_cur = 0; - while (words_cur < get_power (device_param->kernel_power)) + while (words_cur < device_param->kernel_power) { char *line_buf = fgets (buf, HCBUFSIZ - 1, stdin); @@ -4541,6 +4567,8 @@ static void *thread_calc_stdin (void *p) continue; } + // hmm that's always the case, or? + if (attack_kern == ATTACK_KERN_STRAIGHT) { if ((line_len < data.pw_min) || (line_len > data.pw_max)) @@ -4557,25 +4585,6 @@ static void *thread_calc_stdin (void *p) continue; } } - else if (attack_kern == ATTACK_KERN_COMBI) - { - // do not check if minimum restriction is satisfied (line_len >= data.pw_min) here - // since we still need to combine the plains - - if (line_len > data.pw_max) - { - hc_thread_mutex_lock (mux_counter); - - for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) - { - data.words_progress_rejected[salt_pos] += data.combs_cnt; - } - - hc_thread_mutex_unlock (mux_counter); - - continue; - } - } pw_add (device_param, (u8 *) line_buf, line_len); @@ -5360,7 +5369,7 @@ static uint hlfmt_detect (FILE *fp, uint max_check) // wrapper around mymalloc for ADL #if defined(HAVE_HWMON) -void *__stdcall ADL_Main_Memory_Alloc (const int iSize) +void *HC_API_CALL ADL_Main_Memory_Alloc (const int iSize) { return mymalloc (iSize); } @@ -5382,8 +5391,6 @@ static uint generate_bitmaps (const uint digests_cnt, const uint dgst_size, cons for (uint i = 0; i < digests_cnt; i++) { - if (data.digests_shown[i] == 1) continue; // can happen with potfile - uint *digest_ptr = (uint *) digests_buf_ptr; digests_buf_ptr += dgst_size; @@ -5418,7 +5425,20 @@ static uint generate_bitmaps (const uint digests_cnt, const uint dgst_size, cons * main */ -#ifdef _WIN +#ifdef LINUX +int (*clock_gettime_orig) (clockid_t clk_id, struct timespec *tp); + +int clock_gettime (clockid_t clk_id, struct timespec *tp) +{ + int r = clock_gettime_orig (clk_id, tp); + + usleep (NVIDIA_100PERCENTCPU_WORKAROUND); + + return r; +} +#endif + +#ifdef WIN void SetConsoleWindowSize (const int x) { HANDLE h = GetStdHandle (STD_OUTPUT_HANDLE); @@ -5435,8 +5455,8 @@ void SetConsoleWindowSize (const int x) COORD co; - co.X = sr->Right + 1; - co.Y = sr->Bottom + 1; + co.X = sr->Right + 1; + co.Y = 9999; if (!SetConsoleScreenBufferSize (h, co)) return; @@ -5446,7 +5466,11 @@ void SetConsoleWindowSize (const int x) int main (int argc, char **argv) { - #ifdef _WIN + #ifdef LINUX + clock_gettime_orig = dlsym (RTLD_NEXT, "clock_gettime"); + #endif + + #ifdef WIN SetConsoleWindowSize (132); #endif @@ -6087,6 +6111,9 @@ int main (int argc, char **argv) { log_info ("%s (%s) starting in benchmark-mode...", PROGNAME, VERSION_TAG); log_info (""); + log_info ("Note: Reported benchmark cracking speed = real cracking speed"); + log_info ("To verify, run hashcat like this: only_one_hash.txt -a 3 -w 3 ?b?b?b?b?b?b?b"); + log_info (""); } else { @@ -6123,7 +6150,7 @@ int main (int argc, char **argv) return (-1); } - if (hash_mode_chgd && hash_mode > 13799) // just added to remove compiler warnings for hash_mode_chgd + if (hash_mode_chgd && hash_mode > 13800) // just added to remove compiler warnings for hash_mode_chgd { log_error ("ERROR: Invalid hash-type specified"); @@ -6945,7 +6972,10 @@ int main (int argc, char **argv) gpu_temp_disable = 1; #ifdef HAVE_HWMON - powertune_enable = 1; + if (powertune_enable == 1) + { + gpu_temp_disable = 0; + } #endif data.status_timer = status_timer; @@ -10796,6 +10826,26 @@ int main (int argc, char **argv) dgst_pos3 = 3; break; + case 13800: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_INSIDE_KERNEL; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_WIN8PHONE; + dgst_size = DGST_SIZE_4_8; + parse_func = win8phone_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + default: usage_mini_print (PROGNAME); return (-1); } @@ -10922,6 +10972,7 @@ int main (int argc, char **argv) case 13761: esalt_size = sizeof (tc_t); break; case 13762: esalt_size = sizeof (tc_t); break; case 13763: esalt_size = sizeof (tc_t); break; + case 13800: esalt_size = sizeof (win8phone_t); break; } data.esalt_size = esalt_size; @@ -11255,7 +11306,7 @@ int main (int argc, char **argv) break; case 7400: if (pw_max > 16) pw_max = 16; break; - case 7500: if (pw_max > 8) pw_max = 8; + case 7700: if (pw_max > 8) pw_max = 8; break; case 7900: if (pw_max > 48) pw_max = 48; break; @@ -13318,8 +13369,9 @@ int main (int argc, char **argv) * OpenCL devices: simply push all devices from all platforms into the same device array */ - int need_adl = 0; - int need_nvml = 0; + int need_adl = 0; + int need_nvapi = 0; + int need_nvml = 0; hc_device_param_t *devices_param = (hc_device_param_t *) mycalloc (DEVICES_MAX, sizeof (hc_device_param_t)); @@ -13577,7 +13629,7 @@ int main (int argc, char **argv) if (device_endian_little == CL_FALSE) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: not little endian device", device_id + 1); + log_info ("Device #%u: WARNING: not little endian device", device_id + 1); device_param->skipped = 1; } @@ -13590,7 +13642,7 @@ int main (int argc, char **argv) if (device_available == CL_FALSE) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: device not available", device_id + 1); + log_info ("Device #%u: WARNING: device not available", device_id + 1); device_param->skipped = 1; } @@ -13603,7 +13655,7 @@ int main (int argc, char **argv) if (device_compiler_available == CL_FALSE) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: device no compiler available", device_id + 1); + log_info ("Device #%u: WARNING: device no compiler available", device_id + 1); device_param->skipped = 1; } @@ -13616,7 +13668,7 @@ int main (int argc, char **argv) if ((device_execution_capabilities & CL_EXEC_KERNEL) == 0) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: device does not support executing kernels", device_id + 1); + log_info ("Device #%u: WARNING: device does not support executing kernels", device_id + 1); device_param->skipped = 1; } @@ -13633,14 +13685,14 @@ int main (int argc, char **argv) if (strstr (device_extensions, "base_atomics") == 0) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: device does not support base atomics", device_id + 1); + log_info ("Device #%u: WARNING: device does not support base atomics", device_id + 1); device_param->skipped = 1; } if (strstr (device_extensions, "byte_addressable_store") == 0) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: device does not support byte addressable store", device_id + 1); + log_info ("Device #%u: WARNING: device does not support byte addressable store", device_id + 1); device_param->skipped = 1; } @@ -13655,7 +13707,7 @@ int main (int argc, char **argv) if (device_local_mem_size < 32768) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: device local mem size is too small", device_id + 1); + log_info ("Device #%u: WARNING: device local mem size is too small", device_id + 1); device_param->skipped = 1; } @@ -13670,9 +13722,16 @@ int main (int argc, char **argv) { if (device_param->device_vendor_id == VENDOR_ID_AMD_USE_INTEL) { - if (data.quiet == 0) log_info ("Device #%u: WARNING: not native intel opencl platform", device_id + 1); + if (data.force == 0) + { + if (algorithm_pos == 0) + { + log_info ("Device #%u: WARNING: not native intel opencl runtime, expect massive speed loss", device_id + 1); + log_info (" You can use --force to override this but do not post error reports if you do so"); + } - device_param->skipped = 1; + device_param->skipped = 1; + } } } @@ -13721,6 +13780,10 @@ int main (int argc, char **argv) if ((device_param->platform_vendor_id == VENDOR_ID_NV) && (device_param->device_vendor_id == VENDOR_ID_NV)) { need_nvml = 1; + + #ifdef _WIN + need_nvapi = 1; + #endif } } @@ -13995,68 +14058,93 @@ int main (int argc, char **argv) */ #ifdef HAVE_HWMON - hm_attrs_t hm_adapters_nv[DEVICES_MAX] = { { { 0 }, 0, 0, 0, 0, 0 } }; - hm_attrs_t hm_adapters_amd[DEVICES_MAX] = { { { 0 }, 0, 0, 0, 0, 0 } }; + hm_attrs_t hm_adapters_adl[DEVICES_MAX] = { { 0 } }; + hm_attrs_t hm_adapters_nvapi[DEVICES_MAX] = { { 0 } }; + hm_attrs_t hm_adapters_nvml[DEVICES_MAX] = { { 0 } }; if (gpu_temp_disable == 0) { - NVML_PTR *nvml = (NVML_PTR *) mymalloc (sizeof (NVML_PTR)); - ADL_PTR *adl = (ADL_PTR *) mymalloc (sizeof (ADL_PTR)); + ADL_PTR *adl = (ADL_PTR *) mymalloc (sizeof (ADL_PTR)); + NVAPI_PTR *nvapi = (NVAPI_PTR *) mymalloc (sizeof (NVAPI_PTR)); + NVML_PTR *nvml = (NVML_PTR *) mymalloc (sizeof (NVML_PTR)); - data.hm_amd = NULL; - data.hm_nv = NULL; + data.hm_adl = NULL; + data.hm_nvapi = NULL; + data.hm_nvml = NULL; if ((need_nvml == 1) && (nvml_init (nvml) == 0)) { - data.hm_nv = nvml; + data.hm_nvml = nvml; } - if (data.hm_nv) + if (data.hm_nvml) { - if (hm_NVML_nvmlInit (data.hm_nv) == NVML_SUCCESS) + if (hm_NVML_nvmlInit (data.hm_nvml) == NVML_SUCCESS) { - HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX] = { 0 }; + HM_ADAPTER_NVML nvmlGPUHandle[DEVICES_MAX] = { 0 }; - int tmp_in = hm_get_adapter_index_nv (nvGPUHandle); + int tmp_in = hm_get_adapter_index_nvml (nvmlGPUHandle); int tmp_out = 0; for (int i = 0; i < tmp_in; i++) { - hm_adapters_nv[tmp_out++].adapter_index.nv = nvGPUHandle[i]; + hm_adapters_nvml[tmp_out++].nvml = nvmlGPUHandle[i]; } for (int i = 0; i < tmp_out; i++) { unsigned int speed; - if (hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 0, hm_adapters_nv[i].adapter_index.nv, &speed) == NVML_SUCCESS) hm_adapters_nv[i].fan_get_supported = 1; + if (hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nvml, 0, hm_adapters_nvml[i].nvml, &speed) == NVML_SUCCESS) hm_adapters_nvml[i].fan_get_supported = 1; - hm_NVML_nvmlDeviceSetComputeMode (data.hm_nv, 1, hm_adapters_nv[i].adapter_index.nv, NVML_COMPUTEMODE_EXCLUSIVE_PROCESS); + hm_NVML_nvmlDeviceSetComputeMode (data.hm_nvml, 1, hm_adapters_nvml[i].nvml, NVML_COMPUTEMODE_EXCLUSIVE_PROCESS); - hm_NVML_nvmlDeviceSetGpuOperationMode (data.hm_nv, 1, hm_adapters_nv[i].adapter_index.nv, NVML_GOM_ALL_ON); + hm_NVML_nvmlDeviceSetGpuOperationMode (data.hm_nvml, 1, hm_adapters_nvml[i].nvml, NVML_GOM_ALL_ON); + } + } + } + + if ((need_nvapi == 1) && (nvapi_init (nvapi) == 0)) + { + data.hm_nvapi = nvapi; + } + + if (data.hm_nvapi) + { + if (hm_NvAPI_Initialize (data.hm_nvapi) == NVAPI_OK) + { + HM_ADAPTER_NVAPI nvGPUHandle[DEVICES_MAX] = { 0 }; + + int tmp_in = hm_get_adapter_index_nvapi (nvGPUHandle); + + int tmp_out = 0; + + for (int i = 0; i < tmp_in; i++) + { + hm_adapters_nvapi[tmp_out++].nvapi = nvGPUHandle[i]; } } } if ((need_adl == 1) && (adl_init (adl) == 0)) { - data.hm_amd = adl; + data.hm_adl = adl; } - if (data.hm_amd) + if (data.hm_adl) { - if (hm_ADL_Main_Control_Create (data.hm_amd, ADL_Main_Memory_Alloc, 0) == ADL_OK) + if (hm_ADL_Main_Control_Create (data.hm_adl, ADL_Main_Memory_Alloc, 0) == ADL_OK) { // total number of adapters int hm_adapters_num; - if (get_adapters_num_amd (data.hm_amd, &hm_adapters_num) != 0) return (-1); + if (get_adapters_num_adl (data.hm_adl, &hm_adapters_num) != 0) return (-1); // adapter info - LPAdapterInfo lpAdapterInfo = hm_get_adapter_info_amd (data.hm_amd, hm_adapters_num); + LPAdapterInfo lpAdapterInfo = hm_get_adapter_info_adl (data.hm_adl, hm_adapters_num); if (lpAdapterInfo == NULL) return (-1); @@ -14070,12 +14158,12 @@ int main (int argc, char **argv) { hc_thread_mutex_lock (mux_adl); - // hm_get_opencl_busid_devid (hm_adapters_amd, devices_all_cnt, devices_all); + // hm_get_opencl_busid_devid (hm_adapters_adl, devices_all_cnt, devices_all); - hm_get_adapter_index_amd (hm_adapters_amd, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); + hm_get_adapter_index_adl (hm_adapters_adl, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); - hm_get_overdrive_version (data.hm_amd, hm_adapters_amd, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); - hm_check_fanspeed_control (data.hm_amd, hm_adapters_amd, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); + hm_get_overdrive_version (data.hm_adl, hm_adapters_adl, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); + hm_check_fanspeed_control (data.hm_adl, hm_adapters_adl, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); hc_thread_mutex_unlock (mux_adl); } @@ -14085,7 +14173,7 @@ int main (int argc, char **argv) } } - if (data.hm_amd == NULL && data.hm_nv == NULL) + if (data.hm_adl == NULL && data.hm_nvml == NULL) { gpu_temp_disable = 1; } @@ -14174,7 +14262,7 @@ int main (int argc, char **argv) */ #ifdef HAVE_HWMON - if (gpu_temp_disable == 0 && data.hm_amd == NULL && data.hm_nv == NULL) + if (gpu_temp_disable == 0 && data.hm_adl == NULL && data.hm_nvml == NULL) { log_info ("Watchdog: Hardware Monitoring Interface not found on your system"); } @@ -14219,14 +14307,24 @@ int main (int argc, char **argv) const uint platform_devices_id = device_param->platform_devices_id; - if (device_param->device_vendor_id == VENDOR_ID_NV) + if (device_param->device_vendor_id == VENDOR_ID_AMD) { - memcpy (&data.hm_device[device_id], &hm_adapters_nv[platform_devices_id], sizeof (hm_attrs_t)); + data.hm_device[device_id].adl = hm_adapters_adl[platform_devices_id].adl; + data.hm_device[device_id].nvapi = 0; + data.hm_device[device_id].nvml = 0; + data.hm_device[device_id].od_version = hm_adapters_adl[platform_devices_id].od_version; + data.hm_device[device_id].fan_get_supported = hm_adapters_adl[platform_devices_id].fan_get_supported; + data.hm_device[device_id].fan_set_supported = hm_adapters_adl[platform_devices_id].fan_set_supported; } - if (device_param->device_vendor_id == VENDOR_ID_AMD) + if (device_param->device_vendor_id == VENDOR_ID_NV) { - memcpy (&data.hm_device[device_id], &hm_adapters_amd[platform_devices_id], sizeof (hm_attrs_t)); + data.hm_device[device_id].adl = 0; + data.hm_device[device_id].nvapi = hm_adapters_nvapi[platform_devices_id].nvapi; + data.hm_device[device_id].nvml = hm_adapters_nvml[platform_devices_id].nvml; + data.hm_device[device_id].od_version = 0; + data.hm_device[device_id].fan_get_supported = hm_adapters_nvml[platform_devices_id].fan_get_supported; + data.hm_device[device_id].fan_set_supported = 0; } } } @@ -14263,7 +14361,7 @@ int main (int argc, char **argv) int powertune_supported = 0; - if ((ADL_rc = hm_ADL_Overdrive6_PowerControl_Caps (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &powertune_supported)) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive6_PowerControl_Caps (data.hm_adl, data.hm_device[device_id].adl, &powertune_supported)) != ADL_OK) { log_error ("ERROR: Failed to get ADL PowerControl Capabilities"); @@ -14278,9 +14376,9 @@ int main (int argc, char **argv) ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; - if ((ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &powertune)) == ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get (data.hm_adl, data.hm_device[device_id].adl, &powertune)) == ADL_OK) { - ADL_rc = hm_ADL_Overdrive_PowerControl_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &od_power_control_status[device_id]); + ADL_rc = hm_ADL_Overdrive_PowerControl_Get (data.hm_adl, data.hm_device[device_id].adl, &od_power_control_status[device_id]); } if (ADL_rc != ADL_OK) @@ -14290,7 +14388,7 @@ int main (int argc, char **argv) return (-1); } - if ((ADL_rc = hm_ADL_Overdrive_PowerControl_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, powertune.iMaxValue)) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_PowerControl_Set (data.hm_adl, data.hm_device[device_id].adl, powertune.iMaxValue)) != ADL_OK) { log_error ("ERROR: Failed to set new ADL PowerControl values"); @@ -14303,7 +14401,7 @@ int main (int argc, char **argv) od_clock_mem_status[device_id].state.iNumberOfPerformanceLevels = 2; - if ((ADL_rc = hm_ADL_Overdrive_StateInfo_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE, &od_clock_mem_status[device_id])) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_StateInfo_Get (data.hm_adl, data.hm_device[device_id].adl, ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE, &od_clock_mem_status[device_id])) != ADL_OK) { log_error ("ERROR: Failed to get ADL memory and engine clock frequency"); @@ -14314,7 +14412,7 @@ int main (int argc, char **argv) ADLOD6Capabilities caps = {0, 0, 0, {0, 0, 0}, {0, 0, 0}, 0, 0}; - if ((ADL_rc = hm_ADL_Overdrive_Capabilities_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &caps)) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_Capabilities_Get (data.hm_adl, data.hm_device[device_id].adl, &caps)) != ADL_OK) { log_error ("ERROR: Failed to get ADL device capabilities"); @@ -14351,7 +14449,7 @@ int main (int argc, char **argv) performance_state->aLevels[0].iMemoryClock = memory_clock_profile_max; performance_state->aLevels[1].iMemoryClock = memory_clock_profile_max; - if ((ADL_rc = hm_ADL_Overdrive_State_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_State_Set (data.hm_adl, data.hm_device[device_id].adl, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) != ADL_OK) { log_info ("ERROR: Failed to set ADL performance state"); @@ -14368,14 +14466,14 @@ int main (int argc, char **argv) // powertune set ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; - if ((ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &powertune)) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get (data.hm_adl, data.hm_device[device_id].adl, &powertune)) != ADL_OK) { log_error ("ERROR: Failed to get current ADL PowerControl settings"); return (-1); } - if ((ADL_rc = hm_ADL_Overdrive_PowerControl_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, powertune.iMaxValue)) != ADL_OK) + if ((ADL_rc = hm_ADL_Overdrive_PowerControl_Set (data.hm_adl, data.hm_device[device_id].adl, powertune.iMaxValue)) != ADL_OK) { log_error ("ERROR: Failed to set new ADL PowerControl values"); @@ -14393,7 +14491,7 @@ int main (int argc, char **argv) int powertune_supported = 0; - if (hm_NVML_nvmlDeviceGetPowerManagementLimit (data.hm_nv, 0, data.hm_device[device_id].adapter_index.nv, &limit) == NVML_SUCCESS) + if (hm_NVML_nvmlDeviceGetPowerManagementLimit (data.hm_nvml, 0, data.hm_device[device_id].nvml, &limit) == NVML_SUCCESS) { powertune_supported = 1; } @@ -14405,11 +14503,11 @@ int main (int argc, char **argv) unsigned int minLimit; unsigned int maxLimit; - if (hm_NVML_nvmlDeviceGetPowerManagementLimitConstraints (data.hm_nv, 0, data.hm_device[device_id].adapter_index.nv, &minLimit, &maxLimit) == NVML_SUCCESS) + if (hm_NVML_nvmlDeviceGetPowerManagementLimitConstraints (data.hm_nvml, 0, data.hm_device[device_id].nvml, &minLimit, &maxLimit) == NVML_SUCCESS) { if (maxLimit > 0) { - if (hm_NVML_nvmlDeviceSetPowerManagementLimit (data.hm_nv, 0, data.hm_device[device_id].adapter_index.nv, maxLimit) == NVML_SUCCESS) + if (hm_NVML_nvmlDeviceSetPowerManagementLimit (data.hm_nvml, 0, data.hm_device[device_id].nvml, maxLimit) == NVML_SUCCESS) { // now we can be sure we need to reset later @@ -14494,6 +14592,8 @@ int main (int argc, char **argv) device_param->kernel_threads = kernel_threads; + device_param->hardware_power = device_processors * kernel_threads; + /** * create input buffers on device : calculate size of fixed memory buffers */ @@ -14608,7 +14708,7 @@ int main (int argc, char **argv) * some algorithms need a fixed kernel-loops count */ - if (hash_mode == 1500) + if (hash_mode == 1500 && attack_mode == ATTACK_MODE_BF) { const u32 kernel_loops_fixed = 1024; @@ -14616,7 +14716,7 @@ int main (int argc, char **argv) device_param->kernel_loops_max = kernel_loops_fixed; } - if (hash_mode == 3000) + if (hash_mode == 3000 && attack_mode == ATTACK_MODE_BF) { const u32 kernel_loops_fixed = 1024; @@ -15704,21 +15804,6 @@ int main (int argc, char **argv) #if defined(HAVE_HWMON) - /** - * Store thermal target temperature so we can send a notice to user - */ - - if (gpu_temp_disable == 0) - { - const int gpu_temp_threshold_slowdown = hm_get_threshold_slowdown_with_device_id (device_id); - const int gpu_temp_threshold_shutdown = hm_get_threshold_slowdown_with_device_id (device_id); - - data.hm_device[device_id].gpu_temp_threshold_slowdown = (gpu_temp_threshold_slowdown > 0) ? gpu_temp_threshold_slowdown : 10000; - data.hm_device[device_id].gpu_temp_threshold_shutdown = (gpu_temp_threshold_shutdown > 0) ? gpu_temp_threshold_shutdown : 10000; - - // we could use those numbers for gpu_temp_retain and gpu_temp_abort, too - } - /** * Store initial fanspeed if gpu_temp_retain is enabled */ @@ -15748,7 +15833,7 @@ int main (int argc, char **argv) if (device_param->device_vendor_id == VENDOR_ID_AMD) { - rc = hm_set_fanspeed_with_device_id_amd (device_id, fanspeed, 1); + rc = hm_set_fanspeed_with_device_id_adl (device_id, fanspeed, 1); } else if (device_param->device_vendor_id == VENDOR_ID_NV) { @@ -17003,7 +17088,7 @@ int main (int argc, char **argv) data.ms_paused = 0; - data.kernel_power_div = 0; + data.kernel_power_final = 0; data.words_cur = rd->words_cur; @@ -17513,35 +17598,12 @@ int main (int argc, char **argv) } } - data.devices_status = STATUS_RUNNING; - - if (initial_restore_done == 0) - { - if (data.restore_disable == 0) cycle_restore (); - - initial_restore_done = 1; - } - - hc_timer_set (&data.timer_running); - - if ((wordlist_mode == WL_MODE_FILE) || (wordlist_mode == WL_MODE_MASK)) - { - if ((quiet == 0) && (status == 0) && (benchmark == 0)) - { - if (quiet == 0) fprintf (stdout, "%s", PROMPT); - if (quiet == 0) fflush (stdout); - } - } - else if (wordlist_mode == WL_MODE_STDIN) - { - if (data.quiet == 0) log_info ("Starting attack in stdin mode..."); - if (data.quiet == 0) log_info (""); - } - /** * create autotune threads */ + data.devices_status = STATUS_AUTOTUNE; + hc_thread_t *c_threads = (hc_thread_t *) mycalloc (data.devices_cnt, sizeof (hc_thread_t)); for (uint device_id = 0; device_id < data.devices_cnt; device_id++) @@ -17557,15 +17619,21 @@ int main (int argc, char **argv) * Inform user about possible slow speeds */ + uint hardware_power_all = 0; + uint kernel_power_all = 0; for (uint device_id = 0; device_id < data.devices_cnt; device_id++) { hc_device_param_t *device_param = &devices_param[device_id]; + hardware_power_all += device_param->hardware_power; + kernel_power_all += device_param->kernel_power; } + data.hardware_power_all = hardware_power_all; // hardware_power_all is the same as kernel_power_all but without the influence of kernel_accel on the devices + data.kernel_power_all = kernel_power_all; if ((wordlist_mode == WL_MODE_FILE) || (wordlist_mode == WL_MODE_MASK)) @@ -17588,6 +17656,31 @@ int main (int argc, char **argv) * create cracker threads */ + data.devices_status = STATUS_RUNNING; + + if (initial_restore_done == 0) + { + if (data.restore_disable == 0) cycle_restore (); + + initial_restore_done = 1; + } + + hc_timer_set (&data.timer_running); + + if ((wordlist_mode == WL_MODE_FILE) || (wordlist_mode == WL_MODE_MASK)) + { + if ((quiet == 0) && (status == 0) && (benchmark == 0)) + { + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + } + } + else if (wordlist_mode == WL_MODE_STDIN) + { + if (data.quiet == 0) log_info ("Starting attack in stdin mode..."); + if (data.quiet == 0) log_info (""); + } + time_t runtime_start; time (&runtime_start); @@ -17928,7 +18021,7 @@ int main (int argc, char **argv) if (device_param->device_vendor_id == VENDOR_ID_AMD) { - rc = hm_set_fanspeed_with_device_id_amd (device_id, fanspeed, 0); + rc = hm_set_fanspeed_with_device_id_adl (device_id, fanspeed, 0); } else if (device_param->device_vendor_id == VENDOR_ID_NV) { @@ -17964,7 +18057,7 @@ int main (int argc, char **argv) int powertune_supported = 0; - if ((hm_ADL_Overdrive6_PowerControl_Caps (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &powertune_supported)) != ADL_OK) + if ((hm_ADL_Overdrive6_PowerControl_Caps (data.hm_adl, data.hm_device[device_id].adl, &powertune_supported)) != ADL_OK) { log_error ("ERROR: Failed to get ADL PowerControl Capabilities"); @@ -17975,7 +18068,7 @@ int main (int argc, char **argv) { // powercontrol settings - if ((hm_ADL_Overdrive_PowerControl_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, od_power_control_status[device_id])) != ADL_OK) + if ((hm_ADL_Overdrive_PowerControl_Set (data.hm_adl, data.hm_device[device_id].adl, od_power_control_status[device_id])) != ADL_OK) { log_info ("ERROR: Failed to restore the ADL PowerControl values"); @@ -17993,7 +18086,7 @@ int main (int argc, char **argv) performance_state->aLevels[0].iMemoryClock = od_clock_mem_status[device_id].state.aLevels[0].iMemoryClock; performance_state->aLevels[1].iMemoryClock = od_clock_mem_status[device_id].state.aLevels[1].iMemoryClock; - if ((hm_ADL_Overdrive_State_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) != ADL_OK) + if ((hm_ADL_Overdrive_State_Set (data.hm_adl, data.hm_device[device_id].adl, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) != ADL_OK) { log_info ("ERROR: Failed to restore ADL performance state"); @@ -18011,7 +18104,7 @@ int main (int argc, char **argv) if (limit > 0) { - hm_NVML_nvmlDeviceSetPowerManagementLimit (data.hm_nv, 0, data.hm_device[device_id].adapter_index.nv, limit); + hm_NVML_nvmlDeviceSetPowerManagementLimit (data.hm_nvml, 0, data.hm_device[device_id].nvml, limit); } } } @@ -18021,22 +18114,22 @@ int main (int argc, char **argv) if (gpu_temp_disable == 0) { - if (data.hm_nv) + if (data.hm_nvml) { - hm_NVML_nvmlShutdown (data.hm_nv); + hm_NVML_nvmlShutdown (data.hm_nvml); - nvml_close (data.hm_nv); + nvml_close (data.hm_nvml); - data.hm_nv = NULL; + data.hm_nvml = NULL; } - if (data.hm_amd) + if (data.hm_adl) { - hm_ADL_Main_Control_Destroy (data.hm_amd); + hm_ADL_Main_Control_Destroy (data.hm_adl); - adl_close (data.hm_amd); + adl_close (data.hm_adl); - data.hm_amd = NULL; + data.hm_adl = NULL; } } #endif // HAVE_HWMON