Zero pws_buf before reuse
[hashcat.git] / OpenCL / m08400_a1.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
7
8 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 3
14 #define DGST_R1 4
15 #define DGST_R2 2
16 #define DGST_R3 1
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21 #include "OpenCL/simd.c"
22
23 #define uint_to_hex_lower8_le(i) l_bin2asc[(i)]
24
25 static void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5])
26 {
27   u32 A = digest[0];
28   u32 B = digest[1];
29   u32 C = digest[2];
30   u32 D = digest[3];
31   u32 E = digest[4];
32
33   u32 w0_t = w0[0];
34   u32 w1_t = w0[1];
35   u32 w2_t = w0[2];
36   u32 w3_t = w0[3];
37   u32 w4_t = w1[0];
38   u32 w5_t = w1[1];
39   u32 w6_t = w1[2];
40   u32 w7_t = w1[3];
41   u32 w8_t = w2[0];
42   u32 w9_t = w2[1];
43   u32 wa_t = w2[2];
44   u32 wb_t = w2[3];
45   u32 wc_t = w3[0];
46   u32 wd_t = w3[1];
47   u32 we_t = w3[2];
48   u32 wf_t = w3[3];
49
50   #undef K
51   #define K SHA1C00
52
53   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
54   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
55   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
56   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
57   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
58   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
59   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
60   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
61   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
62   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
63   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
64   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
65   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
66   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
67   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
68   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
69   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
70   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
71   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
72   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
73
74   #undef K
75   #define K SHA1C01
76
77   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
78   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
79   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
80   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
81   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
82   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
83   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
84   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
85   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
86   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
87   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
88   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
89   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
90   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
91   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
92   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
93   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
94   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
95   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
96   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
97
98   #undef K
99   #define K SHA1C02
100
101   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
102   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
103   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
104   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
105   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
106   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
107   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
108   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
109   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
110   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
111   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
112   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
113   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
114   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
115   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
116   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
117   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
118   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
119   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
120   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
121
122   #undef K
123   #define K SHA1C03
124
125   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
126   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
127   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
128   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
129   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
130   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
131   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
132   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
133   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
134   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
135   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
136   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
137   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
138   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
139   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
140   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
141   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
142   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
143   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
144   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
145
146   digest[0] += A;
147   digest[1] += B;
148   digest[2] += C;
149   digest[3] += D;
150   digest[4] += E;
151 }
152
153 __kernel void m08400_m04 (__global pw_t *pws, __global kernel_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
154 {
155   /**
156    * modifier
157    */
158
159   const u32 gid = get_global_id (0);
160   const u32 lid = get_local_id (0);
161   const u32 lsz = get_local_size (0);
162
163   /**
164    * shared
165    */
166
167   __local u32 l_bin2asc[256];
168
169   for (u32 i = lid; i < 256; i += lsz)
170   {
171     const u32 i0 = (i >> 0) & 15;
172     const u32 i1 = (i >> 4) & 15;
173
174     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
175                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
176   }
177
178   barrier (CLK_LOCAL_MEM_FENCE);
179
180   if (gid >= gid_max) return;
181
182   /**
183    * base
184    */
185
186   u32 pws0[4] = { 0 };
187   u32 pws1[4] = { 0 };
188
189   pws0[0] = pws[gid].i[0];
190   pws0[1] = pws[gid].i[1];
191   pws0[2] = pws[gid].i[2];
192   pws0[3] = pws[gid].i[3];
193   pws1[0] = pws[gid].i[4];
194   pws1[1] = pws[gid].i[5];
195   pws1[2] = pws[gid].i[6];
196   pws1[3] = pws[gid].i[7];
197
198   const u32 pw_l_len = pws[gid].pw_len;
199
200   /**
201    * salt
202    */
203
204   u32 salt_buf0[4];
205
206   salt_buf0[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 0]);
207   salt_buf0[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 1]);
208   salt_buf0[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 2]);
209   salt_buf0[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 3]);
210
211   u32 salt_buf1[4];
212
213   salt_buf1[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 4]);
214   salt_buf1[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 5]);
215   salt_buf1[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 6]);
216   salt_buf1[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 7]);
217
218   u32 salt_buf2[4];
219
220   salt_buf2[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 8]);
221   salt_buf2[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 9]);
222   salt_buf2[2] = 0;
223   salt_buf2[3] = 0;
224
225   const u32 salt_len = salt_bufs[salt_pos].salt_len;
226
227   /**
228    * loop
229    */
230
231   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
232   {
233     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
234
235     const u32x pw_len = pw_l_len + pw_r_len;
236
237     u32x wordr0[4] = { 0 };
238     u32x wordr1[4] = { 0 };
239     u32x wordr2[4] = { 0 };
240     u32x wordr3[4] = { 0 };
241
242     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
243     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
244     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
245     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
246     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
247     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
248     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
249     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
250
251     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
252     {
253       append_0x80_2x4 (wordr0, wordr1, pw_r_len);
254
255       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
256     }
257
258     u32x w0[4];
259
260     w0[0] = wordl0[0] | wordr0[0];
261     w0[1] = wordl0[1] | wordr0[1];
262     w0[2] = wordl0[2] | wordr0[2];
263     w0[3] = wordl0[3] | wordr0[3];
264
265     u32x w1[4];
266
267     w1[0] = wordl1[0] | wordr1[0];
268     w1[1] = wordl1[1] | wordr1[1];
269     w1[2] = wordl1[2] | wordr1[2];
270     w1[3] = wordl1[3] | wordr1[3];
271
272     u32x w2[4];
273
274     w2[0] = wordl2[0] | wordr2[0];
275     w2[1] = wordl2[1] | wordr2[1];
276     w2[2] = wordl2[2] | wordr2[2];
277     w2[3] = wordl2[3] | wordr2[3];
278
279     u32x w3[4];
280
281     w3[0] = wordl3[0] | wordr3[0];
282     w3[1] = wordl3[1] | wordr3[1];
283     w3[2] = wordl3[2] | wordr3[2];
284     w3[3] = wordl3[3] | wordr3[3];
285
286     u32x w0_t[4];
287
288     w0_t[0] = swap32 (w0[0]);
289     w0_t[1] = swap32 (w0[1]);
290     w0_t[2] = swap32 (w0[2]);
291     w0_t[3] = swap32 (w0[3]);
292
293     u32x w1_t[4];
294
295     w1_t[0] = swap32 (w1[0]);
296     w1_t[1] = swap32 (w1[1]);
297     w1_t[2] = swap32 (w1[2]);
298     w1_t[3] = swap32 (w1[3]);
299
300     u32x w2_t[4];
301
302     w2_t[0] = swap32 (w2[0]);
303     w2_t[1] = swap32 (w2[1]);
304     w2_t[2] = swap32 (w2[2]);
305     w2_t[3] = swap32 (w2[3]);
306
307     u32x w3_t[4];
308
309     w3_t[0] = swap32 (w3[0]);
310     w3_t[1] = swap32 (w3[1]);
311     w3_t[2] = 0;
312     w3_t[3] = pw_len * 8;
313
314     u32 digest[5];
315
316     digest[0] = SHA1M_A;
317     digest[1] = SHA1M_B;
318     digest[2] = SHA1M_C;
319     digest[3] = SHA1M_D;
320     digest[4] = SHA1M_E;
321
322     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
323
324     u32 a;
325     u32 b;
326     u32 c;
327     u32 d;
328     u32 e;
329
330     a = digest[0];
331     b = digest[1];
332     c = digest[2];
333     d = digest[3];
334     e = digest[4];
335
336     w0_t[0] = salt_buf0[0];
337     w0_t[1] = salt_buf0[1];
338     w0_t[2] = salt_buf0[2];
339     w0_t[3] = salt_buf0[3];
340     w1_t[0] = salt_buf1[0];
341     w1_t[1] = salt_buf1[1];
342     w1_t[2] = salt_buf1[2];
343     w1_t[3] = salt_buf1[3];
344     w2_t[0] = salt_buf2[0];
345     w2_t[1] = salt_buf2[1];
346     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
347             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
348     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
349             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
350     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
351             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
352     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
353             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
354     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
355             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
356     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
357             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
358
359     digest[0] = SHA1M_A;
360     digest[1] = SHA1M_B;
361     digest[2] = SHA1M_C;
362     digest[3] = SHA1M_D;
363     digest[4] = SHA1M_E;
364
365     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
366
367     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
368             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
369     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
370             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
371     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
372             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
373     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
374             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
375     w1_t[0] = 0x80000000;
376     w1_t[1] = 0;
377     w1_t[2] = 0;
378     w1_t[3] = 0;
379     w2_t[0] = 0;
380     w2_t[1] = 0;
381     w2_t[2] = 0;
382     w2_t[3] = 0;
383     w3_t[0] = 0;
384     w3_t[1] = 0;
385     w3_t[2] = 0;
386     w3_t[3] = 80 * 8;
387
388     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
389
390     a = digest[0];
391     b = digest[1];
392     c = digest[2];
393     d = digest[3];
394     e = digest[4];
395
396     w0_t[0] = salt_buf0[0];
397     w0_t[1] = salt_buf0[1];
398     w0_t[2] = salt_buf0[2];
399     w0_t[3] = salt_buf0[3];
400     w1_t[0] = salt_buf1[0];
401     w1_t[1] = salt_buf1[1];
402     w1_t[2] = salt_buf1[2];
403     w1_t[3] = salt_buf1[3];
404     w2_t[0] = salt_buf2[0];
405     w2_t[1] = salt_buf2[1];
406     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
407             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
408     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
409             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
410     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
411             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
412     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
413             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
414     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
415             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
416     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
417             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
418
419     digest[0] = SHA1M_A;
420     digest[1] = SHA1M_B;
421     digest[2] = SHA1M_C;
422     digest[3] = SHA1M_D;
423     digest[4] = SHA1M_E;
424
425     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
426
427     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
428             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
429     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
430             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
431     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
432             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
433     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
434             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
435     w1_t[0] = 0x80000000;
436     w1_t[1] = 0;
437     w1_t[2] = 0;
438     w1_t[3] = 0;
439     w2_t[0] = 0;
440     w2_t[1] = 0;
441     w2_t[2] = 0;
442     w2_t[3] = 0;
443     w3_t[0] = 0;
444     w3_t[1] = 0;
445     w3_t[2] = 0;
446     w3_t[3] = 80 * 8;
447
448     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
449
450     COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]);
451   }
452 }
453
454 __kernel void m08400_m08 (__global pw_t *pws, __global kernel_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
455 {
456 }
457
458 __kernel void m08400_m16 (__global pw_t *pws, __global kernel_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
459 {
460 }
461
462 __kernel void m08400_s04 (__global pw_t *pws, __global kernel_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
463 {
464   /**
465    * modifier
466    */
467
468   const u32 gid = get_global_id (0);
469   const u32 lid = get_local_id (0);
470   const u32 lsz = get_local_size (0);
471
472   /**
473    * shared
474    */
475
476   __local u32 l_bin2asc[256];
477
478   for (u32 i = lid; i < 256; i += lsz)
479   {
480     const u32 i0 = (i >> 0) & 15;
481     const u32 i1 = (i >> 4) & 15;
482
483     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
484                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
485   }
486
487   barrier (CLK_LOCAL_MEM_FENCE);
488
489   if (gid >= gid_max) return;
490
491   /**
492    * base
493    */
494
495   u32 pws0[4] = { 0 };
496   u32 pws1[4] = { 0 };
497
498   pws0[0] = pws[gid].i[0];
499   pws0[1] = pws[gid].i[1];
500   pws0[2] = pws[gid].i[2];
501   pws0[3] = pws[gid].i[3];
502   pws1[0] = pws[gid].i[4];
503   pws1[1] = pws[gid].i[5];
504   pws1[2] = pws[gid].i[6];
505   pws1[3] = pws[gid].i[7];
506
507   const u32 pw_l_len = pws[gid].pw_len;
508
509   /**
510    * salt
511    */
512
513   u32 salt_buf0[4];
514
515   salt_buf0[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 0]);
516   salt_buf0[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 1]);
517   salt_buf0[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 2]);
518   salt_buf0[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 3]);
519
520   u32 salt_buf1[4];
521
522   salt_buf1[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 4]);
523   salt_buf1[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 5]);
524   salt_buf1[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 6]);
525   salt_buf1[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 7]);
526
527   u32 salt_buf2[4];
528
529   salt_buf2[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 8]);
530   salt_buf2[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 9]);
531   salt_buf2[2] = 0;
532   salt_buf2[3] = 0;
533
534   const u32 salt_len = salt_bufs[salt_pos].salt_len;
535
536   /**
537    * digest
538    */
539
540   const u32 search[4] =
541   {
542     digests_buf[digests_offset].digest_buf[DGST_R0],
543     digests_buf[digests_offset].digest_buf[DGST_R1],
544     digests_buf[digests_offset].digest_buf[DGST_R2],
545     digests_buf[digests_offset].digest_buf[DGST_R3]
546   };
547
548   /**
549    * loop
550    */
551
552   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
553   {
554     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
555
556     const u32x pw_len = pw_l_len + pw_r_len;
557
558     u32x wordr0[4] = { 0 };
559     u32x wordr1[4] = { 0 };
560     u32x wordr2[4] = { 0 };
561     u32x wordr3[4] = { 0 };
562
563     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
564     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
565     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
566     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
567     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
568     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
569     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
570     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
571
572     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
573     {
574       append_0x80_2x4 (wordr0, wordr1, pw_r_len);
575
576       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
577     }
578
579     u32x w0[4];
580
581     w0[0] = wordl0[0] | wordr0[0];
582     w0[1] = wordl0[1] | wordr0[1];
583     w0[2] = wordl0[2] | wordr0[2];
584     w0[3] = wordl0[3] | wordr0[3];
585
586     u32x w1[4];
587
588     w1[0] = wordl1[0] | wordr1[0];
589     w1[1] = wordl1[1] | wordr1[1];
590     w1[2] = wordl1[2] | wordr1[2];
591     w1[3] = wordl1[3] | wordr1[3];
592
593     u32x w2[4];
594
595     w2[0] = wordl2[0] | wordr2[0];
596     w2[1] = wordl2[1] | wordr2[1];
597     w2[2] = wordl2[2] | wordr2[2];
598     w2[3] = wordl2[3] | wordr2[3];
599
600     u32x w3[4];
601
602     w3[0] = wordl3[0] | wordr3[0];
603     w3[1] = wordl3[1] | wordr3[1];
604     w3[2] = wordl3[2] | wordr3[2];
605     w3[3] = wordl3[3] | wordr3[3];
606
607     u32x w0_t[4];
608
609     w0_t[0] = swap32 (w0[0]);
610     w0_t[1] = swap32 (w0[1]);
611     w0_t[2] = swap32 (w0[2]);
612     w0_t[3] = swap32 (w0[3]);
613
614     u32x w1_t[4];
615
616     w1_t[0] = swap32 (w1[0]);
617     w1_t[1] = swap32 (w1[1]);
618     w1_t[2] = swap32 (w1[2]);
619     w1_t[3] = swap32 (w1[3]);
620
621     u32x w2_t[4];
622
623     w2_t[0] = swap32 (w2[0]);
624     w2_t[1] = swap32 (w2[1]);
625     w2_t[2] = swap32 (w2[2]);
626     w2_t[3] = swap32 (w2[3]);
627
628     u32x w3_t[4];
629
630     w3_t[0] = swap32 (w3[0]);
631     w3_t[1] = swap32 (w3[1]);
632     w3_t[2] = 0;
633     w3_t[3] = pw_len * 8;
634
635     u32 digest[5];
636
637     digest[0] = SHA1M_A;
638     digest[1] = SHA1M_B;
639     digest[2] = SHA1M_C;
640     digest[3] = SHA1M_D;
641     digest[4] = SHA1M_E;
642
643     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
644
645     u32 a;
646     u32 b;
647     u32 c;
648     u32 d;
649     u32 e;
650
651     a = digest[0];
652     b = digest[1];
653     c = digest[2];
654     d = digest[3];
655     e = digest[4];
656
657     w0_t[0] = salt_buf0[0];
658     w0_t[1] = salt_buf0[1];
659     w0_t[2] = salt_buf0[2];
660     w0_t[3] = salt_buf0[3];
661     w1_t[0] = salt_buf1[0];
662     w1_t[1] = salt_buf1[1];
663     w1_t[2] = salt_buf1[2];
664     w1_t[3] = salt_buf1[3];
665     w2_t[0] = salt_buf2[0];
666     w2_t[1] = salt_buf2[1];
667     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
668             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
669     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
670             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
671     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
672             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
673     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
674             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
675     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
676             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
677     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
678             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
679
680     digest[0] = SHA1M_A;
681     digest[1] = SHA1M_B;
682     digest[2] = SHA1M_C;
683     digest[3] = SHA1M_D;
684     digest[4] = SHA1M_E;
685
686     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
687
688     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
689             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
690     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
691             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
692     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
693             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
694     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
695             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
696     w1_t[0] = 0x80000000;
697     w1_t[1] = 0;
698     w1_t[2] = 0;
699     w1_t[3] = 0;
700     w2_t[0] = 0;
701     w2_t[1] = 0;
702     w2_t[2] = 0;
703     w2_t[3] = 0;
704     w3_t[0] = 0;
705     w3_t[1] = 0;
706     w3_t[2] = 0;
707     w3_t[3] = (salt_len + 40) * 8;
708
709     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
710
711     a = digest[0];
712     b = digest[1];
713     c = digest[2];
714     d = digest[3];
715     e = digest[4];
716
717     w0_t[0] = salt_buf0[0];
718     w0_t[1] = salt_buf0[1];
719     w0_t[2] = salt_buf0[2];
720     w0_t[3] = salt_buf0[3];
721     w1_t[0] = salt_buf1[0];
722     w1_t[1] = salt_buf1[1];
723     w1_t[2] = salt_buf1[2];
724     w1_t[3] = salt_buf1[3];
725     w2_t[0] = salt_buf2[0];
726     w2_t[1] = salt_buf2[1];
727     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
728             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
729     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
730             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
731     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
732             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
733     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
734             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
735     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
736             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
737     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
738             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
739
740     digest[0] = SHA1M_A;
741     digest[1] = SHA1M_B;
742     digest[2] = SHA1M_C;
743     digest[3] = SHA1M_D;
744     digest[4] = SHA1M_E;
745
746     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
747
748     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
749             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
750     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
751             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
752     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
753             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
754     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
755             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
756     w1_t[0] = 0x80000000;
757     w1_t[1] = 0;
758     w1_t[2] = 0;
759     w1_t[3] = 0;
760     w2_t[0] = 0;
761     w2_t[1] = 0;
762     w2_t[2] = 0;
763     w2_t[3] = 0;
764     w3_t[0] = 0;
765     w3_t[1] = 0;
766     w3_t[2] = 0;
767     w3_t[3] = (salt_len + 40) * 8;
768
769     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
770
771     COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]);
772   }
773 }
774
775 __kernel void m08400_s08 (__global pw_t *pws, __global kernel_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
776 {
777 }
778
779 __kernel void m08400_s16 (__global pw_t *pws, __global kernel_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
780 {
781 }