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