Initial commit
[hashcat.git] / nv / m10410_a3.cu
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MD5_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW2
16 #define VECT_SIZE1
17 #endif
18
19 #define DGST_R0 0
20 #define DGST_R1 1
21 #define DGST_R2 2
22 #define DGST_R3 3
23
24 #include "include/kernel_functions.c"
25 #include "types_nv.c"
26 #include "common_nv.c"
27
28 #ifdef  VECT_SIZE1
29 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
30 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
31 #endif
32
33 #ifdef  VECT_SIZE2
34 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
35 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
36 #endif
37
38 __device__ __constant__ u32 padding[8] =
39 {
40   0x5e4ebf28,
41   0x418a754e,
42   0x564e0064,
43   0x0801faff,
44   0xb6002e2e,
45   0x803e68d0,
46   0xfea90c2f,
47   0x7a695364
48 };
49
50 typedef struct
51 {
52   u8 S[256];
53
54   u32 wtf_its_faster;
55
56 } RC4_KEY;
57
58 __device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j)
59 {
60   u8 tmp;
61
62   tmp           = rc4_key->S[i];
63   rc4_key->S[i] = rc4_key->S[j];
64   rc4_key->S[j] = tmp;
65 }
66
67 __device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4])
68 {
69   u32 v = 0x03020100;
70   u32 a = 0x04040404;
71
72   u32 *ptr = (u32 *) rc4_key->S;
73
74   #pragma unroll 64
75   for (u32 i = 0; i < 64; i++)
76   {
77     *ptr++ = v; v += a;
78   }
79
80   const u32 d0 = data[0] >>  0;
81   const u32 d1 = data[0] >>  8;
82   const u32 d2 = data[0] >> 16;
83   const u32 d3 = data[0] >> 24;
84   const u32 d4 = data[1] >>  0;
85
86   u32 i = 0;
87   u32 j = 0;
88
89   #pragma unroll 52
90   for (i = 0; i < 255; i += 5)
91   {
92     j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j);
93     j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j);
94     j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j);
95     j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j);
96     j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j);
97   }
98
99   j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j);
100 }
101
102 __device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4])
103 {
104   for (u32 k = 0; k < 4; k++)
105   {
106     u32 xor4 = 0;
107
108     u8 idx;
109
110     i += 1;
111     j += rc4_key->S[i];
112
113     swap (rc4_key, i, j);
114
115     idx = rc4_key->S[i] + rc4_key->S[j];
116
117     xor4 |= rc4_key->S[idx] <<  0;
118
119     i += 1;
120     j += rc4_key->S[i];
121
122     swap (rc4_key, i, j);
123
124     idx = rc4_key->S[i] + rc4_key->S[j];
125
126     xor4 |= rc4_key->S[idx] <<  8;
127
128     i += 1;
129     j += rc4_key->S[i];
130
131     swap (rc4_key, i, j);
132
133     idx = rc4_key->S[i] + rc4_key->S[j];
134
135     xor4 |= rc4_key->S[idx] << 16;
136
137     i += 1;
138     j += rc4_key->S[i];
139
140     swap (rc4_key, i, j);
141
142     idx = rc4_key->S[i] + rc4_key->S[j];
143
144     xor4 |= rc4_key->S[idx] << 24;
145
146     out[k] = in[k] ^ xor4;
147   }
148
149   return j;
150 }
151
152 __device__ __constant__ bf_t c_bfs[1024];
153
154 __device__ static void m10410m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
155 {
156   /**
157    * modifier
158    */
159
160   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
161   const u32 lid = threadIdx.x;
162
163   RC4_KEY *rc4_key = &rc4_keys[lid];
164
165   /**
166    * loop
167    */
168
169   u32x w0l = w0[0];
170
171   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
172   {
173     const u32 w0r = c_bfs[il_pos].i;
174
175     w0[0] = w0l | w0r;
176
177     // now the RC4 part
178
179     u32x key[4];
180
181     key[0] = w0[0];
182     key[1] = w0[1];
183     key[2] = 0;
184     key[3] = 0;
185
186     rc4_init_16 (rc4_key, key);
187
188     u32x out[4];
189
190     rc4_next_16 (rc4_key, 0, 0, padding, out);
191
192     const u32x r0 = out[0];
193     const u32x r1 = out[1];
194     const u32x r2 = out[2];
195     const u32x r3 = out[3];
196
197     #include VECT_COMPARE_M
198   }
199 }
200
201 __device__ static void m10410s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
202 {
203   /**
204    * modifier
205    */
206
207   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
208   const u32 lid = threadIdx.x;
209
210   RC4_KEY *rc4_key = &rc4_keys[lid];
211
212   /**
213    * digest
214    */
215
216   const u32 search[4] =
217   {
218     digests_buf[digests_offset].digest_buf[DGST_R0],
219     digests_buf[digests_offset].digest_buf[DGST_R1],
220     digests_buf[digests_offset].digest_buf[DGST_R2],
221     digests_buf[digests_offset].digest_buf[DGST_R3]
222   };
223
224   /**
225    * loop
226    */
227
228   u32x w0l = w0[0];
229
230   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
231   {
232     const u32 w0r = c_bfs[il_pos].i;
233
234     w0[0] = w0l | w0r;
235
236     // now the RC4 part
237
238     u32x key[4];
239
240     key[0] = w0[0];
241     key[1] = w0[1];
242     key[2] = 0;
243     key[3] = 0;
244
245     rc4_init_16 (rc4_key, key);
246
247     u32x out[4];
248
249     rc4_next_16 (rc4_key, 0, 0, padding, out);
250
251     const u32x r0 = out[0];
252     const u32x r1 = out[1];
253     const u32x r2 = out[2];
254     const u32x r3 = out[3];
255
256     #include VECT_COMPARE_S
257   }
258 }
259
260 extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
261 {
262   /**
263    * base
264    */
265
266   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
267
268   if (gid >= gid_max) return;
269
270   u32x w0[4];
271
272   w0[0] = pws[gid].i[ 0];
273   w0[1] = pws[gid].i[ 1];
274   w0[2] = pws[gid].i[ 2];
275   w0[3] = pws[gid].i[ 3];
276
277   u32x w1[4];
278
279   w1[0] = 0;
280   w1[1] = 0;
281   w1[2] = 0;
282   w1[3] = 0;
283
284   u32x w2[4];
285
286   w2[0] = 0;
287   w2[1] = 0;
288   w2[2] = 0;
289   w2[3] = 0;
290
291   u32x w3[4];
292
293   w3[0] = 0;
294   w3[1] = 0;
295   w3[2] = 0;
296   w3[3] = 0;
297
298   const u32 pw_len = pws[gid].pw_len;
299
300   /**
301    * main
302    */
303
304   __shared__ RC4_KEY rc4_keys[64];
305
306   m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
307 }
308
309 extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
310 {
311   /**
312    * base
313    */
314
315   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
316
317   if (gid >= gid_max) return;
318
319   u32x w0[4];
320
321   w0[0] = pws[gid].i[ 0];
322   w0[1] = pws[gid].i[ 1];
323   w0[2] = pws[gid].i[ 2];
324   w0[3] = pws[gid].i[ 3];
325
326   u32x w1[4];
327
328   w1[0] = pws[gid].i[ 4];
329   w1[1] = pws[gid].i[ 5];
330   w1[2] = pws[gid].i[ 6];
331   w1[3] = pws[gid].i[ 7];
332
333   u32x w2[4];
334
335   w2[0] = 0;
336   w2[1] = 0;
337   w2[2] = 0;
338   w2[3] = 0;
339
340   u32x w3[4];
341
342   w3[0] = 0;
343   w3[1] = 0;
344   w3[2] = 0;
345   w3[3] = 0;
346
347   const u32 pw_len = pws[gid].pw_len;
348
349   /**
350    * main
351    */
352
353   __shared__ RC4_KEY rc4_keys[64];
354
355   m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
356 }
357
358 extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
359 {
360   /**
361    * base
362    */
363
364   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
365
366   if (gid >= gid_max) return;
367
368   u32x w0[4];
369
370   w0[0] = pws[gid].i[ 0];
371   w0[1] = pws[gid].i[ 1];
372   w0[2] = pws[gid].i[ 2];
373   w0[3] = pws[gid].i[ 3];
374
375   u32x w1[4];
376
377   w1[0] = pws[gid].i[ 4];
378   w1[1] = pws[gid].i[ 5];
379   w1[2] = pws[gid].i[ 6];
380   w1[3] = pws[gid].i[ 7];
381
382   u32x w2[4];
383
384   w2[0] = pws[gid].i[ 8];
385   w2[1] = pws[gid].i[ 9];
386   w2[2] = pws[gid].i[10];
387   w2[3] = pws[gid].i[11];
388
389   u32x w3[4];
390
391   w3[0] = pws[gid].i[12];
392   w3[1] = pws[gid].i[13];
393   w3[2] = 0;
394   w3[3] = 0;
395
396   const u32 pw_len = pws[gid].pw_len;
397
398   /**
399    * main
400    */
401
402   __shared__ RC4_KEY rc4_keys[64];
403
404   m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
405 }
406
407 extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
408 {
409   /**
410    * base
411    */
412
413   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
414
415   if (gid >= gid_max) return;
416
417   u32x w0[4];
418
419   w0[0] = pws[gid].i[ 0];
420   w0[1] = pws[gid].i[ 1];
421   w0[2] = pws[gid].i[ 2];
422   w0[3] = pws[gid].i[ 3];
423
424   u32x w1[4];
425
426   w1[0] = 0;
427   w1[1] = 0;
428   w1[2] = 0;
429   w1[3] = 0;
430
431   u32x w2[4];
432
433   w2[0] = 0;
434   w2[1] = 0;
435   w2[2] = 0;
436   w2[3] = 0;
437
438   u32x w3[4];
439
440   w3[0] = 0;
441   w3[1] = 0;
442   w3[2] = 0;
443   w3[3] = 0;
444
445   const u32 pw_len = pws[gid].pw_len;
446
447   /**
448    * main
449    */
450
451   __shared__ RC4_KEY rc4_keys[64];
452
453   m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
454 }
455
456 extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
457 {
458   /**
459    * base
460    */
461
462   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
463
464   if (gid >= gid_max) return;
465
466   u32x w0[4];
467
468   w0[0] = pws[gid].i[ 0];
469   w0[1] = pws[gid].i[ 1];
470   w0[2] = pws[gid].i[ 2];
471   w0[3] = pws[gid].i[ 3];
472
473   u32x w1[4];
474
475   w1[0] = pws[gid].i[ 4];
476   w1[1] = pws[gid].i[ 5];
477   w1[2] = pws[gid].i[ 6];
478   w1[3] = pws[gid].i[ 7];
479
480   u32x w2[4];
481
482   w2[0] = 0;
483   w2[1] = 0;
484   w2[2] = 0;
485   w2[3] = 0;
486
487   u32x w3[4];
488
489   w3[0] = 0;
490   w3[1] = 0;
491   w3[2] = 0;
492   w3[3] = 0;
493
494   const u32 pw_len = pws[gid].pw_len;
495
496   /**
497    * main
498    */
499
500   __shared__ RC4_KEY rc4_keys[64];
501
502   m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
503 }
504
505 extern "C" __global__ void __launch_bounds__ (256, 1) m10410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
506 {
507   /**
508    * base
509    */
510
511   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
512
513   if (gid >= gid_max) return;
514
515   u32x w0[4];
516
517   w0[0] = pws[gid].i[ 0];
518   w0[1] = pws[gid].i[ 1];
519   w0[2] = pws[gid].i[ 2];
520   w0[3] = pws[gid].i[ 3];
521
522   u32x w1[4];
523
524   w1[0] = pws[gid].i[ 4];
525   w1[1] = pws[gid].i[ 5];
526   w1[2] = pws[gid].i[ 6];
527   w1[3] = pws[gid].i[ 7];
528
529   u32x w2[4];
530
531   w2[0] = pws[gid].i[ 8];
532   w2[1] = pws[gid].i[ 9];
533   w2[2] = pws[gid].i[10];
534   w2[3] = pws[gid].i[11];
535
536   u32x w3[4];
537
538   w3[0] = pws[gid].i[12];
539   w3[1] = pws[gid].i[13];
540   w3[2] = 0;
541   w3[3] = 0;
542
543   const u32 pw_len = pws[gid].pw_len;
544
545   /**
546    * main
547    */
548
549   __shared__ RC4_KEY rc4_keys[64];
550
551   m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
552 }