Initial commit
[hashcat.git] / amd / m00120_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
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_SIZE4
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE4
21 #endif
22
23 #define DGST_R0 3
24 #define DGST_R1 4
25 #define DGST_R2 2
26 #define DGST_R3 1
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31
32 #ifdef  VECT_SIZE1
33 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
34 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
35 #endif
36
37 #ifdef  VECT_SIZE2
38 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
39 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
40 #endif
41
42 #ifdef  VECT_SIZE4
43 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
44 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
45 #endif
46
47 static void overwrite_at (u32x sw[16], const u32x w0, const u32 salt_len)
48 {
49   switch (salt_len)
50   {
51     case  0:  sw[0] =  w0;
52               break;
53     case  1:  sw[0] = (sw[0] & 0xff000000) | (w0 >>  8);
54               sw[1] = (sw[1] & 0x00ffffff) | (w0 << 24);
55               break;
56     case  2:  sw[0] = (sw[0] & 0xffff0000) | (w0 >> 16);
57               sw[1] = (sw[1] & 0x0000ffff) | (w0 << 16);
58               break;
59     case  3:  sw[0] = (sw[0] & 0xffffff00) | (w0 >> 24);
60               sw[1] = (sw[1] & 0x000000ff) | (w0 <<  8);
61               break;
62     case  4:  sw[1] =  w0;
63               break;
64     case  5:  sw[1] = (sw[1] & 0xff000000) | (w0 >>  8);
65               sw[2] = (sw[2] & 0x00ffffff) | (w0 << 24);
66               break;
67     case  6:  sw[1] = (sw[1] & 0xffff0000) | (w0 >> 16);
68               sw[2] = (sw[2] & 0x0000ffff) | (w0 << 16);
69               break;
70     case  7:  sw[1] = (sw[1] & 0xffffff00) | (w0 >> 24);
71               sw[2] = (sw[2] & 0x000000ff) | (w0 <<  8);
72               break;
73     case  8:  sw[2] =  w0;
74               break;
75     case  9:  sw[2] = (sw[2] & 0xff000000) | (w0 >>  8);
76               sw[3] = (sw[3] & 0x00ffffff) | (w0 << 24);
77               break;
78     case 10:  sw[2] = (sw[2] & 0xffff0000) | (w0 >> 16);
79               sw[3] = (sw[3] & 0x0000ffff) | (w0 << 16);
80               break;
81     case 11:  sw[2] = (sw[2] & 0xffffff00) | (w0 >> 24);
82               sw[3] = (sw[3] & 0x000000ff) | (w0 <<  8);
83               break;
84     case 12:  sw[3] =  w0;
85               break;
86     case 13:  sw[3] = (sw[3] & 0xff000000) | (w0 >>  8);
87               sw[4] = (sw[4] & 0x00ffffff) | (w0 << 24);
88               break;
89     case 14:  sw[3] = (sw[3] & 0xffff0000) | (w0 >> 16);
90               sw[4] = (sw[4] & 0x0000ffff) | (w0 << 16);
91               break;
92     case 15:  sw[3] = (sw[3] & 0xffffff00) | (w0 >> 24);
93               sw[4] = (sw[4] & 0x000000ff) | (w0 <<  8);
94               break;
95     case 16:  sw[4] =  w0;
96               break;
97     case 17:  sw[4] = (sw[4] & 0xff000000) | (w0 >>  8);
98               sw[5] = (sw[5] & 0x00ffffff) | (w0 << 24);
99               break;
100     case 18:  sw[4] = (sw[4] & 0xffff0000) | (w0 >> 16);
101               sw[5] = (sw[5] & 0x0000ffff) | (w0 << 16);
102               break;
103     case 19:  sw[4] = (sw[4] & 0xffffff00) | (w0 >> 24);
104               sw[5] = (sw[5] & 0x000000ff) | (w0 <<  8);
105               break;
106     case 20:  sw[5] =  w0;
107               break;
108     case 21:  sw[5] = (sw[5] & 0xff000000) | (w0 >>  8);
109               sw[6] = (sw[6] & 0x00ffffff) | (w0 << 24);
110               break;
111     case 22:  sw[5] = (sw[5] & 0xffff0000) | (w0 >> 16);
112               sw[6] = (sw[6] & 0x0000ffff) | (w0 << 16);
113               break;
114     case 23:  sw[5] = (sw[5] & 0xffffff00) | (w0 >> 24);
115               sw[6] = (sw[6] & 0x000000ff) | (w0 <<  8);
116               break;
117     case 24:  sw[6] =  w0;
118               break;
119     case 25:  sw[6] = (sw[6] & 0xff000000) | (w0 >>  8);
120               sw[7] = (sw[7] & 0x00ffffff) | (w0 << 24);
121               break;
122     case 26:  sw[6] = (sw[6] & 0xffff0000) | (w0 >> 16);
123               sw[7] = (sw[7] & 0x0000ffff) | (w0 << 16);
124               break;
125     case 27:  sw[6] = (sw[6] & 0xffffff00) | (w0 >> 24);
126               sw[7] = (sw[7] & 0x000000ff) | (w0 <<  8);
127               break;
128     case 28:  sw[7] =  w0;
129               break;
130     case 29:  sw[7] = (sw[7] & 0xff000000) | (w0 >>  8);
131               sw[8] = (sw[8] & 0x00ffffff) | (w0 << 24);
132               break;
133     case 30:  sw[7] = (sw[7] & 0xffff0000) | (w0 >> 16);
134               sw[8] = (sw[8] & 0x0000ffff) | (w0 << 16);
135               break;
136     case 31:  sw[7] = (sw[7] & 0xffffff00) | (w0 >> 24);
137               sw[8] = (sw[8] & 0x000000ff) | (w0 <<  8);
138               break;
139   }
140 }
141
142 static void m00120m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
143 {
144   /**
145    * modifier
146    */
147
148   const u32 gid = get_global_id (0);
149   const u32 lid = get_local_id (0);
150
151   /**
152    * salt
153    */
154
155   u32 salt_buf0[4];
156
157   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
158   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
159   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
160   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
161
162   u32 salt_buf1[4];
163
164   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
165   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
166   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
167   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
168
169   u32 salt_buf2[4];
170
171   salt_buf2[0] = 0;
172   salt_buf2[1] = 0;
173   salt_buf2[2] = 0;
174   salt_buf2[3] = 0;
175
176   u32 salt_buf3[4];
177
178   salt_buf3[0] = 0;
179   salt_buf3[1] = 0;
180   salt_buf3[2] = 0;
181   salt_buf3[3] = 0;
182
183   const u32 salt_len = salt_bufs[salt_pos].salt_len;
184
185   const u32 pw_salt_len = pw_len + salt_len;
186
187   /**
188    * prepend salt
189    */
190
191   u32x w0_t[4];
192   u32x w1_t[4];
193   u32x w2_t[4];
194   u32x w3_t[4];
195
196   w0_t[0] = swap_workaround (w0[0]);
197   w0_t[1] = swap_workaround (w0[1]);
198   w0_t[2] = swap_workaround (w0[2]);
199   w0_t[3] = swap_workaround (w0[3]);
200   w1_t[0] = swap_workaround (w1[0]);
201   w1_t[1] = swap_workaround (w1[1]);
202   w1_t[2] = swap_workaround (w1[2]);
203   w1_t[3] = swap_workaround (w1[3]);
204   w2_t[0] = swap_workaround (w2[0]);
205   w2_t[1] = swap_workaround (w2[1]);
206   w2_t[2] = swap_workaround (w2[2]);
207   w2_t[3] = swap_workaround (w2[3]);
208   w3_t[0] = swap_workaround (w3[0]);
209   w3_t[1] = swap_workaround (w3[1]);
210   w3_t[2] = swap_workaround (w3[2]);
211   w3_t[3] = swap_workaround (w3[3]);
212
213   switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len);
214
215   w0_t[0] |= salt_buf0[0];
216   w0_t[1] |= salt_buf0[1];
217   w0_t[2] |= salt_buf0[2];
218   w0_t[3] |= salt_buf0[3];
219   w1_t[0] |= salt_buf1[0];
220   w1_t[1] |= salt_buf1[1];
221   w1_t[2] |= salt_buf1[2];
222   w1_t[3] |= salt_buf1[3];
223   w2_t[0] |= salt_buf2[0];
224   w2_t[1] |= salt_buf2[1];
225   w2_t[2] |= salt_buf2[2];
226   w2_t[3] |= salt_buf2[3];
227   w3_t[0] |= salt_buf3[0];
228   w3_t[1] |= salt_buf3[1];
229   w3_t[2] |= salt_buf3[2];
230   w3_t[3] |= salt_buf3[3];
231
232   w0_t[0] = swap_workaround (w0_t[0]);
233   w0_t[1] = swap_workaround (w0_t[1]);
234   w0_t[2] = swap_workaround (w0_t[2]);
235   w0_t[3] = swap_workaround (w0_t[3]);
236   w1_t[0] = swap_workaround (w1_t[0]);
237   w1_t[1] = swap_workaround (w1_t[1]);
238   w1_t[2] = swap_workaround (w1_t[2]);
239   w1_t[3] = swap_workaround (w1_t[3]);
240   w2_t[0] = swap_workaround (w2_t[0]);
241   w2_t[1] = swap_workaround (w2_t[1]);
242   w2_t[2] = swap_workaround (w2_t[2]);
243   w2_t[3] = swap_workaround (w2_t[3]);
244   w3_t[0] = swap_workaround (w3_t[0]);
245   w3_t[1] = swap_workaround (w3_t[1]);
246   w3_t[2] = swap_workaround (w3_t[2]);
247   w3_t[3] = swap_workaround (w3_t[3]);
248
249   /**
250    * loop
251    */
252
253   u32x w0l = w0[0];
254
255   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
256   {
257     const u32 w0r = bfs_buf[il_pos].i;
258
259     const u32x w0n = w0l | w0r;
260
261     u32x wx[16];
262
263     wx[ 0] = w0_t[0];
264     wx[ 1] = w0_t[1];
265     wx[ 2] = w0_t[2];
266     wx[ 3] = w0_t[3];
267     wx[ 4] = w1_t[0];
268     wx[ 5] = w1_t[1];
269     wx[ 6] = w1_t[2];
270     wx[ 7] = w1_t[3];
271     wx[ 8] = w2_t[0];
272     wx[ 9] = w2_t[1];
273     wx[10] = w2_t[2];
274     wx[11] = w2_t[3];
275     wx[12] = w3_t[0];
276     wx[13] = w3_t[1];
277     wx[14] = w3_t[2];
278     wx[15] = w3_t[3];
279
280     overwrite_at (wx, w0n, salt_len);
281
282     u32x w0_t[4];
283     u32x w1_t[4];
284     u32x w2_t[4];
285     u32x w3_t[4];
286
287     w0_t[0] = wx[ 0];
288     w0_t[1] = wx[ 1];
289     w0_t[2] = wx[ 2];
290     w0_t[3] = wx[ 3];
291     w1_t[0] = wx[ 4];
292     w1_t[1] = wx[ 5];
293     w1_t[2] = wx[ 6];
294     w1_t[3] = wx[ 7];
295     w2_t[0] = wx[ 8];
296     w2_t[1] = wx[ 9];
297     w2_t[2] = wx[10];
298     w2_t[3] = wx[11];
299     w3_t[0] = wx[12];
300     w3_t[1] = wx[13];
301     w3_t[2] = 0;
302     w3_t[3] = pw_salt_len * 8;
303
304     /**
305      * sha1
306      */
307
308     u32x a = SHA1M_A;
309     u32x b = SHA1M_B;
310     u32x c = SHA1M_C;
311     u32x d = SHA1M_D;
312     u32x e = SHA1M_E;
313
314     #undef K
315     #define K SHA1C00
316
317     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]);
318     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]);
319     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]);
320     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]);
321     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]);
322     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]);
323     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]);
324     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]);
325     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]);
326     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]);
327     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]);
328     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]);
329     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]);
330     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]);
331     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]);
332     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]);
333     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]);
334     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]);
335     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]);
336     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]);
337
338     #undef K
339     #define K SHA1C01
340
341     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]);
342     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]);
343     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]);
344     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]);
345     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]);
346     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]);
347     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]);
348     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]);
349     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]);
350     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]);
351     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]);
352     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]);
353     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]);
354     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]);
355     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]);
356     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]);
357     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]);
358     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]);
359     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]);
360     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]);
361
362     #undef K
363     #define K SHA1C02
364
365     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]);
366     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]);
367     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]);
368     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]);
369     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]);
370     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]);
371     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]);
372     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]);
373     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]);
374     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]);
375     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]);
376     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]);
377     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]);
378     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]);
379     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]);
380     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]);
381     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]);
382     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]);
383     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]);
384     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]);
385
386     #undef K
387     #define K SHA1C03
388
389     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]);
390     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]);
391     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]);
392     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]);
393     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]);
394     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]);
395     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]);
396     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]);
397     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]);
398     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]);
399     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]);
400     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]);
401     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]);
402     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]);
403     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]);
404     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]);
405     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]);
406     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]);
407     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]);
408     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]);
409
410     const u32x r0 = d;
411     const u32x r1 = e;
412     const u32x r2 = c;
413     const u32x r3 = b;
414
415     #include VECT_COMPARE_M
416   }
417 }
418
419 static void m00120s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
420 {
421   /**
422    * modifier
423    */
424
425   const u32 gid = get_global_id (0);
426   const u32 lid = get_local_id (0);
427
428   /**
429    * digest
430    */
431
432   const u32 search[4] =
433   {
434     digests_buf[digests_offset].digest_buf[DGST_R0],
435     digests_buf[digests_offset].digest_buf[DGST_R1],
436     digests_buf[digests_offset].digest_buf[DGST_R2],
437     digests_buf[digests_offset].digest_buf[DGST_R3]
438   };
439
440   /**
441    * reverse
442    */
443
444   const u32 e_rev = rotl32 (search[1], 2u);
445
446   /**
447    * salt
448    */
449
450   u32 salt_buf0[4];
451
452   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
453   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
454   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
455   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
456
457   u32 salt_buf1[4];
458
459   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
460   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
461   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
462   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
463
464   u32 salt_buf2[4];
465
466   salt_buf2[0] = 0;
467   salt_buf2[1] = 0;
468   salt_buf2[2] = 0;
469   salt_buf2[3] = 0;
470
471   u32 salt_buf3[4];
472
473   salt_buf3[0] = 0;
474   salt_buf3[1] = 0;
475   salt_buf3[2] = 0;
476   salt_buf3[3] = 0;
477
478   const u32 salt_len = salt_bufs[salt_pos].salt_len;
479
480   const u32 pw_salt_len = pw_len + salt_len;
481
482   /**
483    * prepend salt
484    */
485
486   u32x w0_t[4];
487   u32x w1_t[4];
488   u32x w2_t[4];
489   u32x w3_t[4];
490
491   w0_t[0] = swap_workaround (w0[0]);
492   w0_t[1] = swap_workaround (w0[1]);
493   w0_t[2] = swap_workaround (w0[2]);
494   w0_t[3] = swap_workaround (w0[3]);
495   w1_t[0] = swap_workaround (w1[0]);
496   w1_t[1] = swap_workaround (w1[1]);
497   w1_t[2] = swap_workaround (w1[2]);
498   w1_t[3] = swap_workaround (w1[3]);
499   w2_t[0] = swap_workaround (w2[0]);
500   w2_t[1] = swap_workaround (w2[1]);
501   w2_t[2] = swap_workaround (w2[2]);
502   w2_t[3] = swap_workaround (w2[3]);
503   w3_t[0] = swap_workaround (w3[0]);
504   w3_t[1] = swap_workaround (w3[1]);
505   w3_t[2] = swap_workaround (w3[2]);
506   w3_t[3] = swap_workaround (w3[3]);
507
508   switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len);
509
510   w0_t[0] |= salt_buf0[0];
511   w0_t[1] |= salt_buf0[1];
512   w0_t[2] |= salt_buf0[2];
513   w0_t[3] |= salt_buf0[3];
514   w1_t[0] |= salt_buf1[0];
515   w1_t[1] |= salt_buf1[1];
516   w1_t[2] |= salt_buf1[2];
517   w1_t[3] |= salt_buf1[3];
518   w2_t[0] |= salt_buf2[0];
519   w2_t[1] |= salt_buf2[1];
520   w2_t[2] |= salt_buf2[2];
521   w2_t[3] |= salt_buf2[3];
522   w3_t[0] |= salt_buf3[0];
523   w3_t[1] |= salt_buf3[1];
524   w3_t[2] |= salt_buf3[2];
525   w3_t[3] |= salt_buf3[3];
526
527   w0_t[0] = swap_workaround (w0_t[0]);
528   w0_t[1] = swap_workaround (w0_t[1]);
529   w0_t[2] = swap_workaround (w0_t[2]);
530   w0_t[3] = swap_workaround (w0_t[3]);
531   w1_t[0] = swap_workaround (w1_t[0]);
532   w1_t[1] = swap_workaround (w1_t[1]);
533   w1_t[2] = swap_workaround (w1_t[2]);
534   w1_t[3] = swap_workaround (w1_t[3]);
535   w2_t[0] = swap_workaround (w2_t[0]);
536   w2_t[1] = swap_workaround (w2_t[1]);
537   w2_t[2] = swap_workaround (w2_t[2]);
538   w2_t[3] = swap_workaround (w2_t[3]);
539   w3_t[0] = swap_workaround (w3_t[0]);
540   w3_t[1] = swap_workaround (w3_t[1]);
541   w3_t[2] = swap_workaround (w3_t[2]);
542   w3_t[3] = swap_workaround (w3_t[3]);
543
544   /**
545    * loop
546    */
547
548   u32x w0l = w0[0];
549
550   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
551   {
552     const u32 w0r = bfs_buf[il_pos].i;
553
554     const u32x w0n = w0l | w0r;
555
556     u32x wx[16];
557
558     wx[ 0] = w0_t[0];
559     wx[ 1] = w0_t[1];
560     wx[ 2] = w0_t[2];
561     wx[ 3] = w0_t[3];
562     wx[ 4] = w1_t[0];
563     wx[ 5] = w1_t[1];
564     wx[ 6] = w1_t[2];
565     wx[ 7] = w1_t[3];
566     wx[ 8] = w2_t[0];
567     wx[ 9] = w2_t[1];
568     wx[10] = w2_t[2];
569     wx[11] = w2_t[3];
570     wx[12] = w3_t[0];
571     wx[13] = w3_t[1];
572     wx[14] = w3_t[2];
573     wx[15] = w3_t[3];
574
575     overwrite_at (wx, w0n, salt_len);
576
577     u32x w0_t[4];
578     u32x w1_t[4];
579     u32x w2_t[4];
580     u32x w3_t[4];
581
582     w0_t[0] = wx[ 0];
583     w0_t[1] = wx[ 1];
584     w0_t[2] = wx[ 2];
585     w0_t[3] = wx[ 3];
586     w1_t[0] = wx[ 4];
587     w1_t[1] = wx[ 5];
588     w1_t[2] = wx[ 6];
589     w1_t[3] = wx[ 7];
590     w2_t[0] = wx[ 8];
591     w2_t[1] = wx[ 9];
592     w2_t[2] = wx[10];
593     w2_t[3] = wx[11];
594     w3_t[0] = wx[12];
595     w3_t[1] = wx[13];
596     w3_t[2] = 0;
597     w3_t[3] = pw_salt_len * 8;
598
599     /**
600      * sha1
601      */
602
603     u32x a = SHA1M_A;
604     u32x b = SHA1M_B;
605     u32x c = SHA1M_C;
606     u32x d = SHA1M_D;
607     u32x e = SHA1M_E;
608
609     #undef K
610     #define K SHA1C00
611
612     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]);
613     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]);
614     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]);
615     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]);
616     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]);
617     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]);
618     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]);
619     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]);
620     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]);
621     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]);
622     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]);
623     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]);
624     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]);
625     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]);
626     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]);
627     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]);
628     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]);
629     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]);
630     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]);
631     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]);
632
633     #undef K
634     #define K SHA1C01
635
636     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]);
637     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]);
638     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]);
639     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]);
640     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]);
641     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]);
642     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]);
643     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]);
644     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]);
645     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]);
646     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]);
647     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]);
648     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]);
649     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]);
650     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]);
651     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]);
652     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]);
653     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]);
654     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]);
655     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]);
656
657     #undef K
658     #define K SHA1C02
659
660     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]);
661     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]);
662     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]);
663     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]);
664     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]);
665     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]);
666     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]);
667     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]);
668     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]);
669     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]);
670     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]);
671     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]);
672     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]);
673     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]);
674     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]);
675     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]);
676     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]);
677     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]);
678     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]);
679     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]);
680
681     #undef K
682     #define K SHA1C03
683
684     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]);
685     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]);
686     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]);
687     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]);
688     w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]);
689     w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]);
690     w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]);
691     w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]);
692     w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]);
693     w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]);
694     w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]);
695     w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]);
696     w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]);
697     w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]);
698     w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]);
699     w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]);
700     w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]);
701
702     if (allx (e != e_rev)) continue;
703
704     w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]);
705     w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]);
706     w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]);
707
708
709     const u32x r0 = d;
710     const u32x r1 = e;
711     const u32x r2 = c;
712     const u32x r3 = b;
713
714     #include VECT_COMPARE_S
715   }
716 }
717
718 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
719 {
720   /**
721    * base
722    */
723
724   const u32 gid = get_global_id (0);
725
726   if (gid >= gid_max) return;
727
728   u32x w0[4];
729
730   w0[0] = pws[gid].i[ 0];
731   w0[1] = pws[gid].i[ 1];
732   w0[2] = pws[gid].i[ 2];
733   w0[3] = pws[gid].i[ 3];
734
735   u32x w1[4];
736
737   w1[0] = 0;
738   w1[1] = 0;
739   w1[2] = 0;
740   w1[3] = 0;
741
742   u32x w2[4];
743
744   w2[0] = 0;
745   w2[1] = 0;
746   w2[2] = 0;
747   w2[3] = 0;
748
749   u32x w3[4];
750
751   w3[0] = 0;
752   w3[1] = 0;
753   w3[2] = 0;
754   w3[3] = 0;
755
756   const u32 pw_len = pws[gid].pw_len;
757
758   /**
759    * main
760    */
761
762   m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, 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);
763 }
764
765 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
766 {
767   /**
768    * base
769    */
770
771   const u32 gid = get_global_id (0);
772
773   if (gid >= gid_max) return;
774
775   u32x w0[4];
776
777   w0[0] = pws[gid].i[ 0];
778   w0[1] = pws[gid].i[ 1];
779   w0[2] = pws[gid].i[ 2];
780   w0[3] = pws[gid].i[ 3];
781
782   u32x w1[4];
783
784   w1[0] = pws[gid].i[ 4];
785   w1[1] = pws[gid].i[ 5];
786   w1[2] = pws[gid].i[ 6];
787   w1[3] = pws[gid].i[ 7];
788
789   u32x w2[4];
790
791   w2[0] = 0;
792   w2[1] = 0;
793   w2[2] = 0;
794   w2[3] = 0;
795
796   u32x w3[4];
797
798   w3[0] = 0;
799   w3[1] = 0;
800   w3[2] = 0;
801   w3[3] = 0;
802
803   const u32 pw_len = pws[gid].pw_len;
804
805   /**
806    * main
807    */
808
809   m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, 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);
810 }
811
812 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
813 {
814   /**
815    * base
816    */
817
818   const u32 gid = get_global_id (0);
819
820   if (gid >= gid_max) return;
821
822   u32x w0[4];
823
824   w0[0] = pws[gid].i[ 0];
825   w0[1] = pws[gid].i[ 1];
826   w0[2] = pws[gid].i[ 2];
827   w0[3] = pws[gid].i[ 3];
828
829   u32x w1[4];
830
831   w1[0] = pws[gid].i[ 4];
832   w1[1] = pws[gid].i[ 5];
833   w1[2] = pws[gid].i[ 6];
834   w1[3] = pws[gid].i[ 7];
835
836   u32x w2[4];
837
838   w2[0] = pws[gid].i[ 8];
839   w2[1] = pws[gid].i[ 9];
840   w2[2] = pws[gid].i[10];
841   w2[3] = pws[gid].i[11];
842
843   u32x w3[4];
844
845   w3[0] = pws[gid].i[12];
846   w3[1] = pws[gid].i[13];
847   w3[2] = 0;
848   w3[3] = 0;
849
850   const u32 pw_len = pws[gid].pw_len;
851
852   /**
853    * main
854    */
855
856   m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, 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);
857 }
858
859 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
860 {
861   /**
862    * base
863    */
864
865   const u32 gid = get_global_id (0);
866
867   if (gid >= gid_max) return;
868
869   u32x w0[4];
870
871   w0[0] = pws[gid].i[ 0];
872   w0[1] = pws[gid].i[ 1];
873   w0[2] = pws[gid].i[ 2];
874   w0[3] = pws[gid].i[ 3];
875
876   u32x w1[4];
877
878   w1[0] = 0;
879   w1[1] = 0;
880   w1[2] = 0;
881   w1[3] = 0;
882
883   u32x w2[4];
884
885   w2[0] = 0;
886   w2[1] = 0;
887   w2[2] = 0;
888   w2[3] = 0;
889
890   u32x w3[4];
891
892   w3[0] = 0;
893   w3[1] = 0;
894   w3[2] = 0;
895   w3[3] = 0;
896
897   const u32 pw_len = pws[gid].pw_len;
898
899   /**
900    * main
901    */
902
903   m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, 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);
904 }
905
906 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
907 {
908   /**
909    * base
910    */
911
912   const u32 gid = get_global_id (0);
913
914   if (gid >= gid_max) return;
915
916   u32x w0[4];
917
918   w0[0] = pws[gid].i[ 0];
919   w0[1] = pws[gid].i[ 1];
920   w0[2] = pws[gid].i[ 2];
921   w0[3] = pws[gid].i[ 3];
922
923   u32x w1[4];
924
925   w1[0] = pws[gid].i[ 4];
926   w1[1] = pws[gid].i[ 5];
927   w1[2] = pws[gid].i[ 6];
928   w1[3] = pws[gid].i[ 7];
929
930   u32x w2[4];
931
932   w2[0] = 0;
933   w2[1] = 0;
934   w2[2] = 0;
935   w2[3] = 0;
936
937   u32x w3[4];
938
939   w3[0] = 0;
940   w3[1] = 0;
941   w3[2] = 0;
942   w3[3] = 0;
943
944   const u32 pw_len = pws[gid].pw_len;
945
946   /**
947    * main
948    */
949
950   m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, 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);
951 }
952
953 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
954 {
955   /**
956    * base
957    */
958
959   const u32 gid = get_global_id (0);
960
961   if (gid >= gid_max) return;
962
963   u32x w0[4];
964
965   w0[0] = pws[gid].i[ 0];
966   w0[1] = pws[gid].i[ 1];
967   w0[2] = pws[gid].i[ 2];
968   w0[3] = pws[gid].i[ 3];
969
970   u32x w1[4];
971
972   w1[0] = pws[gid].i[ 4];
973   w1[1] = pws[gid].i[ 5];
974   w1[2] = pws[gid].i[ 6];
975   w1[3] = pws[gid].i[ 7];
976
977   u32x w2[4];
978
979   w2[0] = pws[gid].i[ 8];
980   w2[1] = pws[gid].i[ 9];
981   w2[2] = pws[gid].i[10];
982   w2[3] = pws[gid].i[11];
983
984   u32x w3[4];
985
986   w3[0] = pws[gid].i[12];
987   w3[1] = pws[gid].i[13];
988   w3[2] = 0;
989   w3[3] = 0;
990
991   const u32 pw_len = pws[gid].pw_len;
992
993   /**
994    * main
995    */
996
997   m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, 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);
998 }