New SIMD code for -a 1 -m 40
[hashcat.git] / OpenCL / m00040_a1.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MD5_
7
8 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 3
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 // no unicode yet
24
25 __kernel void m00040_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)
26 {
27   /**
28    * modifier
29    */
30
31   const u32 lid = get_local_id (0);
32
33   /**
34    * base
35    */
36
37   const u32 gid = get_global_id (0);
38
39   if (gid >= gid_max) return;
40
41   u32 pws0[4] = { 0 };
42   u32 pws1[4] = { 0 };
43
44   pws0[0] = pws[gid].i[0];
45   pws0[1] = pws[gid].i[1];
46   pws0[2] = pws[gid].i[2];
47   pws0[3] = pws[gid].i[3];
48   pws1[0] = pws[gid].i[4];
49   pws1[1] = pws[gid].i[5];
50   pws1[2] = pws[gid].i[6];
51   pws1[3] = pws[gid].i[7];
52
53   const u32 pw_l_len = pws[gid].pw_len;
54
55   /**
56    * salt
57    */
58
59   u32 salt_buf0[4];
60   u32 salt_buf1[4];
61
62   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
63   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
64   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
65   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
66   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
67   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
68   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
69   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
70
71   const u32 salt_len = salt_bufs[salt_pos].salt_len;
72
73   /**
74    * loop
75    */
76
77   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
78   {
79     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
80
81     const u32x pw_len = pw_l_len + pw_r_len;
82
83     /**
84      * concat password candidate
85      */
86
87     u32x wordl0[4] = { 0 };
88     u32x wordl1[4] = { 0 };
89     u32x wordl2[4] = { 0 };
90     u32x wordl3[4] = { 0 };
91
92     wordl0[0] = pws0[0];
93     wordl0[1] = pws0[1];
94     wordl0[2] = pws0[2];
95     wordl0[3] = pws0[3];
96     wordl1[0] = pws1[0];
97     wordl1[1] = pws1[1];
98     wordl1[2] = pws1[2];
99     wordl1[3] = pws1[3];
100
101     u32x wordr0[4] = { 0 };
102     u32x wordr1[4] = { 0 };
103     u32x wordr2[4] = { 0 };
104     u32x wordr3[4] = { 0 };
105
106     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
107     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
108     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
109     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
110     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
111     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
112     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
113     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
114
115     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
116     {
117       switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
118     }
119     else
120     {
121       switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
122     }
123
124     u32x w0[4];
125     u32x w1[4];
126     u32x w2[4];
127     u32x w3[4];
128
129     w0[0] = wordl0[0] | wordr0[0];
130     w0[1] = wordl0[1] | wordr0[1];
131     w0[2] = wordl0[2] | wordr0[2];
132     w0[3] = wordl0[3] | wordr0[3];
133     w1[0] = wordl1[0] | wordr1[0];
134     w1[1] = wordl1[1] | wordr1[1];
135     w1[2] = wordl1[2] | wordr1[2];
136     w1[3] = 0;
137     w2[0] = 0;
138     w2[1] = 0;
139     w2[2] = 0;
140     w2[3] = 0;
141     w3[0] = 0;
142     w3[1] = 0;
143     w3[2] = 0;
144     w3[3] = 0;
145
146     make_unicode (w1, w2, w3);
147     make_unicode (w0, w0, w1);
148
149     const u32x pw_len2 = pw_len * 2;
150
151     /**
152      * prepend salt
153      */
154
155     switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len);
156
157     const u32x pw_salt_len = pw_len2 + salt_len;
158
159     w0[0] |= salt_buf0[0];
160     w0[1] |= salt_buf0[1];
161     w0[2] |= salt_buf0[2];
162     w0[3] |= salt_buf0[3];
163     w1[0] |= salt_buf1[0];
164     w1[1] |= salt_buf1[1];
165     w1[2] |= salt_buf1[2];
166     w1[3] |= salt_buf1[3];
167     w2[0] |= 0;
168     w2[1] |= 0;
169     w2[2] |= 0;
170     w2[3] |= 0;
171     w3[0] |= 0;
172     w3[1] |= 0;
173     w3[2]  = pw_salt_len * 8;
174     w3[3]  = 0;
175
176     /**
177      * md5
178      */
179
180     u32x a = MD5M_A;
181     u32x b = MD5M_B;
182     u32x c = MD5M_C;
183     u32x d = MD5M_D;
184
185     MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00);
186     MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01);
187     MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02);
188     MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03);
189     MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00);
190     MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01);
191     MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02);
192     MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03);
193     MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00);
194     MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01);
195     MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02);
196     MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03);
197     MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00);
198     MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01);
199     MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02);
200     MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03);
201
202     MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10);
203     MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11);
204     MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12);
205     MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13);
206     MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10);
207     MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11);
208     MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12);
209     MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13);
210     MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10);
211     MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11);
212     MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12);
213     MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13);
214     MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10);
215     MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11);
216     MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12);
217     MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13);
218
219     MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20);
220     MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21);
221     MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22);
222     MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23);
223     MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20);
224     MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21);
225     MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22);
226     MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23);
227     MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20);
228     MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21);
229     MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22);
230     MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23);
231     MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20);
232     MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21);
233     MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22);
234     MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23);
235
236     MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30);
237     MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31);
238     MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32);
239     MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33);
240     MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30);
241     MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31);
242     MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32);
243     MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33);
244     MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30);
245     MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31);
246     MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32);
247     MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33);
248     MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30);
249     MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31);
250     MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32);
251     MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33);
252
253     COMPARE_M_SIMD (a, d, c, b);
254   }
255 }
256
257 __kernel void m00040_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)
258 {
259 }
260
261 __kernel void m00040_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)
262 {
263 }
264
265 __kernel void m00040_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)
266 {
267   /**
268    * modifier
269    */
270
271   const u32 lid = get_local_id (0);
272
273   /**
274    * base
275    */
276
277   const u32 gid = get_global_id (0);
278
279   if (gid >= gid_max) return;
280
281   u32 pws0[4] = { 0 };
282   u32 pws1[4] = { 0 };
283
284   pws0[0] = pws[gid].i[0];
285   pws0[1] = pws[gid].i[1];
286   pws0[2] = pws[gid].i[2];
287   pws0[3] = pws[gid].i[3];
288   pws1[0] = pws[gid].i[4];
289   pws1[1] = pws[gid].i[5];
290   pws1[2] = pws[gid].i[6];
291   pws1[3] = pws[gid].i[7];
292
293   const u32 pw_l_len = pws[gid].pw_len;
294
295   /**
296    * salt
297    */
298
299   u32 salt_buf0[4];
300   u32 salt_buf1[4];
301
302   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
303   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
304   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
305   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
306   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
307   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
308   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
309   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
310
311   const u32 salt_len = salt_bufs[salt_pos].salt_len;
312
313   /**
314    * digest
315    */
316
317   const u32 search[4] =
318   {
319     digests_buf[digests_offset].digest_buf[DGST_R0],
320     digests_buf[digests_offset].digest_buf[DGST_R1],
321     digests_buf[digests_offset].digest_buf[DGST_R2],
322     digests_buf[digests_offset].digest_buf[DGST_R3]
323   };
324
325   /**
326    * loop
327    */
328
329   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
330   {
331     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
332
333     const u32x pw_len = pw_l_len + pw_r_len;
334
335     /**
336      * concat password candidate
337      */
338
339     u32x wordl0[4] = { 0 };
340     u32x wordl1[4] = { 0 };
341     u32x wordl2[4] = { 0 };
342     u32x wordl3[4] = { 0 };
343
344     wordl0[0] = pws0[0];
345     wordl0[1] = pws0[1];
346     wordl0[2] = pws0[2];
347     wordl0[3] = pws0[3];
348     wordl1[0] = pws1[0];
349     wordl1[1] = pws1[1];
350     wordl1[2] = pws1[2];
351     wordl1[3] = pws1[3];
352
353     u32x wordr0[4] = { 0 };
354     u32x wordr1[4] = { 0 };
355     u32x wordr2[4] = { 0 };
356     u32x wordr3[4] = { 0 };
357
358     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
359     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
360     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
361     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
362     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
363     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
364     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
365     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
366
367     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
368     {
369       switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
370     }
371     else
372     {
373       switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
374     }
375
376     u32x w0[4];
377     u32x w1[4];
378     u32x w2[4];
379     u32x w3[4];
380
381     w0[0] = wordl0[0] | wordr0[0];
382     w0[1] = wordl0[1] | wordr0[1];
383     w0[2] = wordl0[2] | wordr0[2];
384     w0[3] = wordl0[3] | wordr0[3];
385     w1[0] = wordl1[0] | wordr1[0];
386     w1[1] = wordl1[1] | wordr1[1];
387     w1[2] = wordl1[2] | wordr1[2];
388     w1[3] = 0;
389     w2[0] = 0;
390     w2[1] = 0;
391     w2[2] = 0;
392     w2[3] = 0;
393     w3[0] = 0;
394     w3[1] = 0;
395     w3[2] = 0;
396     w3[3] = 0;
397
398     make_unicode (w1, w2, w3);
399     make_unicode (w0, w0, w1);
400
401     const u32x pw_len2 = pw_len * 2;
402
403     /**
404      * prepend salt
405      */
406
407     switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len);
408
409     const u32x pw_salt_len = pw_len2 + salt_len;
410
411     w0[0] |= salt_buf0[0];
412     w0[1] |= salt_buf0[1];
413     w0[2] |= salt_buf0[2];
414     w0[3] |= salt_buf0[3];
415     w1[0] |= salt_buf1[0];
416     w1[1] |= salt_buf1[1];
417     w1[2] |= salt_buf1[2];
418     w1[3] |= salt_buf1[3];
419     w2[0] |= 0;
420     w2[1] |= 0;
421     w2[2] |= 0;
422     w2[3] |= 0;
423     w3[0] |= 0;
424     w3[1] |= 0;
425     w3[2]  = pw_salt_len * 8;
426     w3[3]  = 0;
427
428     /**
429      * md5
430      */
431
432     u32x a = MD5M_A;
433     u32x b = MD5M_B;
434     u32x c = MD5M_C;
435     u32x d = MD5M_D;
436
437     MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00);
438     MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01);
439     MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02);
440     MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03);
441     MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00);
442     MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01);
443     MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02);
444     MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03);
445     MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00);
446     MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01);
447     MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02);
448     MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03);
449     MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00);
450     MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01);
451     MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02);
452     MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03);
453
454     MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10);
455     MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11);
456     MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12);
457     MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13);
458     MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10);
459     MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11);
460     MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12);
461     MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13);
462     MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10);
463     MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11);
464     MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12);
465     MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13);
466     MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10);
467     MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11);
468     MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12);
469     MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13);
470
471     MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20);
472     MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21);
473     MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22);
474     MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23);
475     MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20);
476     MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21);
477     MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22);
478     MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23);
479     MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20);
480     MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21);
481     MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22);
482     MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23);
483     MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20);
484     MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21);
485     MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22);
486     MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23);
487
488     MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30);
489     MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31);
490     MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32);
491     MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33);
492     MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30);
493     MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31);
494     MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32);
495     MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33);
496     MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30);
497     MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31);
498     MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32);
499     MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33);
500     MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30);
501
502     if (MATCHES_NONE_VS (a, search[0])) continue;
503
504     MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31);
505     MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32);
506     MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33);
507
508     COMPARE_S_SIMD (a, d, c, b);
509   }
510 }
511
512 __kernel void m00040_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)
513 {
514 }
515
516 __kernel void m00040_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)
517 {
518 }