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 
13 static const u32   ATTACK_EXEC    = ATTACK_EXEC_OUTSIDE_KERNEL;
14 static const u32   DGST_POS0      = 0;
15 static const u32   DGST_POS1      = 1;
16 static const u32   DGST_POS2      = 2;
17 static const u32   DGST_POS3      = 3;
18 static const u32   DGST_SIZE      = DGST_SIZE_4_4;
19 static const u32   HASH_CATEGORY  = HASH_CATEGORY_PRIVATE_KEY;
20 static const char *HASH_NAME      = "PKCS#8 Private Keys (PBKDF2-HMAC-SHA256 + 3DES/AES)";
21 static const u64   KERN_TYPE      = 24420;
22 static const u32   OPTI_TYPE      = OPTI_TYPE_ZERO_BYTE
23                                   | OPTI_TYPE_SLOW_HASH_SIMD_LOOP;
24 static const u64   OPTS_TYPE      = OPTS_TYPE_PT_GENERATE_LE
25                                   | OPTS_TYPE_SUGGEST_KG;
26 static const u32   SALT_TYPE      = SALT_TYPE_EMBEDDED;
27 static const char *ST_PASS        = "hashcat";
28 static const char *ST_HASH        = "$PEM$2$4$ed02960b8a10b1f1$2048$a634c482a95f23bd8fada558e1bac2cf$1232$50b21db4aededb96417a9b88131e6bc3727739b4aa1413417338efaa6a756f27c32db5c339d9c3ba61c746bbe3d6c5e0a023f965e70fb617e78a00890b8c7fc7c9f5e0ab39f35bf58ab40f6ed15441338134d041ca59783437ef681a51132c085abb3830df95e9f94d11da54d61679ca6e40136da96ffe205ce191002458143f03cba3aeca6b22a3f0689d5582b3e6c01baee7a04d875ed44bb84fa0ed0a3aae1ed392645cced385498eef4ec25bf6d1399f1487f3625fad9fee25aabf18edb1ce5e640e834d31251b882601f23c2b2d77a45c84e0fc8a3a42e3ff9f75e7ac815c57a7e943ad803ab3672f85a37c6b92d0813590d47a31788643449dce67f135363a0c14f089629a1274b124539535df5f50df5d4402f7a109738f56467725a8aa3884562c8b4c42c068c3502be86e20ac9c52c0daec22e47dcbefebe902b1dc791ed3cd069c7f9211e43f5a3274450f4b0f0b7c6f59adeca8b39ed130b6cbda7cf98e15bbba21fa1758a28dc2edf2e2f17fc353853dc881458e59184f5a8f6e09456e4d71d90135a8ce67350f7bcb3d900e75585e3a87c0c8482f3917347fcfad4fdb8915991cffd20dae1502d0f69d385244e489e50cc9f24b15a5f9d0b00d62805026db5378b5408d7d719786eb043659a452096736e4a7501548655df83045dc4e86bd3319f2982e6db2bbb239019202cebf2ca68c05b578ba95cef82397b145c80208cd7ffd9b0cd5fc3d0d7ea26401c8e11c28ab8d1a524b884962e7fee597943a5e38137abb8b26a7772f0ad6dad074dcfd0b5794822aa7e43d10cab2c95e63b6459706dc21a1cbbd7ae4c96b40ee4d7039cf84c416cb879b2d30b7ac5e1860dcd2ab5479c39b748f5fd9336934c9c1e8064ffb0906c0c2898479209d1a9c97c3cd1782d7514e94d01b242a371a2df5592d620ebd6e18e63ff24ee8ba182f17e6c578431d738e955a957469e8069a919fd3a15532d460201d4e38ac04ac494b9cde1731d4511bf8faf8420a9de4f8c7d3d721fc30d8c3664683fd91ad3515e97092fb652205fb087890cb594947f5372c9b0b27f08b4b57bf610f777fcf040e6e7b8cedf85113dfd909cbac4b774c7580686f2e1f261898da4c6804d573fb22248005f5e0d3b256a0f3dcb71c47b3d674352bda82c22a513e381f990b6100328185511de9b3352126c5aedb9b0bde15743b42e231ef7227c0fe478044ce69474a740366058f07e56dde7d6089cb76e606482e7ba206355fc0fa180c4a41ae781e4723120e3d5a1dd40224db2c959ecbc9bce88bfeed64082d07b111e88a2d8a6a6fe097c9a298a6c3f76beb5b3b5aecedbbbcd404aac8fd25c069c747338ca0c81e6b63d87fc4f0bc18a86b721e3a16e9875741e0313057de8476ee84e36efe557dc33a7d23a9426f2e359781147607ad79235c9d7846320fe2d963fac79a5c92ff3067595273931174d2173f63cfceb9f62a873e7c240d3c260bcfb02b2697911321a72455cacc6929133d0af2cdf6d59a63293ac508786a4850267f90993fff3b6c07bbf3af0e3c08638148101ae1495da3360614866e238c4f60ca00f615877be80cc708da5ea1c30032acffd0e55429ba29dca409349d901a49831db44c1e58b7530b383d3f7e1cac79200cad9bdf87451783f2ffdab09b230aab52b41fa42fdd9f1f05a3dda0fa16b011c51e330d044adf394bbbb7fa25efc860f3082e42824be3b96943afbe641fe6bb";
29 
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)30 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)31 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)32 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)33 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)34 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)35 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)36 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)37 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)38 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)39 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)40 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)41 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)42 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)43 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;         }
44 
45 typedef struct pkcs_sha256_tmp
46 {
47   u32  ipad[8];
48   u32  opad[8];
49 
50   u32  dgst[32];
51   u32  out[32];
52 
53 } pkcs_sha256_tmp_t;
54 
55 typedef struct pkcs
56 {
57   int cipher;
58 
59   u32 data_buf[16384];
60   int data_len;
61 
62   u32 iv_buf[4];
63 
64 } pkcs_t;
65 
66 static const char *SIGNATURE_PEM = "$PEM$";
67 
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)68 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)
69 {
70   const u64 esalt_size = (const u64) sizeof (pkcs_t);
71 
72   return esalt_size;
73 }
74 
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)75 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)
76 {
77   const u64 tmp_size = (const u64) sizeof (pkcs_sha256_tmp_t);
78 
79   return tmp_size;
80 }
81 
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)82 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)
83 {
84   // this overrides the reductions of PW_MAX in case optimized kernel is selected
85   // IOW, even in optimized kernel mode it support length 256
86 
87   const u32 pw_max = PW_MAX;
88 
89   return pw_max;
90 }
91 
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)92 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)
93 {
94   u32 *digest = (u32 *) digest_buf;
95 
96   pkcs_t *pkcs = (pkcs_t *) esalt_buf;
97 
98   token_t token;
99 
100   token.token_cnt  = 8;
101 
102   token.signatures_cnt    = 1;
103   token.signatures_buf[0] = SIGNATURE_PEM;
104 
105   token.len[0]     = 5;
106   token.attr[0]    = TOKEN_ATTR_FIXED_LENGTH
107                    | TOKEN_ATTR_VERIFY_SIGNATURE;
108 
109   token.sep[1]     = '$';
110   token.len_min[1] = 1;
111   token.len_max[1] = 1;
112   token.attr[1]    = TOKEN_ATTR_VERIFY_LENGTH
113                    | TOKEN_ATTR_VERIFY_DIGIT;
114 
115   token.sep[2]     = '$';
116   token.len_min[2] = 1;
117   token.len_max[2] = 1;
118   token.attr[2]    = TOKEN_ATTR_VERIFY_LENGTH
119                    | TOKEN_ATTR_VERIFY_DIGIT;
120 
121   token.sep[3]     = '$';
122   token.len_min[3] = 16;
123   token.len_max[3] = 16;
124   token.attr[3]    = TOKEN_ATTR_VERIFY_LENGTH
125                    | TOKEN_ATTR_VERIFY_HEX;
126 
127   token.sep[4]     = '$';
128   token.len_min[4] = 1;
129   token.len_max[4] = 8;
130   token.attr[4]    = TOKEN_ATTR_VERIFY_LENGTH
131                    | TOKEN_ATTR_VERIFY_DIGIT;
132 
133   token.sep[5]     = '$';
134   token.len_min[5] = 16;  // can be either 16 or 32
135   token.len_max[5] = 32;  // exact check deeper in decoder code
136   token.attr[5]    = TOKEN_ATTR_VERIFY_LENGTH
137                    | TOKEN_ATTR_VERIFY_HEX;
138 
139   token.sep[6]     = '$';
140   token.len_min[6] = 1;
141   token.len_max[6] = 8;
142   token.attr[6]    = TOKEN_ATTR_VERIFY_LENGTH
143                    | TOKEN_ATTR_VERIFY_DIGIT;
144 
145   token.sep[7]     = '$';
146   token.len_min[7] = 64;    // 64 = minimum size (32 byte) to avoid out of boundary read in kernel
147   token.len_max[7] = 65536; // 65536 = maximum asn.1 size fitting into 2 byte length integer
148   token.attr[7]    = TOKEN_ATTR_VERIFY_LENGTH
149                    | TOKEN_ATTR_VERIFY_HEX;
150 
151   const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token);
152 
153   if (rc_tokenizer != PARSER_OK) return (rc_tokenizer);
154 
155   // type
156 
157   const u8 *type_pos = token.buf[1];
158 
159   if (type_pos[0] != '2') return (PARSER_SIGNATURE_UNMATCHED);
160 
161   // cipher
162 
163   const u8 *cipher_pos = token.buf[2];
164 
165   int cipher = hc_strtoul ((const char *) cipher_pos, NULL, 10);
166 
167   if ((cipher != 1)
168    && (cipher != 2)
169    && (cipher != 3)
170    && (cipher != 4)) return (PARSER_CIPHER);
171 
172   pkcs->cipher = cipher;
173 
174   // salt buffer
175 
176   const u8 *salt_pos = token.buf[3];
177 
178   salt->salt_buf[0] = hex_to_u32 (salt_pos + 0);
179   salt->salt_buf[1] = hex_to_u32 (salt_pos + 8);
180 
181   salt->salt_len = 8;
182 
183   // iter
184 
185   const u8 *iter_pos = token.buf[4];
186 
187   const u32 iter = hc_strtoul ((const char *) iter_pos, NULL, 10);
188 
189   salt->salt_iter = iter - 1;
190 
191   // IV buffer
192 
193   const u8 *iv_pos = token.buf[5];
194   const int iv_len = token.len[5];
195 
196   if (cipher == 1)
197   {
198     if (iv_len != 16) return (PARSER_SALT_LENGTH);
199 
200     pkcs->iv_buf[0] = hex_to_u32 (iv_pos + 0);
201     pkcs->iv_buf[1] = hex_to_u32 (iv_pos + 8);
202   }
203   else
204   {
205     if (iv_len != 32) return (PARSER_SALT_LENGTH);
206 
207     pkcs->iv_buf[0] = hex_to_u32 (iv_pos +  0);
208     pkcs->iv_buf[1] = hex_to_u32 (iv_pos +  8);
209     pkcs->iv_buf[2] = hex_to_u32 (iv_pos + 16);
210     pkcs->iv_buf[3] = hex_to_u32 (iv_pos + 24);
211   }
212 
213   // data length
214 
215   const u8 *data_len_verify_pos = token.buf[6];
216 
217   const int data_len_verify = hc_strtoul ((const char *) data_len_verify_pos, NULL, 10);
218 
219   // data
220 
221   const u8 *data_pos = token.buf[7];
222   const int data_len = token.len[7];
223 
224   pkcs->data_len = hex_decode (data_pos, data_len, (u8 *) pkcs->data_buf);
225 
226   if (data_len_verify != pkcs->data_len) return (PARSER_HASH_LENGTH);
227 
228   // data has to be a multiple of cipher block size
229 
230   int cipher_bs = 0;
231 
232        if (cipher == 1) { cipher_bs =  8; }
233   else if (cipher == 2) { cipher_bs = 16; }
234   else if (cipher == 3) { cipher_bs = 16; }
235   else if (cipher == 4) { cipher_bs = 16; }
236 
237   if (pkcs->data_len % cipher_bs) return (PARSER_HASH_LENGTH);
238 
239   // hash
240 
241   digest[0] = pkcs->data_buf[0];
242   digest[1] = pkcs->data_buf[1];
243   digest[2] = pkcs->data_buf[2];
244   digest[3] = pkcs->data_buf[3];
245 
246   return (PARSER_OK);
247 }
248 
module_hash_encode(MAYBE_UNUSED const hashconfig_t * hashconfig,MAYBE_UNUSED const void * digest_buf,MAYBE_UNUSED const salt_t * salt,MAYBE_UNUSED const void * esalt_buf,MAYBE_UNUSED const void * hook_salt_buf,MAYBE_UNUSED const hashinfo_t * hash_info,char * line_buf,MAYBE_UNUSED const int line_size)249 int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size)
250 {
251   pkcs_t *pkcs = (pkcs_t *) esalt_buf;
252 
253   u8 *out_buf = (u8 *) line_buf;
254 
255   int out_len;
256 
257   if (pkcs->cipher == 1)
258   {
259     out_len = snprintf ((char *) out_buf, line_size, "%s2$%d$%08x%08x$%d$%08x%08x$%d$",
260       SIGNATURE_PEM,
261       pkcs->cipher,
262       byte_swap_32 (salt->salt_buf[0]),
263       byte_swap_32 (salt->salt_buf[1]),
264       salt->salt_iter + 1,
265       byte_swap_32 (pkcs->iv_buf[0]),
266       byte_swap_32 (pkcs->iv_buf[1]),
267       pkcs->data_len);
268   }
269   else
270   {
271     out_len = snprintf ((char *) out_buf, line_size, "%s2$%d$%08x%08x$%d$%08x%08x%08x%08x$%d$",
272       SIGNATURE_PEM,
273       pkcs->cipher,
274       byte_swap_32 (salt->salt_buf[0]),
275       byte_swap_32 (salt->salt_buf[1]),
276       salt->salt_iter + 1,
277       byte_swap_32 (pkcs->iv_buf[0]),
278       byte_swap_32 (pkcs->iv_buf[1]),
279       byte_swap_32 (pkcs->iv_buf[2]),
280       byte_swap_32 (pkcs->iv_buf[3]),
281       pkcs->data_len);
282   }
283 
284   out_len += hex_encode ((const u8 *) pkcs->data_buf, pkcs->data_len, (u8 *) out_buf + out_len);
285 
286   return out_len;
287 }
288 
module_init(module_ctx_t * module_ctx)289 void module_init (module_ctx_t *module_ctx)
290 {
291   module_ctx->module_context_size             = MODULE_CONTEXT_SIZE_CURRENT;
292   module_ctx->module_interface_version        = MODULE_INTERFACE_VERSION_CURRENT;
293 
294   module_ctx->module_attack_exec              = module_attack_exec;
295   module_ctx->module_benchmark_esalt          = MODULE_DEFAULT;
296   module_ctx->module_benchmark_hook_salt      = MODULE_DEFAULT;
297   module_ctx->module_benchmark_mask           = MODULE_DEFAULT;
298   module_ctx->module_benchmark_salt           = MODULE_DEFAULT;
299   module_ctx->module_build_plain_postprocess  = MODULE_DEFAULT;
300   module_ctx->module_deep_comp_kernel         = MODULE_DEFAULT;
301   module_ctx->module_deprecated_notice        = MODULE_DEFAULT;
302   module_ctx->module_dgst_pos0                = module_dgst_pos0;
303   module_ctx->module_dgst_pos1                = module_dgst_pos1;
304   module_ctx->module_dgst_pos2                = module_dgst_pos2;
305   module_ctx->module_dgst_pos3                = module_dgst_pos3;
306   module_ctx->module_dgst_size                = module_dgst_size;
307   module_ctx->module_dictstat_disable         = MODULE_DEFAULT;
308   module_ctx->module_esalt_size               = module_esalt_size;
309   module_ctx->module_extra_buffer_size        = MODULE_DEFAULT;
310   module_ctx->module_extra_tmp_size           = MODULE_DEFAULT;
311   module_ctx->module_extra_tuningdb_block     = MODULE_DEFAULT;
312   module_ctx->module_forced_outfile_format    = MODULE_DEFAULT;
313   module_ctx->module_hash_binary_count        = MODULE_DEFAULT;
314   module_ctx->module_hash_binary_parse        = MODULE_DEFAULT;
315   module_ctx->module_hash_binary_save         = MODULE_DEFAULT;
316   module_ctx->module_hash_decode_potfile      = MODULE_DEFAULT;
317   module_ctx->module_hash_decode_zero_hash    = MODULE_DEFAULT;
318   module_ctx->module_hash_decode              = module_hash_decode;
319   module_ctx->module_hash_encode_status       = MODULE_DEFAULT;
320   module_ctx->module_hash_encode_potfile      = MODULE_DEFAULT;
321   module_ctx->module_hash_encode              = module_hash_encode;
322   module_ctx->module_hash_init_selftest       = MODULE_DEFAULT;
323   module_ctx->module_hash_mode                = MODULE_DEFAULT;
324   module_ctx->module_hash_category            = module_hash_category;
325   module_ctx->module_hash_name                = module_hash_name;
326   module_ctx->module_hashes_count_min         = MODULE_DEFAULT;
327   module_ctx->module_hashes_count_max         = MODULE_DEFAULT;
328   module_ctx->module_hlfmt_disable            = MODULE_DEFAULT;
329   module_ctx->module_hook_extra_param_size    = MODULE_DEFAULT;
330   module_ctx->module_hook_extra_param_init    = MODULE_DEFAULT;
331   module_ctx->module_hook_extra_param_term    = MODULE_DEFAULT;
332   module_ctx->module_hook12                   = MODULE_DEFAULT;
333   module_ctx->module_hook23                   = MODULE_DEFAULT;
334   module_ctx->module_hook_salt_size           = MODULE_DEFAULT;
335   module_ctx->module_hook_size                = MODULE_DEFAULT;
336   module_ctx->module_jit_build_options        = MODULE_DEFAULT;
337   module_ctx->module_jit_cache_disable        = MODULE_DEFAULT;
338   module_ctx->module_kernel_accel_max         = MODULE_DEFAULT;
339   module_ctx->module_kernel_accel_min         = MODULE_DEFAULT;
340   module_ctx->module_kernel_loops_max         = MODULE_DEFAULT;
341   module_ctx->module_kernel_loops_min         = MODULE_DEFAULT;
342   module_ctx->module_kernel_threads_max       = MODULE_DEFAULT;
343   module_ctx->module_kernel_threads_min       = MODULE_DEFAULT;
344   module_ctx->module_kern_type                = module_kern_type;
345   module_ctx->module_kern_type_dynamic        = MODULE_DEFAULT;
346   module_ctx->module_opti_type                = module_opti_type;
347   module_ctx->module_opts_type                = module_opts_type;
348   module_ctx->module_outfile_check_disable    = MODULE_DEFAULT;
349   module_ctx->module_outfile_check_nocomp     = MODULE_DEFAULT;
350   module_ctx->module_potfile_custom_check     = MODULE_DEFAULT;
351   module_ctx->module_potfile_disable          = MODULE_DEFAULT;
352   module_ctx->module_potfile_keep_all_hashes  = MODULE_DEFAULT;
353   module_ctx->module_pwdump_column            = MODULE_DEFAULT;
354   module_ctx->module_pw_max                   = module_pw_max;
355   module_ctx->module_pw_min                   = MODULE_DEFAULT;
356   module_ctx->module_salt_max                 = MODULE_DEFAULT;
357   module_ctx->module_salt_min                 = MODULE_DEFAULT;
358   module_ctx->module_salt_type                = module_salt_type;
359   module_ctx->module_separator                = MODULE_DEFAULT;
360   module_ctx->module_st_hash                  = module_st_hash;
361   module_ctx->module_st_pass                  = module_st_pass;
362   module_ctx->module_tmp_size                 = module_tmp_size;
363   module_ctx->module_unstable_warning         = MODULE_DEFAULT;
364   module_ctx->module_warmup_disable           = MODULE_DEFAULT;
365 }
366