Initial commit
[hashcat.git] / amd / m08000_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA256_
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  VLIW4
16 #define VECT_SIZE2
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE2
21 #endif
22
23 #define DGST_R0 3
24 #define DGST_R1 7
25 #define DGST_R2 2
26 #define DGST_R3 6
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31 #include "include/rp_gpu.h"
32 #include "rp_amd.c"
33
34 #ifdef  VECT_SIZE1
35 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
36 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
37 #endif
38
39 #ifdef  VECT_SIZE2
40 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
41 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
42 #endif
43
44 #ifdef  VECT_SIZE4
45 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
46 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
47 #endif
48
49 __constant u32 k_sha256[64] =
50 {
51   SHA256C00, SHA256C01, SHA256C02, SHA256C03,
52   SHA256C04, SHA256C05, SHA256C06, SHA256C07,
53   SHA256C08, SHA256C09, SHA256C0a, SHA256C0b,
54   SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f,
55   SHA256C10, SHA256C11, SHA256C12, SHA256C13,
56   SHA256C14, SHA256C15, SHA256C16, SHA256C17,
57   SHA256C18, SHA256C19, SHA256C1a, SHA256C1b,
58   SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f,
59   SHA256C20, SHA256C21, SHA256C22, SHA256C23,
60   SHA256C24, SHA256C25, SHA256C26, SHA256C27,
61   SHA256C28, SHA256C29, SHA256C2a, SHA256C2b,
62   SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f,
63   SHA256C30, SHA256C31, SHA256C32, SHA256C33,
64   SHA256C34, SHA256C35, SHA256C36, SHA256C37,
65   SHA256C38, SHA256C39, SHA256C3a, SHA256C3b,
66   SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f,
67 };
68
69 static void sha256_transform (u32x digest[8], const u32x w[16])
70 {
71   u32x a = digest[0];
72   u32x b = digest[1];
73   u32x c = digest[2];
74   u32x d = digest[3];
75   u32x e = digest[4];
76   u32x f = digest[5];
77   u32x g = digest[6];
78   u32x h = digest[7];
79
80   u32x w0_t = w[ 0];
81   u32x w1_t = w[ 1];
82   u32x w2_t = w[ 2];
83   u32x w3_t = w[ 3];
84   u32x w4_t = w[ 4];
85   u32x w5_t = w[ 5];
86   u32x w6_t = w[ 6];
87   u32x w7_t = w[ 7];
88   u32x w8_t = w[ 8];
89   u32x w9_t = w[ 9];
90   u32x wa_t = w[10];
91   u32x wb_t = w[11];
92   u32x wc_t = w[12];
93   u32x wd_t = w[13];
94   u32x we_t = w[14];
95   u32x wf_t = w[15];
96
97   #define ROUND_EXPAND()                            \
98   {                                                 \
99     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t);  \
100     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t);  \
101     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t);  \
102     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t);  \
103     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t);  \
104     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t);  \
105     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t);  \
106     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t);  \
107     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t);  \
108     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t);  \
109     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t);  \
110     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t);  \
111     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t);  \
112     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t);  \
113     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t);  \
114     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t);  \
115   }
116
117   #define ROUND_STEP(i)                                                                   \
118   {                                                                                       \
119     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i +  0]); \
120     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i +  1]); \
121     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i +  2]); \
122     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i +  3]); \
123     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i +  4]); \
124     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i +  5]); \
125     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i +  6]); \
126     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i +  7]); \
127     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i +  8]); \
128     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i +  9]); \
129     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \
130     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \
131     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \
132     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \
133     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \
134     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \
135   }
136
137   ROUND_STEP (0);
138
139   #pragma unroll
140   for (int i = 16; i < 64; i += 16)
141   {
142     ROUND_EXPAND (); ROUND_STEP (i);
143   }
144
145   digest[0] += a;
146   digest[1] += b;
147   digest[2] += c;
148   digest[3] += d;
149   digest[4] += e;
150   digest[5] += f;
151   digest[6] += g;
152   digest[7] += h;
153 }
154
155 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
156 {
157   /**
158    * modifier
159    */
160
161   const u32 lid = get_local_id (0);
162
163   /**
164    * base
165    */
166
167   const u32 gid = get_global_id (0);
168
169   if (gid >= gid_max) return;
170
171   u32x pw_buf0[4];
172
173   pw_buf0[0] = pws[gid].i[ 0];
174   pw_buf0[1] = pws[gid].i[ 1];
175   pw_buf0[2] = pws[gid].i[ 2];
176   pw_buf0[3] = pws[gid].i[ 3];
177
178   u32x pw_buf1[4];
179
180   pw_buf1[0] = pws[gid].i[ 4];
181   pw_buf1[1] = pws[gid].i[ 5];
182   pw_buf1[2] = pws[gid].i[ 6];
183   pw_buf1[3] = pws[gid].i[ 7];
184
185   const u32 pw_len = pws[gid].pw_len;
186
187   /**
188    * salt
189    */
190
191   const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]);
192   const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]);
193   const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80
194
195   /**
196    * loop
197    */
198
199   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
200   {
201     u32x w0[4];
202     u32x w1[4];
203     u32x w2[4];
204     u32x w3[4];
205
206     w0[0] = pw_buf0[0];
207     w0[1] = pw_buf0[1];
208     w0[2] = pw_buf0[2];
209     w0[3] = pw_buf0[3];
210     w1[0] = pw_buf1[0];
211     w1[1] = pw_buf1[1];
212     w1[2] = pw_buf1[2];
213     w1[3] = pw_buf1[3];
214     w2[0] = 0;
215     w2[1] = 0;
216     w2[2] = 0;
217     w2[3] = 0;
218     w3[0] = 0;
219     w3[1] = 0;
220     w3[2] = 0;
221     w3[3] = 0;
222
223     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
224
225     u32x w0_t[4];
226     u32x w1_t[4];
227     u32x w2_t[4];
228     u32x w3_t[4];
229
230     make_unicode (w0, w0_t, w1_t);
231
232     make_unicode (w1, w2_t, w3_t);
233
234     u32x w_t[16];
235
236     w_t[ 0] = swap_workaround (w0_t[0]);
237     w_t[ 1] = swap_workaround (w0_t[1]);
238     w_t[ 2] = swap_workaround (w0_t[2]);
239     w_t[ 3] = swap_workaround (w0_t[3]);
240     w_t[ 4] = swap_workaround (w1_t[0]);
241     w_t[ 5] = swap_workaround (w1_t[1]);
242     w_t[ 6] = swap_workaround (w1_t[2]);
243     w_t[ 7] = swap_workaround (w1_t[3]);
244     w_t[ 8] = swap_workaround (w2_t[0]);
245     w_t[ 9] = swap_workaround (w2_t[1]);
246     w_t[10] = swap_workaround (w2_t[2]);
247     w_t[11] = swap_workaround (w2_t[3]);
248     w_t[12] = swap_workaround (w3_t[0]);
249     w_t[13] = swap_workaround (w3_t[1]);
250     w_t[14] = swap_workaround (w3_t[2]);
251     w_t[15] = swap_workaround (w3_t[3]);
252
253     w_t[ 0] = w_t[ 0] >> 8;
254     w_t[ 1] = w_t[ 1] >> 8;
255     w_t[ 2] = w_t[ 2] >> 8;
256     w_t[ 3] = w_t[ 3] >> 8;
257     w_t[ 4] = w_t[ 4] >> 8;
258     w_t[ 5] = w_t[ 5] >> 8;
259     w_t[ 6] = w_t[ 6] >> 8;
260     w_t[ 7] = w_t[ 7] >> 8;
261     w_t[ 8] = w_t[ 8] >> 8;
262     w_t[ 9] = w_t[ 9] >> 8;
263     w_t[10] = w_t[10] >> 8;
264     w_t[11] = w_t[11] >> 8;
265     w_t[12] = w_t[12] >> 8;
266     w_t[13] = w_t[13] >> 8;
267     w_t[14] = w_t[14] >> 8;
268     w_t[15] = w_t[15] >> 8;
269
270     u32x digest[8];
271
272     digest[0] = SHA256M_A;
273     digest[1] = SHA256M_B;
274     digest[2] = SHA256M_C;
275     digest[3] = SHA256M_D;
276     digest[4] = SHA256M_E;
277     digest[5] = SHA256M_F;
278     digest[6] = SHA256M_G;
279     digest[7] = SHA256M_H;
280
281     sha256_transform (digest, w_t); //   0 - 64
282
283     w_t[ 0] = 0;
284     w_t[ 1] = 0;
285     w_t[ 2] = 0;
286     w_t[ 3] = 0;
287     w_t[ 4] = 0;
288     w_t[ 5] = 0;
289     w_t[ 6] = 0;
290     w_t[ 7] = 0;
291     w_t[ 8] = 0;
292     w_t[ 9] = 0;
293     w_t[10] = 0;
294     w_t[11] = 0;
295     w_t[12] = 0;
296     w_t[13] = 0;
297     w_t[14] = 0;
298     w_t[15] = 0;
299
300     sha256_transform (digest, w_t); //  64 - 128
301     sha256_transform (digest, w_t); // 128 - 192
302     sha256_transform (digest, w_t); // 192 - 256
303     sha256_transform (digest, w_t); // 256 - 320
304     sha256_transform (digest, w_t); // 320 - 384
305     sha256_transform (digest, w_t); // 384 - 448
306
307     w_t[15] =               0 | salt_buf0 >> 16;
308
309     sha256_transform (digest, w_t); // 448 - 512
310
311     w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16;
312     w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16;
313     w_t[ 2] = salt_buf2 << 16 | 0;
314     w_t[15] = (510 + 8) * 8;
315
316     sha256_transform (digest, w_t); // 512 - 576
317
318     const u32x r0 = digest[3];
319     const u32x r1 = digest[7];
320     const u32x r2 = digest[2];
321     const u32x r3 = digest[6];
322
323     #include VECT_COMPARE_M
324   }
325 }
326
327 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
328 {
329 }
330
331 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
332 {
333 }
334
335 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
336 {
337   /**
338    * modifier
339    */
340
341   const u32 lid = get_local_id (0);
342
343   /**
344    * base
345    */
346
347   const u32 gid = get_global_id (0);
348
349   if (gid >= gid_max) return;
350
351   u32x pw_buf0[4];
352
353   pw_buf0[0] = pws[gid].i[ 0];
354   pw_buf0[1] = pws[gid].i[ 1];
355   pw_buf0[2] = pws[gid].i[ 2];
356   pw_buf0[3] = pws[gid].i[ 3];
357
358   u32x pw_buf1[4];
359
360   pw_buf1[0] = pws[gid].i[ 4];
361   pw_buf1[1] = pws[gid].i[ 5];
362   pw_buf1[2] = pws[gid].i[ 6];
363   pw_buf1[3] = pws[gid].i[ 7];
364
365   const u32 pw_len = pws[gid].pw_len;
366
367   /**
368    * salt
369    */
370
371   const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]);
372   const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]);
373   const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80
374
375   /**
376    * digest
377    */
378
379   const u32 search[4] =
380   {
381     digests_buf[digests_offset].digest_buf[DGST_R0],
382     digests_buf[digests_offset].digest_buf[DGST_R1],
383     digests_buf[digests_offset].digest_buf[DGST_R2],
384     digests_buf[digests_offset].digest_buf[DGST_R3]
385   };
386
387   /**
388    * loop
389    */
390
391   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
392   {
393     u32x w0[4];
394     u32x w1[4];
395     u32x w2[4];
396     u32x w3[4];
397
398     w0[0] = pw_buf0[0];
399     w0[1] = pw_buf0[1];
400     w0[2] = pw_buf0[2];
401     w0[3] = pw_buf0[3];
402     w1[0] = pw_buf1[0];
403     w1[1] = pw_buf1[1];
404     w1[2] = pw_buf1[2];
405     w1[3] = pw_buf1[3];
406     w2[0] = 0;
407     w2[1] = 0;
408     w2[2] = 0;
409     w2[3] = 0;
410     w3[0] = 0;
411     w3[1] = 0;
412     w3[2] = 0;
413     w3[3] = 0;
414
415     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
416
417     u32x w0_t[4];
418     u32x w1_t[4];
419     u32x w2_t[4];
420     u32x w3_t[4];
421
422     make_unicode (w0, w0_t, w1_t);
423
424     make_unicode (w1, w2_t, w3_t);
425
426     u32x w_t[16];
427
428     w_t[ 0] = swap_workaround (w0_t[0]);
429     w_t[ 1] = swap_workaround (w0_t[1]);
430     w_t[ 2] = swap_workaround (w0_t[2]);
431     w_t[ 3] = swap_workaround (w0_t[3]);
432     w_t[ 4] = swap_workaround (w1_t[0]);
433     w_t[ 5] = swap_workaround (w1_t[1]);
434     w_t[ 6] = swap_workaround (w1_t[2]);
435     w_t[ 7] = swap_workaround (w1_t[3]);
436     w_t[ 8] = swap_workaround (w2_t[0]);
437     w_t[ 9] = swap_workaround (w2_t[1]);
438     w_t[10] = swap_workaround (w2_t[2]);
439     w_t[11] = swap_workaround (w2_t[3]);
440     w_t[12] = swap_workaround (w3_t[0]);
441     w_t[13] = swap_workaround (w3_t[1]);
442     w_t[14] = swap_workaround (w3_t[2]);
443     w_t[15] = swap_workaround (w3_t[3]);
444
445     w_t[ 0] = w_t[ 0] >> 8;
446     w_t[ 1] = w_t[ 1] >> 8;
447     w_t[ 2] = w_t[ 2] >> 8;
448     w_t[ 3] = w_t[ 3] >> 8;
449     w_t[ 4] = w_t[ 4] >> 8;
450     w_t[ 5] = w_t[ 5] >> 8;
451     w_t[ 6] = w_t[ 6] >> 8;
452     w_t[ 7] = w_t[ 7] >> 8;
453     w_t[ 8] = w_t[ 8] >> 8;
454     w_t[ 9] = w_t[ 9] >> 8;
455     w_t[10] = w_t[10] >> 8;
456     w_t[11] = w_t[11] >> 8;
457     w_t[12] = w_t[12] >> 8;
458     w_t[13] = w_t[13] >> 8;
459     w_t[14] = w_t[14] >> 8;
460     w_t[15] = w_t[15] >> 8;
461
462     u32x digest[8];
463
464     digest[0] = SHA256M_A;
465     digest[1] = SHA256M_B;
466     digest[2] = SHA256M_C;
467     digest[3] = SHA256M_D;
468     digest[4] = SHA256M_E;
469     digest[5] = SHA256M_F;
470     digest[6] = SHA256M_G;
471     digest[7] = SHA256M_H;
472
473     sha256_transform (digest, w_t); //   0 - 64
474
475     w_t[ 0] = 0;
476     w_t[ 1] = 0;
477     w_t[ 2] = 0;
478     w_t[ 3] = 0;
479     w_t[ 4] = 0;
480     w_t[ 5] = 0;
481     w_t[ 6] = 0;
482     w_t[ 7] = 0;
483     w_t[ 8] = 0;
484     w_t[ 9] = 0;
485     w_t[10] = 0;
486     w_t[11] = 0;
487     w_t[12] = 0;
488     w_t[13] = 0;
489     w_t[14] = 0;
490     w_t[15] = 0;
491
492     sha256_transform (digest, w_t); //  64 - 128
493     sha256_transform (digest, w_t); // 128 - 192
494     sha256_transform (digest, w_t); // 192 - 256
495     sha256_transform (digest, w_t); // 256 - 320
496     sha256_transform (digest, w_t); // 320 - 384
497     sha256_transform (digest, w_t); // 384 - 448
498
499     w_t[15] =               0 | salt_buf0 >> 16;
500
501     sha256_transform (digest, w_t); // 448 - 512
502
503     w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16;
504     w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16;
505     w_t[ 2] = salt_buf2 << 16 | 0;
506     w_t[15] = (510 + 8) * 8;
507
508     sha256_transform (digest, w_t); // 512 - 576
509
510     const u32x r0 = digest[3];
511     const u32x r1 = digest[7];
512     const u32x r2 = digest[2];
513     const u32x r3 = digest[6];
514
515     #include VECT_COMPARE_S
516   }
517 }
518
519 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
520 {
521 }
522
523 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
524 {
525 }