From 6716447dfce969ddde42a9abe0681500bee0df48 Mon Sep 17 00:00:00 2001 From: jsteube Date: Sat, 20 Apr 2024 17:35:45 +0000 Subject: [PATCH] Add support for zero-length salts in Electrum $4 and $5 --- OpenCL/m21700-pure.cl | 14 +++++++++----- OpenCL/m21800-pure.cl | 9 +++++++-- src/modules/module_21700.c | 17 +++++++++-------- src/modules/module_21800.c | 17 +++++++++-------- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/OpenCL/m21700-pure.cl b/OpenCL/m21700-pure.cl index 920f0efa5..554dcfbdf 100644 --- a/OpenCL/m21700-pure.cl +++ b/OpenCL/m21700-pure.cl @@ -325,6 +325,12 @@ KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) if (gid >= GID_CNT) return; + const u32 digest_pos = LOOP_POS; + + const u32 digest_cur = DIGESTS_OFFSET_HOST + digest_pos; + + GLOBAL_AS const electrum_t *electrum = &esalt_bufs[digest_cur]; + u64 out[8]; out[0] = tmps[gid].out[0]; @@ -379,13 +385,12 @@ KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) * the main secp256k1 point multiplication by a scalar/tweak: */ - GLOBAL_AS secp256k1_t *coords = (GLOBAL_AS secp256k1_t *) &esalt_bufs[DIGESTS_OFFSET_HOST].coords; + GLOBAL_AS const secp256k1_t *coords = (GLOBAL_AS const secp256k1_t *) &electrum->coords; u32 pubkey[64] = { 0 }; // for point_mul () we need: 1 + 32 bytes (for sha512 () we need more) point_mul (pubkey, tweak, coords); - /* * sha512 () of the pubkey: */ @@ -396,14 +401,13 @@ KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) sha512_update (&sha512_ctx, pubkey, 33); // 33 because of 32 byte curve point + sign sha512_final (&sha512_ctx); - /* * sha256-hmac () of the data_buf */ - GLOBAL_AS u32 *data_buf = (GLOBAL_AS u32 *) esalt_bufs[DIGESTS_OFFSET_HOST].data_buf; + GLOBAL_AS const u32 *data_buf = (GLOBAL_AS const u32 *) electrum->data_buf; - u32 data_len = esalt_bufs[DIGESTS_OFFSET_HOST].data_len; + u32 data_len = electrum->data_len; u32 key[16] = { 0 }; diff --git a/OpenCL/m21800-pure.cl b/OpenCL/m21800-pure.cl index 9317eb19f..fd301671b 100644 --- a/OpenCL/m21800-pure.cl +++ b/OpenCL/m21800-pure.cl @@ -375,6 +375,11 @@ KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) if (gid >= GID_CNT) return; + const u32 digest_pos = LOOP_POS; + + const u32 digest_cur = DIGESTS_OFFSET_HOST + digest_pos; + + GLOBAL_AS const electrum_t *electrum = &esalt_bufs[digest_cur]; /* * Start by copying/aligning the data @@ -434,7 +439,7 @@ KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) * the main secp256k1 point multiplication by a scalar/tweak: */ - GLOBAL_AS secp256k1_t *coords = (GLOBAL_AS secp256k1_t *) &esalt_bufs[DIGESTS_OFFSET_HOST].coords; + GLOBAL_AS const secp256k1_t *coords = (GLOBAL_AS const secp256k1_t *) &electrum->coords; u32 pubkey[64] = { 0 }; // for point_mul () we need: 1 + 32 bytes (for sha512 () we need more) @@ -499,7 +504,7 @@ KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) // we need to run it at least once: - GLOBAL_AS u32 *data_buf = (GLOBAL_AS u32 *) esalt_bufs[DIGESTS_OFFSET_HOST].data_buf; + GLOBAL_AS const u32 *data_buf = (GLOBAL_AS const u32 *) electrum->data_buf; u32 data[4]; diff --git a/src/modules/module_21700.c b/src/modules/module_21700.c index 7f138f5b9..ffd6178d9 100644 --- a/src/modules/module_21700.c +++ b/src/modules/module_21700.c @@ -25,6 +25,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_DEEP_COMP_KERNEL | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -66,6 +67,11 @@ typedef struct electrum_tmp static const char *SIGNATURE_ELECTRUM = "$electrum$4*"; +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + return KERN_RUN_3; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) @@ -214,13 +220,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // fake salt - salt->salt_buf[0] = esalt->data_buf[0]; - salt->salt_buf[1] = esalt->data_buf[1]; - salt->salt_buf[2] = esalt->data_buf[2]; - salt->salt_buf[3] = esalt->data_buf[3]; - - salt->salt_len = 16; - + salt->salt_buf[0] = 0; + salt->salt_len = 0; salt->salt_iter = 1024 - 1; return (PARSER_OK); @@ -294,7 +295,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; - module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; module_ctx->module_dgst_pos0 = module_dgst_pos0; module_ctx->module_dgst_pos1 = module_dgst_pos1; diff --git a/src/modules/module_21800.c b/src/modules/module_21800.c index da26f0efa..486eba089 100644 --- a/src/modules/module_21800.c +++ b/src/modules/module_21800.c @@ -26,6 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_DEEP_COMP_KERNEL | OPTS_TYPE_NATIVE_THREADS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -66,6 +67,11 @@ typedef struct electrum_tmp static const char *SIGNATURE_ELECTRUM = "$electrum$5*"; +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + return KERN_RUN_3; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { // problem with this kernel is the huge amount of register pressure on u8 tmp[TMPSIZ]; @@ -191,13 +197,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // fake salt - salt->salt_buf[0] = esalt->data_buf[0]; - salt->salt_buf[1] = esalt->data_buf[1]; - salt->salt_buf[2] = esalt->data_buf[2]; - salt->salt_buf[3] = esalt->data_buf[3]; - - salt->salt_len = 16; - + salt->salt_buf[0] = 0; + salt->salt_len = 0; salt->salt_iter = 1024 - 1; return (PARSER_OK); @@ -271,7 +272,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; - module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; module_ctx->module_dgst_pos0 = module_dgst_pos0; module_ctx->module_dgst_pos1 = module_dgst_pos1;