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