- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[hashcat.git] / OpenCL / m10100_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SIPHASH_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 0
12 #define DGST_R1 1
13 #define DGST_R2 2
14 #define DGST_R3 3
15
16 #include "include/kernel_functions.c"
17 #include "types_ocl.c"
18 #include "common.c"
19
20 #define COMPARE_S "check_single_comp4.c"
21 #define COMPARE_M "check_multi_comp4.c"
22
23 #ifdef VECT_SIZE1
24 #define SIPROUND(v0,v1,v2,v3) \
25   (v0) += (v1);               \
26   (v1)  = rotl64 ((v1), 13);  \
27   (v1) ^= (v0);               \
28   (v0)  = as_ulong (as_uint2 ((v0)).s10); \
29   (v2) += (v3);               \
30   (v3)  = rotl64 ((v3), 16);  \
31   (v3) ^= (v2);               \
32   (v0) += (v3);               \
33   (v3)  = rotl64 ((v3), 21);  \
34   (v3) ^= (v0);               \
35   (v2) += (v1);               \
36   (v1)  = rotl64 ((v1), 17);  \
37   (v1) ^= (v2);               \
38   (v2)  = as_ulong (as_uint2 ((v2)).s10);
39 #else
40 #define SIPROUND(v0,v1,v2,v3) \
41   (v0) += (v1);               \
42   (v1)  = rotl64 ((v1), 13);  \
43   (v1) ^= (v0);               \
44   (v0)  = rotl64 ((v0), 32);  \
45   (v2) += (v3);               \
46   (v3)  = rotl64 ((v3), 16);  \
47   (v3) ^= (v2);               \
48   (v0) += (v3);               \
49   (v3)  = rotl64 ((v3), 21);  \
50   (v3) ^= (v0);               \
51   (v2) += (v1);               \
52   (v1)  = rotl64 ((v1), 17);  \
53   (v1) ^= (v2);               \
54   (v2)  = rotl64 ((v2), 32);
55 #endif
56
57 static void m10100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
58 {
59   /**
60    * modifier
61    */
62
63   const u32 gid = get_global_id (0);
64   const u32 lid = get_local_id (0);
65
66   /**
67    * base
68    */
69
70   u64 v0p = SIPHASHM_0;
71   u64 v1p = SIPHASHM_1;
72   u64 v2p = SIPHASHM_2;
73   u64 v3p = SIPHASHM_3;
74
75   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
76   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
77   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
78   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
79
80   u64 *w_ptr = (u64 *) w;
81
82   w_ptr[pw_len / 8] |= (u64) pw_len << 56;
83
84   /**
85    * loop
86    */
87
88   u32 w0l = w[0];
89
90   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
91   {
92     const u32 w0r = words_buf_r[il_pos];
93
94     const u32 w0 = w0l | w0r;
95
96     u64 v0 = v0p;
97     u64 v1 = v1p;
98     u64 v2 = v2p;
99     u64 v3 = v3p;
100
101     u64 m = hl32_to_64 (w[1], w0);
102
103     v3 ^= m;
104
105     SIPROUND (v0, v1, v2, v3);
106     SIPROUND (v0, v1, v2, v3);
107
108     v0 ^= m;
109
110     int i;
111     int j;
112
113     for (i = 8, j = 2; i <= pw_len; i += 8, j += 2)
114     {
115       m = hl32_to_64 (w[j + 1], w[j + 0]);
116
117       v3 ^= m;
118
119       SIPROUND (v0, v1, v2, v3);
120       SIPROUND (v0, v1, v2, v3);
121
122       v0 ^= m;
123     }
124
125     v2 ^= 0xff;
126
127     SIPROUND (v0, v1, v2, v3);
128     SIPROUND (v0, v1, v2, v3);
129     SIPROUND (v0, v1, v2, v3);
130     SIPROUND (v0, v1, v2, v3);
131
132     const u64 v = v0 ^ v1 ^ v2 ^ v3;
133
134     const u32 a = l32_from_64 (v);
135     const u32 b = h32_from_64 (v);
136
137     const u32 r0 = a;
138     const u32 r1 = b;
139     const u32 r2 = 0;
140     const u32 r3 = 0;
141
142     #include COMPARE_M
143   }
144 }
145
146 static void m10100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
147 {
148   /**
149    * modifier
150    */
151
152   const u32 gid = get_global_id (0);
153   const u32 lid = get_local_id (0);
154
155   /**
156    * digest
157    */
158
159   const u32 search[4] =
160   {
161     digests_buf[digests_offset].digest_buf[DGST_R0],
162     digests_buf[digests_offset].digest_buf[DGST_R1],
163     digests_buf[digests_offset].digest_buf[DGST_R2],
164     digests_buf[digests_offset].digest_buf[DGST_R3]
165   };
166
167   /**
168    * base
169    */
170
171   u64 v0p = SIPHASHM_0;
172   u64 v1p = SIPHASHM_1;
173   u64 v2p = SIPHASHM_2;
174   u64 v3p = SIPHASHM_3;
175
176   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
177   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
178   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
179   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
180
181   u64 *w_ptr = (u64 *) w;
182
183   w_ptr[pw_len / 8] |= (u64) pw_len << 56;
184
185   /**
186    * loop
187    */
188
189   u32 w0l = w[0];
190
191   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
192   {
193     const u32 w0r = words_buf_r[il_pos];
194
195     const u32 w0 = w0l | w0r;
196
197     u64 v0 = v0p;
198     u64 v1 = v1p;
199     u64 v2 = v2p;
200     u64 v3 = v3p;
201
202     u64 m = hl32_to_64 (w[1], w0);
203
204     v3 ^= m;
205
206     SIPROUND (v0, v1, v2, v3);
207     SIPROUND (v0, v1, v2, v3);
208
209     v0 ^= m;
210
211     int i;
212     int j;
213
214     for (i = 8, j = 2; i <= pw_len; i += 8, j += 2)
215     {
216       m = hl32_to_64 (w[j + 1], w[j + 0]);
217
218       v3 ^= m;
219
220       SIPROUND (v0, v1, v2, v3);
221       SIPROUND (v0, v1, v2, v3);
222
223       v0 ^= m;
224     }
225
226     v2 ^= 0xff;
227
228     SIPROUND (v0, v1, v2, v3);
229     SIPROUND (v0, v1, v2, v3);
230     SIPROUND (v0, v1, v2, v3);
231     SIPROUND (v0, v1, v2, v3);
232
233     const u64 v = v0 ^ v1 ^ v2 ^ v3;
234
235     const u32 a = l32_from_64 (v);
236     const u32 b = h32_from_64 (v);
237
238     const u32 r0 = a;
239     const u32 r1 = b;
240     const u32 r2 = 0;
241     const u32 r3 = 0;
242
243     #include COMPARE_S
244   }
245 }
246
247 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
248 {
249   /**
250    * base
251    */
252
253   const u32 gid = get_global_id (0);
254
255   if (gid >= gid_max) return;
256
257   u32 w[16];
258
259   w[ 0] = pws[gid].i[ 0];
260   w[ 1] = pws[gid].i[ 1];
261   w[ 2] = pws[gid].i[ 2];
262   w[ 3] = pws[gid].i[ 3];
263   w[ 4] = 0;
264   w[ 5] = 0;
265   w[ 6] = 0;
266   w[ 7] = 0;
267   w[ 8] = 0;
268   w[ 9] = 0;
269   w[10] = 0;
270   w[11] = 0;
271   w[12] = 0;
272   w[13] = 0;
273   w[14] = pws[gid].i[14];
274   w[15] = 0;
275
276   const u32 pw_len = pws[gid].pw_len;
277
278   /**
279    * main
280    */
281
282   m10100m (w, 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, esalt_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);
283 }
284
285 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
286 {
287   /**
288    * base
289    */
290
291   const u32 gid = get_global_id (0);
292
293   if (gid >= gid_max) return;
294
295   u32 w[16];
296
297   w[ 0] = pws[gid].i[ 0];
298   w[ 1] = pws[gid].i[ 1];
299   w[ 2] = pws[gid].i[ 2];
300   w[ 3] = pws[gid].i[ 3];
301   w[ 4] = pws[gid].i[ 4];
302   w[ 5] = pws[gid].i[ 5];
303   w[ 6] = pws[gid].i[ 6];
304   w[ 7] = pws[gid].i[ 7];
305   w[ 8] = 0;
306   w[ 9] = 0;
307   w[10] = 0;
308   w[11] = 0;
309   w[12] = 0;
310   w[13] = 0;
311   w[14] = pws[gid].i[14];
312   w[15] = 0;
313
314   const u32 pw_len = pws[gid].pw_len;
315
316   /**
317    * main
318    */
319
320   m10100m (w, 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, esalt_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);
321 }
322
323 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
324 {
325   /**
326    * base
327    */
328
329   const u32 gid = get_global_id (0);
330
331   if (gid >= gid_max) return;
332
333   u32 w[16];
334
335   w[ 0] = pws[gid].i[ 0];
336   w[ 1] = pws[gid].i[ 1];
337   w[ 2] = pws[gid].i[ 2];
338   w[ 3] = pws[gid].i[ 3];
339   w[ 4] = pws[gid].i[ 4];
340   w[ 5] = pws[gid].i[ 5];
341   w[ 6] = pws[gid].i[ 6];
342   w[ 7] = pws[gid].i[ 7];
343   w[ 8] = pws[gid].i[ 8];
344   w[ 9] = pws[gid].i[ 9];
345   w[10] = pws[gid].i[10];
346   w[11] = pws[gid].i[11];
347   w[12] = pws[gid].i[12];
348   w[13] = pws[gid].i[13];
349   w[14] = pws[gid].i[14];
350   w[15] = pws[gid].i[15];
351
352   const u32 pw_len = pws[gid].pw_len;
353
354   /**
355    * main
356    */
357
358   m10100m (w, 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, esalt_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);
359 }
360
361 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
362 {
363   /**
364    * base
365    */
366
367   const u32 gid = get_global_id (0);
368
369   if (gid >= gid_max) return;
370
371   u32 w[16];
372
373   w[ 0] = pws[gid].i[ 0];
374   w[ 1] = pws[gid].i[ 1];
375   w[ 2] = pws[gid].i[ 2];
376   w[ 3] = pws[gid].i[ 3];
377   w[ 4] = 0;
378   w[ 5] = 0;
379   w[ 6] = 0;
380   w[ 7] = 0;
381   w[ 8] = 0;
382   w[ 9] = 0;
383   w[10] = 0;
384   w[11] = 0;
385   w[12] = 0;
386   w[13] = 0;
387   w[14] = pws[gid].i[14];
388   w[15] = 0;
389
390   const u32 pw_len = pws[gid].pw_len;
391
392   /**
393    * main
394    */
395
396   m10100s (w, 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, esalt_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);
397 }
398
399 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
400 {
401   /**
402    * base
403    */
404
405   const u32 gid = get_global_id (0);
406
407   if (gid >= gid_max) return;
408
409   u32 w[16];
410
411   w[ 0] = pws[gid].i[ 0];
412   w[ 1] = pws[gid].i[ 1];
413   w[ 2] = pws[gid].i[ 2];
414   w[ 3] = pws[gid].i[ 3];
415   w[ 4] = pws[gid].i[ 4];
416   w[ 5] = pws[gid].i[ 5];
417   w[ 6] = pws[gid].i[ 6];
418   w[ 7] = pws[gid].i[ 7];
419   w[ 8] = 0;
420   w[ 9] = 0;
421   w[10] = 0;
422   w[11] = 0;
423   w[12] = 0;
424   w[13] = 0;
425   w[14] = pws[gid].i[14];
426   w[15] = 0;
427
428   const u32 pw_len = pws[gid].pw_len;
429
430   /**
431    * main
432    */
433
434   m10100s (w, 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, esalt_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);
435 }
436
437 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global 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)
438 {
439   /**
440    * base
441    */
442
443   const u32 gid = get_global_id (0);
444
445   if (gid >= gid_max) return;
446
447   u32 w[16];
448
449   w[ 0] = pws[gid].i[ 0];
450   w[ 1] = pws[gid].i[ 1];
451   w[ 2] = pws[gid].i[ 2];
452   w[ 3] = pws[gid].i[ 3];
453   w[ 4] = pws[gid].i[ 4];
454   w[ 5] = pws[gid].i[ 5];
455   w[ 6] = pws[gid].i[ 6];
456   w[ 7] = pws[gid].i[ 7];
457   w[ 8] = pws[gid].i[ 8];
458   w[ 9] = pws[gid].i[ 9];
459   w[10] = pws[gid].i[10];
460   w[11] = pws[gid].i[11];
461   w[12] = pws[gid].i[12];
462   w[13] = pws[gid].i[13];
463   w[14] = pws[gid].i[14];
464   w[15] = pws[gid].i[15];
465
466   const u32 pw_len = pws[gid].pw_len;
467
468   /**
469    * main
470    */
471
472   m10100s (w, 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, esalt_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);
473 }