From 1096d961a18de9865a5641f77291329243a77cfc Mon Sep 17 00:00:00 2001 From: Gabriele Gristina Date: Tue, 10 Jun 2025 23:19:12 +0200 Subject: [PATCH] Backend: Updated filename chksum format to prevent invalid cache on Apple Silicon when switching arch --- docs/changes.txt | 1 + include/shared.h | 2 ++ src/backend.c | 8 +++++--- src/shared.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 63ef1844f..4b3b15b72 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -119,6 +119,7 @@ - AMD Driver: Updated requirements for AMD Windows drivers to "AMD Adrenalin Edition" (23.7.2 or later) and "AMD HIP SDK" (23.Q3 or later) - Apple Driver: Automatically enable GPU support on Apple OpenCL instead of CPU support - Apple Driver: Updated requirements to use Apple OpenCL API to macOS 13.0 - use +- Backend: Updated filename chksum format to prevent invalid cache on Apple Silicon when switching arch - Backend Checks: Describe workaround in error message when detecting more than 64 backend devices - Brain: Added sanity check and corresponding error message for invalid --brain-port values - Dependencies: Added sse2neon v1.8.0 (commit 658eeac) diff --git a/include/shared.h b/include/shared.h index 5dd482d34..bcc98e5d9 100644 --- a/include/shared.h +++ b/include/shared.h @@ -106,6 +106,8 @@ int input_tokenizer (const u8 *input_buf, const int input_len, hc_token_t *token int extract_dynamicx_hash (const u8 *input_buf, const int input_len, u8 **output_buf, int *output_len); +int get_current_arch(); + #if defined (__APPLE__) bool is_apple_silicon (void); #endif diff --git a/src/backend.c b/src/backend.c index 5bf1d3c98..e7f4733b3 100644 --- a/src/backend.c +++ b/src/backend.c @@ -10528,7 +10528,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) char device_name_chksum_amp_mp[HCBUFSIZ_TINY] = { 0 }; - const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY, "%d-%d-%d-%u-%d-%u-%s-%s-%s-%u", + const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY, "%d-%d-%d-%u-%d-%u-%s-%s-%s-%u-%u", backend_ctx->comptime, backend_ctx->cuda_driver_version, backend_ctx->hip_runtimeVersion, @@ -10538,7 +10538,8 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) device_param->device_name, device_param->opencl_device_version, device_param->opencl_driver_version, - (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); + (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max, + get_current_arch()); md5_ctx_t md5_ctx; @@ -11090,7 +11091,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) const u32 extra_value = (user_options->attack_mode == ATTACK_MODE_ASSOCIATION) ? ATTACK_MODE_ASSOCIATION : ATTACK_MODE_NONE; - const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY, "%d-%d-%d-%u-%d-%u-%s-%s-%s-%d-%u-%u-%u-%s", + const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY, "%d-%d-%d-%u-%d-%u-%s-%s-%s-%d-%u-%u-%u-%u-%s", backend_ctx->comptime, backend_ctx->cuda_driver_version, backend_ctx->hip_runtimeVersion, @@ -11104,6 +11105,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) hashconfig->kern_type, extra_value, (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max, + get_current_arch(), build_options_module_buf); memset (&md5_ctx, 0, sizeof (md5_ctx_t)); diff --git a/src/shared.c b/src/shared.c index 38255b6f3..47645d655 100644 --- a/src/shared.c +++ b/src/shared.c @@ -23,6 +23,11 @@ #include #endif +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSYS__) +#else +#include +#endif + static const char *const PA_000 = "OK"; static const char *const PA_001 = "Ignored due to comment"; static const char *const PA_002 = "Ignored due to zero length"; @@ -1455,6 +1460,38 @@ int generic_salt_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, const u8 * return tmp_len; } +int get_current_arch() +{ + #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSYS__) + + SYSTEM_INFO sysinfo; + + GetNativeSystemInfo(&sysinfo); + + switch (sysinfo.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: return 1; + case PROCESSOR_ARCHITECTURE_INTEL: return 2; + case PROCESSOR_ARCHITECTURE_ARM64: return 3; + case PROCESSOR_ARCHITECTURE_ARM: return 4; + default: return 0; + } + + #else + + struct utsname uts; + + if (uname(&uts) != 0) return 0; // same as default, it doesn't matter if it fails here + + if (strstr(uts.machine, "x86_64")) return 1; + else if (strstr(uts.machine, "i386") || strstr(uts.machine, "i686")) return 2; + else if (strstr(uts.machine, "aarch64") || strstr(uts.machine, "arm64")) return 3; + else if (strstr(uts.machine, "arm")) return 4; + else return 0; + + #endif +} + #if defined (__APPLE__) bool is_apple_silicon (void)