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