Fixed two major problems
[hashcat.git] / OpenCL / m08300_a0.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 "include/rp_kernel.h"
22 #include "OpenCL/rp.c"
23 #include "OpenCL/simd.c"
24
25 static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5])
26 {
27   u32x A = digest[0];
28   u32x B = digest[1];
29   u32x C = digest[2];
30   u32x D = digest[3];
31   u32x E = digest[4];
32
33   u32x w0_t = w0[0];
34   u32x w1_t = w0[1];
35   u32x w2_t = w0[2];
36   u32x w3_t = w0[3];
37   u32x w4_t = w1[0];
38   u32x w5_t = w1[1];
39   u32x w6_t = w1[2];
40   u32x w7_t = w1[3];
41   u32x w8_t = w2[0];
42   u32x w9_t = w2[1];
43   u32x wa_t = w2[2];
44   u32x wb_t = w2[3];
45   u32x wc_t = w3[0];
46   u32x wd_t = w3[1];
47   u32x we_t = w3[2];
48   u32x 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 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 il_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 lid = get_local_id (0);
160
161   /**
162    * base
163    */
164
165   const u32 gid = get_global_id (0);
166
167   if (gid >= gid_max) return;
168
169   u32 pw_buf0[4];
170
171   pw_buf0[0] = pws[gid].i[ 0];
172   pw_buf0[1] = pws[gid].i[ 1];
173   pw_buf0[2] = pws[gid].i[ 2];
174   pw_buf0[3] = pws[gid].i[ 3];
175
176   u32 pw_buf1[4];
177
178   pw_buf1[0] = pws[gid].i[ 4];
179   pw_buf1[1] = pws[gid].i[ 5];
180   pw_buf1[2] = pws[gid].i[ 6];
181   pw_buf1[3] = pws[gid].i[ 7];
182
183   const u32 pw_len = pws[gid].pw_len;
184
185   /**
186    * salt
187    */
188
189   const u32 salt_iter = salt_bufs[salt_pos].salt_iter;
190
191   u32 salt_buf0[4];
192
193   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
194   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
195   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
196   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
197
198   u32 salt_buf1[4];
199
200   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
201   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
202   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
203   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
204
205   const u32 salt_len = salt_bufs[salt_pos].salt_len;
206
207   u32 domain_buf0[4];
208
209   domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0];
210   domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1];
211   domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2];
212   domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3];
213
214   u32 domain_buf1[4];
215
216   domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4];
217   domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5];
218   domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6];
219   domain_buf1[3] = 0;
220
221   const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7];
222
223   /**
224    * loop
225    */
226
227   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
228   {
229     u32x w0[4] = { 0 };
230     u32x w1[4] = { 0 };
231     u32x w2[4] = { 0 };
232     u32x w3[4] = { 0 };
233
234     const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
235
236     u32x w0_t[4];
237
238     w0_t[0] = w0[0];
239     w0_t[1] = w0[1];
240     w0_t[2] = w0[2];
241     w0_t[3] = w0[3];
242
243     u32x w1_t[4];
244
245     w1_t[0] = w1[0];
246     w1_t[1] = w1[1];
247     w1_t[2] = w1[2];
248     w1_t[3] = w1[3];
249
250     u32x w2_t[4];
251
252     w2_t[0] = w2[0];
253     w2_t[1] = w2[1];
254     w2_t[2] = w2[2];
255     w2_t[3] = w2[3];
256
257     u32x w3_t[4];
258
259     w3_t[0] = w3[0];
260     w3_t[1] = w3[1];
261     w3_t[2] = w3[2];
262     w3_t[3] = w3[3];
263
264     switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, 1);
265
266     w0_t[0] |= out_len & 0xff;
267
268     /**
269      * salt
270      */
271
272     u32x s0[4];
273
274     s0[0] = salt_buf0[0];
275     s0[1] = salt_buf0[1];
276     s0[2] = salt_buf0[2];
277     s0[3] = salt_buf0[3];
278
279     u32x s1[4];
280
281     s1[0] = salt_buf1[0];
282     s1[1] = salt_buf1[1];
283     s1[2] = salt_buf1[2];
284     s1[3] = salt_buf1[3];
285
286     u32x s2[4];
287
288     s2[0] = 0;
289     s2[1] = 0;
290     s2[2] = 0;
291     s2[3] = 0;
292
293     u32x s3[4];
294
295     s3[0] = 0;
296     s3[1] = 0;
297     s3[2] = 0;
298     s3[3] = 0;
299
300     switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + out_len + domain_len + 1);
301
302     u32x d0[4];
303
304     d0[0] = domain_buf0[0];
305     d0[1] = domain_buf0[1];
306     d0[2] = domain_buf0[2];
307     d0[3] = domain_buf0[3];
308
309     u32x d1[4];
310
311     d1[0] = domain_buf1[0];
312     d1[1] = domain_buf1[1];
313     d1[2] = domain_buf1[2];
314     d1[3] = 0;
315
316     u32x d2[4];
317
318     d2[0] = 0;
319     d2[1] = 0;
320     d2[2] = 0;
321     d2[3] = 0;
322
323     u32x d3[4];
324
325     d3[0] = 0;
326     d3[1] = 0;
327     d3[2] = 0;
328     d3[3] = 0;
329
330     switch_buffer_by_offset_le_VV (d0, d1, d2, d3, 1 + out_len);
331
332     /**
333      * sha1
334      */
335
336     u32x w0_t2[4];
337
338     w0_t2[0] = swap32 (w0_t[0] | d0[0] | s0[0]);
339     w0_t2[1] = swap32 (w0_t[1] | d0[1] | s0[1]);
340     w0_t2[2] = swap32 (w0_t[2] | d0[2] | s0[2]);
341     w0_t2[3] = swap32 (w0_t[3] | d0[3] | s0[3]);
342
343     u32x w1_t2[4];
344
345     w1_t2[0] = swap32 (w1_t[0] | d1[0] | s1[0]);
346     w1_t2[1] = swap32 (w1_t[1] | d1[1] | s1[1]);
347     w1_t2[2] = swap32 (w1_t[2] | d1[2] | s1[2]);
348     w1_t2[3] = swap32 (w1_t[3] | d1[3] | s1[3]);
349
350     u32x w2_t2[4];
351
352     w2_t2[0] = swap32 (w2_t[0] | d2[0] | s2[0]);
353     w2_t2[1] = swap32 (w2_t[1] | d2[1] | s2[1]);
354     w2_t2[2] = swap32 (w2_t[2] | d2[2] | s2[2]);
355     w2_t2[3] = swap32 (w2_t[3] | d2[3] | s2[3]);
356
357     u32x w3_t2[4];
358
359     w3_t2[0] = swap32 (w3_t[0] | d3[0] | s3[0]);
360     w3_t2[1] = swap32 (w3_t[1] | d3[1] | s3[1]);
361     w3_t2[2] = 0;
362     w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8;
363
364     u32x digest[5];
365
366     digest[0] = SHA1M_A;
367     digest[1] = SHA1M_B;
368     digest[2] = SHA1M_C;
369     digest[3] = SHA1M_D;
370     digest[4] = SHA1M_E;
371
372     sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest);
373
374     // iterations
375
376     for (u32 i = 0; i < salt_iter; i++)
377     {
378       u32x w0_t3[4];
379
380       w0_t3[0] = digest[0];
381       w0_t3[1] = digest[1];
382       w0_t3[2] = digest[2];
383       w0_t3[3] = digest[3];
384
385       u32x w1_t3[4];
386
387       w1_t3[0] = digest[4];
388       w1_t3[1] = swap32 (salt_buf0[0]);
389       w1_t3[2] = swap32 (salt_buf0[1]);
390       w1_t3[3] = swap32 (salt_buf0[2]);
391
392       u32x w2_t3[4];
393
394       w2_t3[0] = swap32 (salt_buf0[3]);
395       w2_t3[1] = swap32 (salt_buf1[0]);
396       w2_t3[2] = swap32 (salt_buf1[1]);
397       w2_t3[3] = swap32 (salt_buf1[2]);
398
399       u32x w3_t3[4];
400
401       w3_t3[0] = swap32 (salt_buf1[3]);
402       w3_t3[1] = 0;
403       w3_t3[2] = 0;
404       w3_t3[3] = (20 + salt_len) * 8;
405
406       digest[0] = SHA1M_A;
407       digest[1] = SHA1M_B;
408       digest[2] = SHA1M_C;
409       digest[3] = SHA1M_D;
410       digest[4] = SHA1M_E;
411
412       sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest);
413     }
414
415     COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]);
416   }
417 }
418
419 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
420 {
421 }
422
423 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
424 {
425 }
426
427 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
428 {
429   /**
430    * modifier
431    */
432
433   const u32 lid = get_local_id (0);
434
435   /**
436    * base
437    */
438
439   const u32 gid = get_global_id (0);
440
441   if (gid >= gid_max) return;
442
443   u32 pw_buf0[4];
444
445   pw_buf0[0] = pws[gid].i[ 0];
446   pw_buf0[1] = pws[gid].i[ 1];
447   pw_buf0[2] = pws[gid].i[ 2];
448   pw_buf0[3] = pws[gid].i[ 3];
449
450   u32 pw_buf1[4];
451
452   pw_buf1[0] = pws[gid].i[ 4];
453   pw_buf1[1] = pws[gid].i[ 5];
454   pw_buf1[2] = pws[gid].i[ 6];
455   pw_buf1[3] = pws[gid].i[ 7];
456
457   const u32 pw_len = pws[gid].pw_len;
458
459   /**
460    * salt
461    */
462
463   const u32 salt_iter = salt_bufs[salt_pos].salt_iter;
464
465   u32 salt_buf0[4];
466
467   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
468   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
469   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
470   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
471
472   u32 salt_buf1[4];
473
474   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
475   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
476   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
477   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
478
479   const u32 salt_len = salt_bufs[salt_pos].salt_len;
480
481   u32 domain_buf0[4];
482
483   domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0];
484   domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1];
485   domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2];
486   domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3];
487
488   u32 domain_buf1[4];
489
490   domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4];
491   domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5];
492   domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6];
493   domain_buf1[3] = 0;
494
495   const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7];
496
497   /**
498    * digest
499    */
500
501   const u32 search[4] =
502   {
503     digests_buf[digests_offset].digest_buf[DGST_R0],
504     digests_buf[digests_offset].digest_buf[DGST_R1],
505     digests_buf[digests_offset].digest_buf[DGST_R2],
506     digests_buf[digests_offset].digest_buf[DGST_R3]
507   };
508
509   /**
510    * loop
511    */
512
513   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
514   {
515     u32x w0[4] = { 0 };
516     u32x w1[4] = { 0 };
517     u32x w2[4] = { 0 };
518     u32x w3[4] = { 0 };
519
520     const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
521
522     u32x w0_t[4];
523
524     w0_t[0] = w0[0];
525     w0_t[1] = w0[1];
526     w0_t[2] = w0[2];
527     w0_t[3] = w0[3];
528
529     u32x w1_t[4];
530
531     w1_t[0] = w1[0];
532     w1_t[1] = w1[1];
533     w1_t[2] = w1[2];
534     w1_t[3] = w1[3];
535
536     u32x w2_t[4];
537
538     w2_t[0] = w2[0];
539     w2_t[1] = w2[1];
540     w2_t[2] = w2[2];
541     w2_t[3] = w2[3];
542
543     u32x w3_t[4];
544
545     w3_t[0] = w3[0];
546     w3_t[1] = w3[1];
547     w3_t[2] = w3[2];
548     w3_t[3] = w3[3];
549
550     switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, 1);
551
552     w0_t[0] |= out_len & 0xff;
553
554     /**
555      * salt
556      */
557
558     u32x s0[4];
559
560     s0[0] = salt_buf0[0];
561     s0[1] = salt_buf0[1];
562     s0[2] = salt_buf0[2];
563     s0[3] = salt_buf0[3];
564
565     u32x s1[4];
566
567     s1[0] = salt_buf1[0];
568     s1[1] = salt_buf1[1];
569     s1[2] = salt_buf1[2];
570     s1[3] = salt_buf1[3];
571
572     u32x s2[4];
573
574     s2[0] = 0;
575     s2[1] = 0;
576     s2[2] = 0;
577     s2[3] = 0;
578
579     u32x s3[4];
580
581     s3[0] = 0;
582     s3[1] = 0;
583     s3[2] = 0;
584     s3[3] = 0;
585
586     switch_buffer_by_offset_le_VV (s0, s1, s2, s3, 1 + out_len + domain_len + 1);
587
588     u32x d0[4];
589
590     d0[0] = domain_buf0[0];
591     d0[1] = domain_buf0[1];
592     d0[2] = domain_buf0[2];
593     d0[3] = domain_buf0[3];
594
595     u32x d1[4];
596
597     d1[0] = domain_buf1[0];
598     d1[1] = domain_buf1[1];
599     d1[2] = domain_buf1[2];
600     d1[3] = 0;
601
602     u32x d2[4];
603
604     d2[0] = 0;
605     d2[1] = 0;
606     d2[2] = 0;
607     d2[3] = 0;
608
609     u32x d3[4];
610
611     d3[0] = 0;
612     d3[1] = 0;
613     d3[2] = 0;
614     d3[3] = 0;
615
616     switch_buffer_by_offset_le_VV (d0, d1, d2, d3, 1 + out_len);
617
618     /**
619      * sha1
620      */
621
622     u32x w0_t2[4];
623
624     w0_t2[0] = swap32 (w0_t[0] | d0[0] | s0[0]);
625     w0_t2[1] = swap32 (w0_t[1] | d0[1] | s0[1]);
626     w0_t2[2] = swap32 (w0_t[2] | d0[2] | s0[2]);
627     w0_t2[3] = swap32 (w0_t[3] | d0[3] | s0[3]);
628
629     u32x w1_t2[4];
630
631     w1_t2[0] = swap32 (w1_t[0] | d1[0] | s1[0]);
632     w1_t2[1] = swap32 (w1_t[1] | d1[1] | s1[1]);
633     w1_t2[2] = swap32 (w1_t[2] | d1[2] | s1[2]);
634     w1_t2[3] = swap32 (w1_t[3] | d1[3] | s1[3]);
635
636     u32x w2_t2[4];
637
638     w2_t2[0] = swap32 (w2_t[0] | d2[0] | s2[0]);
639     w2_t2[1] = swap32 (w2_t[1] | d2[1] | s2[1]);
640     w2_t2[2] = swap32 (w2_t[2] | d2[2] | s2[2]);
641     w2_t2[3] = swap32 (w2_t[3] | d2[3] | s2[3]);
642
643     u32x w3_t2[4];
644
645     w3_t2[0] = swap32 (w3_t[0] | d3[0] | s3[0]);
646     w3_t2[1] = swap32 (w3_t[1] | d3[1] | s3[1]);
647     w3_t2[2] = 0;
648     w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8;
649
650     u32x digest[5];
651
652     digest[0] = SHA1M_A;
653     digest[1] = SHA1M_B;
654     digest[2] = SHA1M_C;
655     digest[3] = SHA1M_D;
656     digest[4] = SHA1M_E;
657
658     sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest);
659
660     // iterations
661
662     for (u32 i = 0; i < salt_iter; i++)
663     {
664       u32x w0_t3[4];
665
666       w0_t3[0] = digest[0];
667       w0_t3[1] = digest[1];
668       w0_t3[2] = digest[2];
669       w0_t3[3] = digest[3];
670
671       u32x w1_t3[4];
672
673       w1_t3[0] = digest[4];
674       w1_t3[1] = swap32 (salt_buf0[0]);
675       w1_t3[2] = swap32 (salt_buf0[1]);
676       w1_t3[3] = swap32 (salt_buf0[2]);
677
678       u32x w2_t3[4];
679
680       w2_t3[0] = swap32 (salt_buf0[3]);
681       w2_t3[1] = swap32 (salt_buf1[0]);
682       w2_t3[2] = swap32 (salt_buf1[1]);
683       w2_t3[3] = swap32 (salt_buf1[2]);
684
685       u32x w3_t3[4];
686
687       w3_t3[0] = swap32 (salt_buf1[3]);
688       w3_t3[1] = 0;
689       w3_t3[2] = 0;
690       w3_t3[3] = (20 + salt_len) * 8;
691
692       digest[0] = SHA1M_A;
693       digest[1] = SHA1M_B;
694       digest[2] = SHA1M_C;
695       digest[3] = SHA1M_D;
696       digest[4] = SHA1M_E;
697
698       sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest);
699     }
700
701     COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]);
702   }
703 }
704
705 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
706 {
707 }
708
709 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
710 {
711 }