1/**
2 * Author......: See docs/credits.txt
3 * License.....: MIT
4 */
5
6#define NEW_SIMD_CODE
7
8#ifdef KERNEL_STATIC
9#include "inc_vendor.h"
10#include "inc_types.h"
11#include "inc_platform.cl"
12#include "inc_common.cl"
13#include "inc_simd.cl"
14#include "inc_hash_sha256.cl"
15#endif
16
17DECLSPEC void sha256_transform_m (u32x *digest, const u32x *w)
18{
19  u32x a = digest[0];
20  u32x b = digest[1];
21  u32x c = digest[2];
22  u32x d = digest[3];
23  u32x e = digest[4];
24  u32x f = digest[5];
25  u32x g = digest[6];
26  u32x h = digest[7];
27
28  u32x w0_t = w[ 0];
29  u32x w1_t = w[ 1];
30  u32x w2_t = w[ 2];
31  u32x w3_t = w[ 3];
32  u32x w4_t = w[ 4];
33  u32x w5_t = w[ 5];
34  u32x w6_t = w[ 6];
35  u32x w7_t = w[ 7];
36  u32x w8_t = w[ 8];
37  u32x w9_t = w[ 9];
38  u32x wa_t = w[10];
39  u32x wb_t = w[11];
40  u32x wc_t = w[12];
41  u32x wd_t = w[13];
42  u32x we_t = w[14];
43  u32x wf_t = w[15];
44
45  #define ROUND_EXPAND()                            \
46  {                                                 \
47    w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t);  \
48    w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t);  \
49    w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t);  \
50    w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t);  \
51    w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t);  \
52    w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t);  \
53    w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t);  \
54    w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t);  \
55    w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t);  \
56    w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t);  \
57    wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t);  \
58    wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t);  \
59    wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t);  \
60    wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t);  \
61    we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t);  \
62    wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t);  \
63  }
64
65  #define ROUND_STEP(i)                                                                   \
66  {                                                                                       \
67    SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i +  0]); \
68    SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i +  1]); \
69    SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i +  2]); \
70    SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i +  3]); \
71    SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i +  4]); \
72    SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i +  5]); \
73    SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i +  6]); \
74    SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i +  7]); \
75    SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i +  8]); \
76    SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i +  9]); \
77    SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \
78    SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \
79    SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \
80    SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \
81    SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \
82    SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \
83  }
84
85  ROUND_STEP (0);
86
87  #if defined IS_CUDA
88  ROUND_EXPAND (); ROUND_STEP (16);
89  ROUND_EXPAND (); ROUND_STEP (32);
90  ROUND_EXPAND (); ROUND_STEP (48);
91  #else
92  #ifdef _unroll
93  #pragma unroll
94  #endif
95  for (int i = 16; i < 64; i += 16)
96  {
97    ROUND_EXPAND (); ROUND_STEP (i);
98  }
99  #endif
100
101  digest[0] += a;
102  digest[1] += b;
103  digest[2] += c;
104  digest[3] += d;
105  digest[4] += e;
106  digest[5] += f;
107  digest[6] += g;
108  digest[7] += h;
109}
110
111DECLSPEC void sha256_transform_z (u32x *digest)
112{
113  u32x a = digest[0];
114  u32x b = digest[1];
115  u32x c = digest[2];
116  u32x d = digest[3];
117  u32x e = digest[4];
118  u32x f = digest[5];
119  u32x g = digest[6];
120  u32x h = digest[7];
121
122  #define ROUND_STEP_Z(i)                                                                 \
123  {                                                                                       \
124    SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i +  0]); \
125    SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i +  1]); \
126    SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i +  2]); \
127    SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i +  3]); \
128    SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i +  4]); \
129    SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i +  5]); \
130    SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i +  6]); \
131    SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i +  7]); \
132    SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, 0, k_sha256[i +  8]); \
133    SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, 0, k_sha256[i +  9]); \
134    SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, 0, k_sha256[i + 10]); \
135    SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, 0, k_sha256[i + 11]); \
136    SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, 0, k_sha256[i + 12]); \
137    SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, 0, k_sha256[i + 13]); \
138    SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, 0, k_sha256[i + 14]); \
139    SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, 0, k_sha256[i + 15]); \
140  }
141
142  ROUND_STEP_Z (0);
143
144  #if defined IS_CUDA
145  ROUND_STEP_Z (16);
146  ROUND_STEP_Z (32);
147  ROUND_STEP_Z (48);
148  #else
149  #ifdef _unroll
150  #pragma unroll
151  #endif
152  for (int i = 16; i < 64; i += 16)
153  {
154    ROUND_STEP_Z (i);
155  }
156  #endif
157
158  digest[0] += a;
159  digest[1] += b;
160  digest[2] += c;
161  digest[3] += d;
162  digest[4] += e;
163  digest[5] += f;
164  digest[6] += g;
165  digest[7] += h;
166}
167
168DECLSPEC void sha256_transform_s (u32x *digest, LOCAL_AS u32 *w)
169{
170  u32x a = digest[0];
171  u32x b = digest[1];
172  u32x c = digest[2];
173  u32x d = digest[3];
174  u32x e = digest[4];
175  u32x f = digest[5];
176  u32x g = digest[6];
177  u32x h = digest[7];
178
179  #define ROUND_STEP_S(i)                                                                      \
180  {                                                                                            \
181    SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i +  0], k_sha256[i +  0]); \
182    SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i +  1], k_sha256[i +  1]); \
183    SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i +  2], k_sha256[i +  2]); \
184    SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i +  3], k_sha256[i +  3]); \
185    SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i +  4], k_sha256[i +  4]); \
186    SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i +  5], k_sha256[i +  5]); \
187    SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i +  6], k_sha256[i +  6]); \
188    SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i +  7], k_sha256[i +  7]); \
189    SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w[i +  8], k_sha256[i +  8]); \
190    SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w[i +  9], k_sha256[i +  9]); \
191    SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w[i + 10], k_sha256[i + 10]); \
192    SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w[i + 11], k_sha256[i + 11]); \
193    SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w[i + 12], k_sha256[i + 12]); \
194    SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w[i + 13], k_sha256[i + 13]); \
195    SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w[i + 14], k_sha256[i + 14]); \
196    SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w[i + 15], k_sha256[i + 15]); \
197  }
198
199  ROUND_STEP_S (0);
200
201  #ifdef _unroll
202  #pragma unroll
203  #endif
204  for (int i = 16; i < 64; i += 16)
205  {
206    ROUND_STEP_S (i);
207  }
208
209  digest[0] += a;
210  digest[1] += b;
211  digest[2] += c;
212  digest[3] += d;
213  digest[4] += e;
214  digest[5] += f;
215  digest[6] += g;
216  digest[7] += h;
217}
218
219DECLSPEC void m08000m (LOCAL_AS u32 *w_s1, LOCAL_AS u32 *w_s2, u32 *w, const u32 pw_len, KERN_ATTR_VECTOR ())
220{
221  /**
222   * modifier
223   */
224
225  const u64 gid = get_global_id (0);
226  const u64 lid = get_local_id (0);
227  const u64 lsz = get_local_size (0);
228
229  /**
230   * salt
231   */
232
233  const u32 salt_buf0 = hc_swap32_S (salt_bufs[SALT_POS].salt_buf[ 0]);
234  const u32 salt_buf1 = hc_swap32_S (salt_bufs[SALT_POS].salt_buf[ 1]);
235  const u32 salt_buf2 = hc_swap32_S (salt_bufs[SALT_POS].salt_buf[ 2]); // 0x80
236
237  /**
238   * precompute final msg blocks
239   */
240
241  for (u32 i = lid; i < 64; i += lsz)
242  {
243    w_s1[i] = 0;
244    w_s2[i] = 0;
245  }
246
247  SYNC_THREADS ();
248
249  if (lid == 0)
250  {
251    w_s1[15] =               0 | salt_buf0 >> 16;
252
253    #ifdef _unroll
254    #pragma unroll
255    #endif
256    for (int i = 16; i < 64; i++)
257    {
258      w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]);
259    }
260
261    w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16;
262    w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16;
263    w_s2[ 2] = salt_buf2 << 16 | 0;
264    w_s2[15] = (510 + 8) * 8;
265
266    #ifdef _unroll
267    #pragma unroll
268    #endif
269    for (int i = 16; i < 64; i++)
270    {
271      w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]);
272    }
273  }
274
275  SYNC_THREADS ();
276
277  if (gid >= gid_max) return;
278
279  /**
280   * modifier
281   */
282
283  u32x w_t[16];
284
285  w_t[ 0] = w[ 0] >> 8;
286  w_t[ 1] = w[ 1] >> 8;
287  w_t[ 2] = w[ 2] >> 8;
288  w_t[ 3] = w[ 3] >> 8;
289  w_t[ 4] = w[ 4] >> 8;
290  w_t[ 5] = w[ 5] >> 8;
291  w_t[ 6] = w[ 6] >> 8;
292  w_t[ 7] = w[ 7] >> 8;
293  w_t[ 8] = w[ 8] >> 8;
294  w_t[ 9] = w[ 9] >> 8;
295  w_t[10] = w[10] >> 8;
296  w_t[11] = w[11] >> 8;
297  w_t[12] = w[12] >> 8;
298  w_t[13] = w[13] >> 8;
299  w_t[14] = w[14] >> 8;
300  w_t[15] = w[15] >> 8;
301
302  /**
303   * loop
304   */
305
306  u32 w0l = w[0];
307
308  for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
309  {
310    const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
311
312    const u32x w0lr = w0l | w0r;
313
314    w_t[0] = w0lr >> 8;
315
316    u32x digest[8];
317
318    digest[0] = SHA256M_A;
319    digest[1] = SHA256M_B;
320    digest[2] = SHA256M_C;
321    digest[3] = SHA256M_D;
322    digest[4] = SHA256M_E;
323    digest[5] = SHA256M_F;
324    digest[6] = SHA256M_G;
325    digest[7] = SHA256M_H;
326
327    sha256_transform_m   (digest, w_t);   //   0 -  64
328    sha256_transform_z (digest);        //  64 - 128
329    sha256_transform_z (digest);        // 128 - 192
330    sha256_transform_z (digest);        // 192 - 256
331    sha256_transform_z (digest);        // 256 - 320
332    sha256_transform_z (digest);        // 320 - 384
333    sha256_transform_z (digest);        // 384 - 448
334    sha256_transform_s (digest, w_s1);  // 448 - 512
335    sha256_transform_s (digest, w_s2);  // 512 - 576
336
337    COMPARE_M_SIMD (digest[3], digest[7], digest[2], digest[6]);
338  }
339}
340
341DECLSPEC void m08000s (LOCAL_AS u32 *w_s1, LOCAL_AS u32 *w_s2, u32 *w, const u32 pw_len, KERN_ATTR_VECTOR ())
342{
343  /**
344   * modifier
345   */
346
347  const u64 gid = get_global_id (0);
348  const u64 lid = get_local_id (0);
349  const u64 lsz = get_local_size (0);
350
351  /**
352   * salt
353   */
354
355  const u32 salt_buf0 = hc_swap32_S (salt_bufs[SALT_POS].salt_buf[ 0]);
356  const u32 salt_buf1 = hc_swap32_S (salt_bufs[SALT_POS].salt_buf[ 1]);
357  const u32 salt_buf2 = hc_swap32_S (salt_bufs[SALT_POS].salt_buf[ 2]); // 0x80
358
359  /**
360   * precompute final msg blocks
361   */
362
363  for (u32 i = lid; i < 64; i += lsz)
364  {
365    w_s1[i] = 0;
366    w_s2[i] = 0;
367  }
368
369  SYNC_THREADS ();
370
371  if (lid == 0)
372  {
373    w_s1[15] =               0 | salt_buf0 >> 16;
374
375    #ifdef _unroll
376    #pragma unroll
377    #endif
378    for (int i = 16; i < 64; i++)
379    {
380      w_s1[i] = SHA256_EXPAND_S (w_s1[i - 2], w_s1[i - 7], w_s1[i - 15], w_s1[i - 16]);
381    }
382
383    w_s2[ 0] = salt_buf0 << 16 | salt_buf1 >> 16;
384    w_s2[ 1] = salt_buf1 << 16 | salt_buf2 >> 16;
385    w_s2[ 2] = salt_buf2 << 16 | 0;
386    w_s2[15] = (510 + 8) * 8;
387
388    #ifdef _unroll
389    #pragma unroll
390    #endif
391    for (int i = 16; i < 64; i++)
392    {
393      w_s2[i] = SHA256_EXPAND_S (w_s2[i - 2], w_s2[i - 7], w_s2[i - 15], w_s2[i - 16]);
394    }
395  }
396
397  SYNC_THREADS ();
398
399  if (gid >= gid_max) return;
400
401  /**
402   * modifier
403   */
404
405  u32x w_t[16];
406
407  w_t[ 0] = w[ 0] >> 8;
408  w_t[ 1] = w[ 1] >> 8;
409  w_t[ 2] = w[ 2] >> 8;
410  w_t[ 3] = w[ 3] >> 8;
411  w_t[ 4] = w[ 4] >> 8;
412  w_t[ 5] = w[ 5] >> 8;
413  w_t[ 6] = w[ 6] >> 8;
414  w_t[ 7] = w[ 7] >> 8;
415  w_t[ 8] = w[ 8] >> 8;
416  w_t[ 9] = w[ 9] >> 8;
417  w_t[10] = w[10] >> 8;
418  w_t[11] = w[11] >> 8;
419  w_t[12] = w[12] >> 8;
420  w_t[13] = w[13] >> 8;
421  w_t[14] = w[14] >> 8;
422  w_t[15] = w[15] >> 8;
423
424  /**
425   * digest
426   */
427
428  const u32 search[4] =
429  {
430    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
431    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
432    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
433    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
434  };
435
436  /**
437   * loop
438   */
439
440  u32 w0l = w[0];
441
442  for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
443  {
444    const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
445
446    const u32x w0lr = w0l | w0r;
447
448    w_t[0] = w0lr >> 8;
449
450    u32x digest[8];
451
452    digest[0] = SHA256M_A;
453    digest[1] = SHA256M_B;
454    digest[2] = SHA256M_C;
455    digest[3] = SHA256M_D;
456    digest[4] = SHA256M_E;
457    digest[5] = SHA256M_F;
458    digest[6] = SHA256M_G;
459    digest[7] = SHA256M_H;
460
461    sha256_transform_m   (digest, w_t);   //   0 -  64
462    sha256_transform_z (digest);        //  64 - 128
463    sha256_transform_z (digest);        // 128 - 192
464    sha256_transform_z (digest);        // 192 - 256
465    sha256_transform_z (digest);        // 256 - 320
466    sha256_transform_z (digest);        // 320 - 384
467    sha256_transform_z (digest);        // 384 - 448
468    sha256_transform_s (digest, w_s1);  // 448 - 512
469    sha256_transform_s (digest, w_s2);  // 512 - 576
470
471    COMPARE_S_SIMD (digest[3], digest[7], digest[2], digest[6]);
472  }
473}
474
475KERNEL_FQ void m08000_m04 (KERN_ATTR_VECTOR ())
476{
477  /**
478   * base
479   */
480
481  const u64 gid = get_global_id (0);
482
483  u32 w[16];
484
485  w[ 0] = pws[gid].i[ 0];
486  w[ 1] = pws[gid].i[ 1];
487  w[ 2] = pws[gid].i[ 2];
488  w[ 3] = pws[gid].i[ 3];
489  w[ 4] = 0;
490  w[ 5] = 0;
491  w[ 6] = 0;
492  w[ 7] = 0;
493  w[ 8] = 0;
494  w[ 9] = 0;
495  w[10] = 0;
496  w[11] = 0;
497  w[12] = 0;
498  w[13] = 0;
499  w[14] = 0;
500  w[15] = 0;
501
502  const u32 pw_len = pws[gid].pw_len & 63;
503
504  LOCAL_VK u32 w_s1[64];
505  LOCAL_VK u32 w_s2[64];
506
507  /**
508   * main
509   */
510
511  m08000m (w_s1, w_s2, 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_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
512}
513
514KERNEL_FQ void m08000_m08 (KERN_ATTR_VECTOR ())
515{
516  /**
517   * base
518   */
519
520  const u64 gid = get_global_id (0);
521
522  u32 w[16];
523
524  w[ 0] = pws[gid].i[ 0];
525  w[ 1] = pws[gid].i[ 1];
526  w[ 2] = pws[gid].i[ 2];
527  w[ 3] = pws[gid].i[ 3];
528  w[ 4] = pws[gid].i[ 4];
529  w[ 5] = pws[gid].i[ 5];
530  w[ 6] = pws[gid].i[ 6];
531  w[ 7] = pws[gid].i[ 7];
532  w[ 8] = 0;
533  w[ 9] = 0;
534  w[10] = 0;
535  w[11] = 0;
536  w[12] = 0;
537  w[13] = 0;
538  w[14] = 0;
539  w[15] = 0;
540
541  const u32 pw_len = pws[gid].pw_len & 63;
542
543  LOCAL_VK u32 w_s1[64];
544  LOCAL_VK u32 w_s2[64];
545
546  /**
547   * main
548   */
549
550  m08000m (w_s1, w_s2, 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_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
551}
552
553KERNEL_FQ void m08000_m16 (KERN_ATTR_VECTOR ())
554{
555  /**
556   * base
557   */
558
559  const u64 gid = get_global_id (0);
560
561  u32 w[16];
562
563  w[ 0] = pws[gid].i[ 0];
564  w[ 1] = pws[gid].i[ 1];
565  w[ 2] = pws[gid].i[ 2];
566  w[ 3] = pws[gid].i[ 3];
567  w[ 4] = pws[gid].i[ 4];
568  w[ 5] = pws[gid].i[ 5];
569  w[ 6] = pws[gid].i[ 6];
570  w[ 7] = pws[gid].i[ 7];
571  w[ 8] = pws[gid].i[ 8];
572  w[ 9] = pws[gid].i[ 9];
573  w[10] = pws[gid].i[10];
574  w[11] = pws[gid].i[11];
575  w[12] = pws[gid].i[12];
576  w[13] = pws[gid].i[13];
577  w[14] = pws[gid].i[14];
578  w[15] = pws[gid].i[15];
579
580  const u32 pw_len = pws[gid].pw_len & 63;
581
582  LOCAL_VK u32 w_s1[64];
583  LOCAL_VK u32 w_s2[64];
584
585  /**
586   * main
587   */
588
589  m08000m (w_s1, w_s2, 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_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
590}
591
592KERNEL_FQ void m08000_s04 (KERN_ATTR_VECTOR ())
593{
594  /**
595   * base
596   */
597
598  const u64 gid = get_global_id (0);
599
600  u32 w[16];
601
602  w[ 0] = pws[gid].i[ 0];
603  w[ 1] = pws[gid].i[ 1];
604  w[ 2] = pws[gid].i[ 2];
605  w[ 3] = pws[gid].i[ 3];
606  w[ 4] = 0;
607  w[ 5] = 0;
608  w[ 6] = 0;
609  w[ 7] = 0;
610  w[ 8] = 0;
611  w[ 9] = 0;
612  w[10] = 0;
613  w[11] = 0;
614  w[12] = 0;
615  w[13] = 0;
616  w[14] = 0;
617  w[15] = 0;
618
619  const u32 pw_len = pws[gid].pw_len & 63;
620
621  LOCAL_VK u32 w_s1[64];
622  LOCAL_VK u32 w_s2[64];
623
624  /**
625   * main
626   */
627
628  m08000s (w_s1, w_s2, 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_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
629}
630
631KERNEL_FQ void m08000_s08 (KERN_ATTR_VECTOR ())
632{
633  /**
634   * base
635   */
636
637  const u64 gid = get_global_id (0);
638
639  u32 w[16];
640
641  w[ 0] = pws[gid].i[ 0];
642  w[ 1] = pws[gid].i[ 1];
643  w[ 2] = pws[gid].i[ 2];
644  w[ 3] = pws[gid].i[ 3];
645  w[ 4] = pws[gid].i[ 4];
646  w[ 5] = pws[gid].i[ 5];
647  w[ 6] = pws[gid].i[ 6];
648  w[ 7] = pws[gid].i[ 7];
649  w[ 8] = 0;
650  w[ 9] = 0;
651  w[10] = 0;
652  w[11] = 0;
653  w[12] = 0;
654  w[13] = 0;
655  w[14] = 0;
656  w[15] = 0;
657
658  const u32 pw_len = pws[gid].pw_len & 63;
659
660  LOCAL_VK u32 w_s1[64];
661  LOCAL_VK u32 w_s2[64];
662
663  /**
664   * main
665   */
666
667  m08000s (w_s1, w_s2, 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_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
668}
669
670KERNEL_FQ void m08000_s16 (KERN_ATTR_VECTOR ())
671{
672  /**
673   * base
674   */
675
676  const u64 gid = get_global_id (0);
677
678  u32 w[16];
679
680  w[ 0] = pws[gid].i[ 0];
681  w[ 1] = pws[gid].i[ 1];
682  w[ 2] = pws[gid].i[ 2];
683  w[ 3] = pws[gid].i[ 3];
684  w[ 4] = pws[gid].i[ 4];
685  w[ 5] = pws[gid].i[ 5];
686  w[ 6] = pws[gid].i[ 6];
687  w[ 7] = pws[gid].i[ 7];
688  w[ 8] = pws[gid].i[ 8];
689  w[ 9] = pws[gid].i[ 9];
690  w[10] = pws[gid].i[10];
691  w[11] = pws[gid].i[11];
692  w[12] = pws[gid].i[12];
693  w[13] = pws[gid].i[13];
694  w[14] = pws[gid].i[14];
695  w[15] = pws[gid].i[15];
696
697  const u32 pw_len = pws[gid].pw_len & 63;
698
699  LOCAL_VK u32 w_s1[64];
700  LOCAL_VK u32 w_s2[64];
701
702  /**
703   * main
704   */
705
706  m08000s (w_s1, w_s2, 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_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
707}
708