1 /**
2  * Author......: See docs/credits.txt
3  * License.....: MIT
4  */
5 
6 #include "common.h"
7 #include "types.h"
8 #include "modules.h"
9 #include "bitops.h"
10 #include "convert.h"
11 #include "shared.h"
12 #include "memory.h"
13 #include "cpu_crc32.h"
14 #include "keyboard_layout.h"
15 
16 static const u32   ATTACK_EXEC    = ATTACK_EXEC_OUTSIDE_KERNEL;
17 static const u32   DGST_POS0      = 0;
18 static const u32   DGST_POS1      = 1;
19 static const u32   DGST_POS2      = 2;
20 static const u32   DGST_POS3      = 3;
21 static const u32   DGST_SIZE      = DGST_SIZE_8_8;
22 static const u32   HASH_CATEGORY  = HASH_CATEGORY_FDE;
23 static const char *HASH_NAME      = "VeraCrypt Streebog-512 + XTS 512 bit + boot-mode";
24 static const u64   KERN_TYPE      = 13771;
25 static const u32   OPTI_TYPE      = OPTI_TYPE_ZERO_BYTE
26                                   | OPTI_TYPE_USES_BITS_64
27                                   | OPTI_TYPE_SLOW_HASH_SIMD_LOOP;
28 static const u64   OPTS_TYPE      = OPTS_TYPE_PT_GENERATE_LE
29                                   | OPTS_TYPE_BINARY_HASHFILE
30                                   | OPTS_TYPE_LOOP_EXTENDED
31                                   | OPTS_TYPE_MP_MULTI_DISABLE
32                                   | OPTS_TYPE_KEYBOARD_MAPPING
33                                   | OPTS_TYPE_COPY_TMPS
34                                   | OPTS_TYPE_MAXIMUM_THREADS;
35 static const u32   SALT_TYPE      = SALT_TYPE_EMBEDDED;
36 static const char *ST_PASS        = "hashcat";
37 static const char *ST_HASH        = "2bfe4a72e13388a9ce074bbe0711a48d62f123df85b09e0350771edc4a0e4f397038a49b900275c9158145a96b52f95e92f927b3f963c7eadb71a07518d643231041c457d2794d0aa505f794153b52b24441271185d386833fbabf0e880c51b544f583d0db2ab6a926ddd3cdd0b68a61d7f5fe3f0ac6aa06ca676a868f373d35073605cf9d521ff55862b5005213a881a7b9025afc3409fa34dc86496620835df072fecd5b501f15e08113835c510d9f0bfd09d2ef1ac0e7bd01f0523d74a54fe984eb497cb960cce5bb154e024dc0c6c61a61e20a45a8f8ef319c63ca9646fbe00930302a5910891a1bc84bd936c926ca535b3b40c9e0ab255363b24a28bb8216d3d32244a725774e6ebbd73d6d3f2a2adcbc28d5341679cbb747efd56db1a09ce80b24640583ffc6f7ca5bd60d59114afcc78601184ba8feadb8d472f86c32bebf70e8158aa56f9db3b3200ef432aa7b370aa4ba408ef11b70d6806f1a21aaa3b629fa06f71dac0ae3e0ce95c7e5b550fc8c46017e151cbbcdf64b3b62b1b846a08925a217227286acfdad35b28407d589bec9578c2a4e9a4320f4a78e1e590fdf53c0a20fe0a1bb6c7d693abcd0e991c449e569477980d4b8972d21e4abc917d897e48ca427c954c3a3e0c8465ef40de51ffc9188047c043224c4a18638f1d91cd88c36623a1d880f18fd0d6ca0b3bbfa7d5d795acfb63576e2c2d83772e8";
38 
module_attack_exec(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)39 u32         module_attack_exec    (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC;     }
module_dgst_pos0(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)40 u32         module_dgst_pos0      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0;       }
module_dgst_pos1(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)41 u32         module_dgst_pos1      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1;       }
module_dgst_pos2(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)42 u32         module_dgst_pos2      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2;       }
module_dgst_pos3(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)43 u32         module_dgst_pos3      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3;       }
module_dgst_size(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)44 u32         module_dgst_size      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE;       }
module_hash_category(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)45 u32         module_hash_category  (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY;   }
module_hash_name(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)46 const char *module_hash_name      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME;       }
module_kern_type(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)47 u64         module_kern_type      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE;       }
module_opti_type(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)48 u32         module_opti_type      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE;       }
module_opts_type(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)49 u64         module_opts_type      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE;       }
module_salt_type(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)50 u32         module_salt_type      (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE;       }
module_st_hash(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)51 const char *module_st_hash        (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH;         }
module_st_pass(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)52 const char *module_st_pass        (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS;         }
53 
54 typedef struct vc64_sbog_tmp
55 {
56   u64  ipad_raw[8];
57   u64  opad_raw[8];
58 
59   u64  ipad_hash[8];
60   u64  opad_hash[8];
61 
62   u64  dgst[32];
63   u64  out[32];
64 
65   u64 pim_key[32];
66   int pim; // marker for cracked
67   int pim_check; // marker for _extended kernel
68 
69 } vc64_sbog_tmp_t;
70 
71 typedef struct vc
72 {
73   u32 salt_buf[32];
74   u32 data_buf[112];
75   u32 keyfile_buf16[16];
76   u32 keyfile_buf32[32];
77   u32 keyfile_enabled;
78   u32 signature;
79 
80   keyboard_layout_mapping_t keyboard_layout_mapping_buf[256];
81   int                       keyboard_layout_mapping_cnt;
82 
83   int pim_multi; // 2048 for boot (not SHA-512 or Whirlpool), 1000 for others
84   int pim_start;
85   int pim_stop;
86 
87 } vc_t;
88 
89 static const int   ROUNDS_VERACRYPT_200000     = 200000;
90 static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f;
91 
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)92 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)
93 {
94   // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241
95   if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU))
96   {
97     return true;
98   }
99 
100   if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE)
101   {
102     // self-test failed
103     if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU))
104     {
105       return true;
106     }
107   }
108 
109   return false;
110 }
111 
module_build_plain_postprocess(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const hashes_t * hashes,MAYBE_UNUSED const void * tmps,const u32 * src_buf,MAYBE_UNUSED const size_t src_sz,MAYBE_UNUSED const int src_len,u32 * dst_buf,MAYBE_UNUSED const size_t dst_sz)112 int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz)
113 {
114   const vc_t *vc = (const vc_t *) hashes->esalts_buf;
115 
116   u32 tmp_buf[64] = { 0 };
117 
118   memcpy (tmp_buf, src_buf, src_len);
119 
120   execute_keyboard_layout_mapping (tmp_buf, src_len, vc->keyboard_layout_mapping_buf, vc->keyboard_layout_mapping_cnt);
121 
122   const vc64_sbog_tmp_t *vc64_sbog_tmp = (const vc64_sbog_tmp_t *) tmps;
123 
124   if (vc64_sbog_tmp->pim == 0)
125   {
126     return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) tmp_buf);
127   }
128   else
129   {
130     return snprintf ((char *) dst_buf, dst_sz, "%s   (PIM=%d)", (char *) tmp_buf, vc64_sbog_tmp->pim);
131   }
132 }
133 
module_potfile_disable(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)134 bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
135 {
136   const bool potfile_disable = true;
137 
138   return potfile_disable;
139 }
140 
module_outfile_check_disable(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)141 bool module_outfile_check_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
142 {
143   const bool outfile_check_disable = true;
144 
145   return outfile_check_disable;
146 }
147 
module_esalt_size(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)148 u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
149 {
150   const u64 esalt_size = (const u64) sizeof (vc_t);
151 
152   return esalt_size;
153 }
154 
module_tmp_size(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)155 u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
156 {
157   const u64 tmp_size = (const u64) sizeof (vc64_sbog_tmp_t);
158 
159   return tmp_size;
160 }
161 
module_pw_max(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra)162 u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
163 {
164   // this overrides the reductions of PW_MAX in case optimized kernel is selected
165   // IOW, even in optimized kernel mode it support length 64
166 
167   const u32 pw_max = 64;
168 
169   return pw_max;
170 }
171 
module_hash_init_selftest(MAYBE_UNUSED const hashconfig_t * hashconfig,hash_t * hash)172 int module_hash_init_selftest (MAYBE_UNUSED const hashconfig_t *hashconfig, hash_t *hash)
173 {
174   const size_t st_hash_len = strlen (hashconfig->st_hash);
175 
176   char *tmpdata = (char *) hcmalloc (st_hash_len / 2);
177 
178   for (size_t i = 0, j = 0; j < st_hash_len; i += 1, j += 2)
179   {
180     const u8 c = hex_to_u8 ((const u8 *) hashconfig->st_hash + j);
181 
182     tmpdata[i] = c;
183   }
184 
185   const int parser_status = module_hash_decode (hashconfig, hash->digest, hash->salt, hash->esalt, hash->hook_salt, hash->hash_info, tmpdata, st_hash_len / 2);
186 
187   hcfree (tmpdata);
188 
189   return parser_status;
190 }
191 
module_hash_binary_parse(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const user_options_t * user_options,MAYBE_UNUSED const user_options_extra_t * user_options_extra,hashes_t * hashes)192 int module_hash_binary_parse (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, hashes_t *hashes)
193 {
194   // note: if module_hash_binary_parse exists, then module_hash_decode is not called
195 
196   HCFILE fp;
197 
198   if (hc_fopen (&fp, hashes->hashfile, "rb") == false) return (PARSER_HAVE_ERRNO);
199 
200   #define VC_HEADER_SIZE 512
201 
202   char *in = (char *) hcmalloc (VC_HEADER_SIZE);
203 
204   const size_t n = hc_fread (in, 1, VC_HEADER_SIZE, &fp);
205 
206   hc_fclose (&fp);
207 
208   if (n != VC_HEADER_SIZE) return (PARSER_VC_FILE_SIZE);
209 
210   hash_t *hashes_buf = hashes->hashes_buf;
211 
212   hash_t *hash = &hashes_buf[0];
213 
214   const int parser_status = module_hash_decode (hashconfig, hash->digest, hash->salt, hash->esalt, hash->hook_salt, hash->hash_info, in, VC_HEADER_SIZE);
215 
216   if (parser_status != PARSER_OK) return 0;
217 
218   hcfree (in);
219 
220   // keyfiles
221 
222   vc_t *vc = (vc_t *) hash->esalt;
223 
224   if (user_options->veracrypt_keyfiles)
225   {
226     char *keyfiles = hcstrdup (user_options->veracrypt_keyfiles);
227 
228     char *saveptr = NULL;
229 
230     char *keyfile = strtok_r (keyfiles, ",", &saveptr);
231 
232     while (keyfile)
233     {
234       if (hc_path_read (keyfile))
235       {
236         cpu_crc32 (keyfile, (u8 *) vc->keyfile_buf16,  64);
237         cpu_crc32 (keyfile, (u8 *) vc->keyfile_buf32, 128);
238       }
239 
240       keyfile = strtok_r ((char *) NULL, ",", &saveptr);
241     }
242 
243     hcfree (keyfiles);
244 
245     vc->keyfile_enabled = 1;
246   }
247 
248   // keyboard layout mapping
249 
250   if (user_options->keyboard_layout_mapping)
251   {
252     if (hc_path_read (user_options->keyboard_layout_mapping))
253     {
254       initialize_keyboard_layout_mapping (user_options->keyboard_layout_mapping, vc->keyboard_layout_mapping_buf, &vc->keyboard_layout_mapping_cnt);
255     }
256   }
257 
258   // veracrypt PIM
259 
260   salt_t *salt = hash->salt;
261 
262   if ((user_options->veracrypt_pim_start_chgd == true) && (user_options->veracrypt_pim_stop_chgd == true))
263   {
264     vc->pim_start = user_options->veracrypt_pim_start;
265     vc->pim_stop  = user_options->veracrypt_pim_stop;
266 
267     salt->salt_iter = vc->pim_stop * 2048;
268     salt->salt_iter--;
269   }
270 
271   return 1;
272 }
273 
module_hash_decode(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED void * digest_buf,MAYBE_UNUSED salt_t * salt,MAYBE_UNUSED void * esalt_buf,MAYBE_UNUSED void * hook_salt_buf,MAYBE_UNUSED hashinfo_t * hash_info,const char * line_buf,MAYBE_UNUSED const int line_len)274 int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len)
275 {
276   u32 *digest = (u32 *) digest_buf;
277 
278   vc_t *vc = (vc_t *) esalt_buf;
279 
280   const float entropy = get_entropy ((const u8 *) line_buf, line_len);
281 
282   if (entropy < MIN_SUFFICIENT_ENTROPY_FILE) return (PARSER_INSUFFICIENT_ENTROPY);
283 
284   memcpy (vc->salt_buf, line_buf, 64);
285 
286   memcpy (vc->data_buf, line_buf + 64, 512 - 64);
287 
288   salt->salt_buf[0] = vc->salt_buf[0];
289 
290   salt->salt_len = 4;
291 
292   salt->salt_iter = ROUNDS_VERACRYPT_200000;
293   salt->salt_iter--;
294 
295   vc->pim_multi = 2048;
296   vc->pim_start = 0;
297   vc->pim_stop  = 0;
298 
299   vc->signature = 0x41524556; // "VERA"
300 
301   digest[0] = vc->data_buf[0];
302 
303   return (PARSER_OK);
304 }
305 
module_init(module_ctx_t * module_ctx)306 void module_init (module_ctx_t *module_ctx)
307 {
308   module_ctx->module_context_size             = MODULE_CONTEXT_SIZE_CURRENT;
309   module_ctx->module_interface_version        = MODULE_INTERFACE_VERSION_CURRENT;
310 
311   module_ctx->module_attack_exec              = module_attack_exec;
312   module_ctx->module_benchmark_esalt          = MODULE_DEFAULT;
313   module_ctx->module_benchmark_hook_salt      = MODULE_DEFAULT;
314   module_ctx->module_benchmark_mask           = MODULE_DEFAULT;
315   module_ctx->module_benchmark_salt           = MODULE_DEFAULT;
316   module_ctx->module_build_plain_postprocess  = module_build_plain_postprocess;
317   module_ctx->module_deep_comp_kernel         = MODULE_DEFAULT;
318   module_ctx->module_deprecated_notice        = MODULE_DEFAULT;
319   module_ctx->module_dgst_pos0                = module_dgst_pos0;
320   module_ctx->module_dgst_pos1                = module_dgst_pos1;
321   module_ctx->module_dgst_pos2                = module_dgst_pos2;
322   module_ctx->module_dgst_pos3                = module_dgst_pos3;
323   module_ctx->module_dgst_size                = module_dgst_size;
324   module_ctx->module_dictstat_disable         = MODULE_DEFAULT;
325   module_ctx->module_esalt_size               = module_esalt_size;
326   module_ctx->module_extra_buffer_size        = MODULE_DEFAULT;
327   module_ctx->module_extra_tmp_size           = MODULE_DEFAULT;
328   module_ctx->module_extra_tuningdb_block     = MODULE_DEFAULT;
329   module_ctx->module_forced_outfile_format    = MODULE_DEFAULT;
330   module_ctx->module_hash_binary_count        = MODULE_DEFAULT;
331   module_ctx->module_hash_binary_parse        = module_hash_binary_parse;
332   module_ctx->module_hash_binary_save         = MODULE_DEFAULT;
333   module_ctx->module_hash_decode_potfile      = MODULE_DEFAULT;
334   module_ctx->module_hash_decode_zero_hash    = MODULE_DEFAULT;
335   module_ctx->module_hash_decode              = module_hash_decode;
336   module_ctx->module_hash_encode_status       = MODULE_DEFAULT;
337   module_ctx->module_hash_encode_potfile      = MODULE_DEFAULT;
338   module_ctx->module_hash_encode              = MODULE_DEFAULT;
339   module_ctx->module_hash_init_selftest       = module_hash_init_selftest;
340   module_ctx->module_hash_mode                = MODULE_DEFAULT;
341   module_ctx->module_hash_category            = module_hash_category;
342   module_ctx->module_hash_name                = module_hash_name;
343   module_ctx->module_hashes_count_min         = MODULE_DEFAULT;
344   module_ctx->module_hashes_count_max         = MODULE_DEFAULT;
345   module_ctx->module_hlfmt_disable            = MODULE_DEFAULT;
346   module_ctx->module_hook_extra_param_size    = MODULE_DEFAULT;
347   module_ctx->module_hook_extra_param_init    = MODULE_DEFAULT;
348   module_ctx->module_hook_extra_param_term    = MODULE_DEFAULT;
349   module_ctx->module_hook12                   = MODULE_DEFAULT;
350   module_ctx->module_hook23                   = MODULE_DEFAULT;
351   module_ctx->module_hook_salt_size           = MODULE_DEFAULT;
352   module_ctx->module_hook_size                = MODULE_DEFAULT;
353   module_ctx->module_jit_build_options        = MODULE_DEFAULT;
354   module_ctx->module_jit_cache_disable        = MODULE_DEFAULT;
355   module_ctx->module_kernel_accel_max         = MODULE_DEFAULT;
356   module_ctx->module_kernel_accel_min         = MODULE_DEFAULT;
357   module_ctx->module_kernel_loops_max         = MODULE_DEFAULT;
358   module_ctx->module_kernel_loops_min         = MODULE_DEFAULT;
359   module_ctx->module_kernel_threads_max       = MODULE_DEFAULT;
360   module_ctx->module_kernel_threads_min       = MODULE_DEFAULT;
361   module_ctx->module_kern_type                = module_kern_type;
362   module_ctx->module_kern_type_dynamic        = MODULE_DEFAULT;
363   module_ctx->module_opti_type                = module_opti_type;
364   module_ctx->module_opts_type                = module_opts_type;
365   module_ctx->module_outfile_check_disable    = module_outfile_check_disable;
366   module_ctx->module_outfile_check_nocomp     = MODULE_DEFAULT;
367   module_ctx->module_potfile_custom_check     = MODULE_DEFAULT;
368   module_ctx->module_potfile_disable          = module_potfile_disable;
369   module_ctx->module_potfile_keep_all_hashes  = MODULE_DEFAULT;
370   module_ctx->module_pwdump_column            = MODULE_DEFAULT;
371   module_ctx->module_pw_max                   = module_pw_max;
372   module_ctx->module_pw_min                   = MODULE_DEFAULT;
373   module_ctx->module_salt_max                 = MODULE_DEFAULT;
374   module_ctx->module_salt_min                 = MODULE_DEFAULT;
375   module_ctx->module_salt_type                = module_salt_type;
376   module_ctx->module_separator                = MODULE_DEFAULT;
377   module_ctx->module_st_hash                  = module_st_hash;
378   module_ctx->module_st_pass                  = module_st_pass;
379   module_ctx->module_tmp_size                 = module_tmp_size;
380   module_ctx->module_unstable_warning         = module_unstable_warning;
381   module_ctx->module_warmup_disable           = MODULE_DEFAULT;
382 }
383