Initial commit
[hashcat.git] / amd / m00040_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MD5_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE4
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE4
21 #endif
22
23 #define DGST_R0 0
24 #define DGST_R1 3
25 #define DGST_R2 2
26 #define DGST_R3 1
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31
32 #ifdef  VECT_SIZE1
33 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
34 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
35 #endif
36
37 #ifdef  VECT_SIZE2
38 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
39 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
40 #endif
41
42 #ifdef  VECT_SIZE4
43 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
44 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
45 #endif
46
47 static void m00040m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
48 {
49   /**
50    * modifier
51    */
52
53   const u32 gid = get_global_id (0);
54   const u32 lid = get_local_id (0);
55
56   /**
57    * salt
58    */
59
60   u32 salt_buf0[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
67   u32 salt_buf1[4];
68
69   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
70   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
71   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
72   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
73
74   u32 salt_buf2[4];
75
76   salt_buf2[0] = 0;
77   salt_buf2[1] = 0;
78   salt_buf2[2] = 0;
79   salt_buf2[3] = 0;
80
81   u32 salt_buf3[4];
82
83   salt_buf3[0] = 0;
84   salt_buf3[1] = 0;
85   salt_buf3[2] = 0;
86   salt_buf3[3] = 0;
87
88   const u32 salt_len = salt_bufs[salt_pos].salt_len;
89
90   const u32 pw_salt_len = pw_len + salt_len;
91
92   /**
93    * loop
94    */
95
96   u32x w0l = w0[0];
97
98   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
99   {
100     const u32 w0r = bfs_buf[il_pos].i;
101
102     w0[0] = w0l | w0r;
103
104     /**
105      * prepend salt
106      */
107
108     u32x w0_t[4];
109     u32x w1_t[4];
110     u32x w2_t[4];
111     u32x w3_t[4];
112
113     w0_t[0] = w0[0];
114     w0_t[1] = w0[1];
115     w0_t[2] = w0[2];
116     w0_t[3] = w0[3];
117     w1_t[0] = w1[0];
118     w1_t[1] = w1[1];
119     w1_t[2] = w1[2];
120     w1_t[3] = w1[3];
121     w2_t[0] = w2[0];
122     w2_t[1] = w2[1];
123     w2_t[2] = w2[2];
124     w2_t[3] = w2[3];
125     w3_t[0] = w3[0];
126     w3_t[1] = w3[1];
127     w3_t[2] = w3[2];
128     w3_t[3] = w3[3];
129
130     switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len);
131
132     w3_t[2] = pw_salt_len * 8;
133
134     w0_t[0] |= salt_buf0[0];
135     w0_t[1] |= salt_buf0[1];
136     w0_t[2] |= salt_buf0[2];
137     w0_t[3] |= salt_buf0[3];
138     w1_t[0] |= salt_buf1[0];
139     w1_t[1] |= salt_buf1[1];
140     w1_t[2] |= salt_buf1[2];
141     w1_t[3] |= salt_buf1[3];
142     w2_t[0] |= salt_buf2[0];
143     w2_t[1] |= salt_buf2[1];
144     w2_t[2] |= salt_buf2[2];
145     w2_t[3] |= salt_buf2[3];
146     w3_t[0] |= salt_buf3[0];
147     w3_t[1] |= salt_buf3[1];
148     w3_t[2] |= salt_buf3[2];
149     w3_t[3] |= salt_buf3[3];
150
151     /**
152      * md5
153      */
154
155     u32x a = MD5M_A;
156     u32x b = MD5M_B;
157     u32x c = MD5M_C;
158     u32x d = MD5M_D;
159
160     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
161     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
162     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
163     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
164     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
165     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
166     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
167     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
168     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
169     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
170     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
171     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
172     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
173     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
174     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
175     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
176
177     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
178     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
179     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
180     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
181     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
182     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
183     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
184     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
185     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
186     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
187     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
188     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
189     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
190     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
191     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
192     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
193
194     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
195     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
196     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
197     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
198     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
199     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
200     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
201     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
202     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
203     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
204     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
205     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
206     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
207     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
208     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
209     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
210
211     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
212     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
213     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
214     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
215     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
216     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
217     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
218     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
219     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
220     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
221     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
222     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
223     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
224     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
225     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
226     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
227
228
229     const u32x r0 = a;
230     const u32x r1 = d;
231     const u32x r2 = c;
232     const u32x r3 = b;
233
234     #include VECT_COMPARE_M
235   }
236 }
237
238 static void m00040s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
239 {
240   /**
241    * modifier
242    */
243
244   const u32 gid = get_global_id (0);
245   const u32 lid = get_local_id (0);
246
247   /**
248    * digest
249    */
250
251   const u32 search[4] =
252   {
253     digests_buf[digests_offset].digest_buf[DGST_R0],
254     digests_buf[digests_offset].digest_buf[DGST_R1],
255     digests_buf[digests_offset].digest_buf[DGST_R2],
256     digests_buf[digests_offset].digest_buf[DGST_R3]
257   };
258
259   /**
260    * salt
261    */
262
263   u32 salt_buf0[4];
264
265   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
266   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
267   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
268   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
269
270   u32 salt_buf1[4];
271
272   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
273   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
274   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
275   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
276
277   u32 salt_buf2[4];
278
279   salt_buf2[0] = 0;
280   salt_buf2[1] = 0;
281   salt_buf2[2] = 0;
282   salt_buf2[3] = 0;
283
284   u32 salt_buf3[4];
285
286   salt_buf3[0] = 0;
287   salt_buf3[1] = 0;
288   salt_buf3[2] = 0;
289   salt_buf3[3] = 0;
290
291   const u32 salt_len = salt_bufs[salt_pos].salt_len;
292
293   const u32 pw_salt_len = pw_len + salt_len;
294
295   /**
296    * loop
297    */
298
299   u32x w0l = w0[0];
300
301   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
302   {
303     const u32 w0r = bfs_buf[il_pos].i;
304
305     w0[0] = w0l | w0r;
306
307     /**
308      * prepend salt
309      */
310
311     u32x w0_t[4];
312     u32x w1_t[4];
313     u32x w2_t[4];
314     u32x w3_t[4];
315
316     w0_t[0] = w0[0];
317     w0_t[1] = w0[1];
318     w0_t[2] = w0[2];
319     w0_t[3] = w0[3];
320     w1_t[0] = w1[0];
321     w1_t[1] = w1[1];
322     w1_t[2] = w1[2];
323     w1_t[3] = w1[3];
324     w2_t[0] = w2[0];
325     w2_t[1] = w2[1];
326     w2_t[2] = w2[2];
327     w2_t[3] = w2[3];
328     w3_t[0] = w3[0];
329     w3_t[1] = w3[1];
330     w3_t[2] = w3[2];
331     w3_t[3] = w3[3];
332
333     switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len);
334
335     w3_t[2] = pw_salt_len * 8;
336
337     w0_t[0] |= salt_buf0[0];
338     w0_t[1] |= salt_buf0[1];
339     w0_t[2] |= salt_buf0[2];
340     w0_t[3] |= salt_buf0[3];
341     w1_t[0] |= salt_buf1[0];
342     w1_t[1] |= salt_buf1[1];
343     w1_t[2] |= salt_buf1[2];
344     w1_t[3] |= salt_buf1[3];
345     w2_t[0] |= salt_buf2[0];
346     w2_t[1] |= salt_buf2[1];
347     w2_t[2] |= salt_buf2[2];
348     w2_t[3] |= salt_buf2[3];
349     w3_t[0] |= salt_buf3[0];
350     w3_t[1] |= salt_buf3[1];
351     w3_t[2] |= salt_buf3[2];
352     w3_t[3] |= salt_buf3[3];
353
354     /**
355      * md5
356      */
357
358     u32x a = MD5M_A;
359     u32x b = MD5M_B;
360     u32x c = MD5M_C;
361     u32x d = MD5M_D;
362
363     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
364     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
365     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
366     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
367     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
368     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
369     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
370     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
371     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
372     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
373     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
374     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
375     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
376     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
377     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
378     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
379
380     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
381     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
382     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
383     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
384     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
385     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
386     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
387     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
388     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
389     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
390     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
391     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
392     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
393     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
394     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
395     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
396
397     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
398     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
399     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
400     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
401     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
402     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
403     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
404     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
405     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
406     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
407     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
408     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
409     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
410     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
411     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
412     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
413
414     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
415     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
416     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
417     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
418     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
419     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
420     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
421     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
422     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
423     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
424     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
425     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
426     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
427
428     bool q_cond = allx (search[0] != a);
429
430     if (q_cond) continue;
431
432     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
433     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
434     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
435
436
437     const u32x r0 = a;
438     const u32x r1 = d;
439     const u32x r2 = c;
440     const u32x r3 = b;
441
442     #include VECT_COMPARE_S
443   }
444 }
445
446 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m04 (__global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
447 {
448   /**
449    * base
450    */
451
452   const u32 gid = get_global_id (0);
453
454   if (gid >= gid_max) return;
455
456   u32x w0[4];
457
458   w0[0] = pws[gid].i[ 0];
459   w0[1] = pws[gid].i[ 1];
460   w0[2] = pws[gid].i[ 2];
461   w0[3] = pws[gid].i[ 3];
462
463   u32x w1[4];
464
465   w1[0] = 0;
466   w1[1] = 0;
467   w1[2] = 0;
468   w1[3] = 0;
469
470   u32x w2[4];
471
472   w2[0] = 0;
473   w2[1] = 0;
474   w2[2] = 0;
475   w2[3] = 0;
476
477   u32x w3[4];
478
479   w3[0] = 0;
480   w3[1] = 0;
481   w3[2] = 0;
482   w3[3] = 0;
483
484   const u32 pw_len = pws[gid].pw_len;
485
486   /**
487    * main
488    */
489
490   m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
491 }
492
493 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m08 (__global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
494 {
495   /**
496    * base
497    */
498
499   const u32 gid = get_global_id (0);
500
501   if (gid >= gid_max) return;
502
503   u32x w0[4];
504
505   w0[0] = pws[gid].i[ 0];
506   w0[1] = pws[gid].i[ 1];
507   w0[2] = pws[gid].i[ 2];
508   w0[3] = pws[gid].i[ 3];
509
510   u32x w1[4];
511
512   w1[0] = pws[gid].i[ 4];
513   w1[1] = pws[gid].i[ 5];
514   w1[2] = pws[gid].i[ 6];
515   w1[3] = pws[gid].i[ 7];
516
517   u32x w2[4];
518
519   w2[0] = 0;
520   w2[1] = 0;
521   w2[2] = 0;
522   w2[3] = 0;
523
524   u32x w3[4];
525
526   w3[0] = 0;
527   w3[1] = 0;
528   w3[2] = 0;
529   w3[3] = 0;
530
531   const u32 pw_len = pws[gid].pw_len;
532
533   /**
534    * main
535    */
536
537   m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
538 }
539
540 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m16 (__global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
541 {
542   /**
543    * base
544    */
545
546   const u32 gid = get_global_id (0);
547
548   if (gid >= gid_max) return;
549
550   u32x w0[4];
551
552   w0[0] = pws[gid].i[ 0];
553   w0[1] = pws[gid].i[ 1];
554   w0[2] = pws[gid].i[ 2];
555   w0[3] = pws[gid].i[ 3];
556
557   u32x w1[4];
558
559   w1[0] = pws[gid].i[ 4];
560   w1[1] = pws[gid].i[ 5];
561   w1[2] = pws[gid].i[ 6];
562   w1[3] = pws[gid].i[ 7];
563
564   u32x w2[4];
565
566   w2[0] = pws[gid].i[ 8];
567   w2[1] = pws[gid].i[ 9];
568   w2[2] = pws[gid].i[10];
569   w2[3] = pws[gid].i[11];
570
571   u32x w3[4];
572
573   w3[0] = pws[gid].i[12];
574   w3[1] = pws[gid].i[13];
575   w3[2] = 0;
576   w3[3] = 0;
577
578   const u32 pw_len = pws[gid].pw_len;
579
580   /**
581    * main
582    */
583
584   m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
585 }
586
587 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s04 (__global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
588 {
589   /**
590    * base
591    */
592
593   const u32 gid = get_global_id (0);
594
595   if (gid >= gid_max) return;
596
597   u32x w0[4];
598
599   w0[0] = pws[gid].i[ 0];
600   w0[1] = pws[gid].i[ 1];
601   w0[2] = pws[gid].i[ 2];
602   w0[3] = pws[gid].i[ 3];
603
604   u32x w1[4];
605
606   w1[0] = 0;
607   w1[1] = 0;
608   w1[2] = 0;
609   w1[3] = 0;
610
611   u32x w2[4];
612
613   w2[0] = 0;
614   w2[1] = 0;
615   w2[2] = 0;
616   w2[3] = 0;
617
618   u32x w3[4];
619
620   w3[0] = 0;
621   w3[1] = 0;
622   w3[2] = 0;
623   w3[3] = 0;
624
625   const u32 pw_len = pws[gid].pw_len;
626
627   /**
628    * main
629    */
630
631   m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
632 }
633
634 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s08 (__global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
635 {
636   /**
637    * base
638    */
639
640   const u32 gid = get_global_id (0);
641
642   if (gid >= gid_max) return;
643
644   u32x w0[4];
645
646   w0[0] = pws[gid].i[ 0];
647   w0[1] = pws[gid].i[ 1];
648   w0[2] = pws[gid].i[ 2];
649   w0[3] = pws[gid].i[ 3];
650
651   u32x w1[4];
652
653   w1[0] = pws[gid].i[ 4];
654   w1[1] = pws[gid].i[ 5];
655   w1[2] = pws[gid].i[ 6];
656   w1[3] = pws[gid].i[ 7];
657
658   u32x w2[4];
659
660   w2[0] = 0;
661   w2[1] = 0;
662   w2[2] = 0;
663   w2[3] = 0;
664
665   u32x w3[4];
666
667   w3[0] = 0;
668   w3[1] = 0;
669   w3[2] = 0;
670   w3[3] = 0;
671
672   const u32 pw_len = pws[gid].pw_len;
673
674   /**
675    * main
676    */
677
678   m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
679 }
680
681 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s16 (__global pw_t *pws, __global gpu_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
682 {
683   /**
684    * base
685    */
686
687   const u32 gid = get_global_id (0);
688
689   if (gid >= gid_max) return;
690
691   u32x w0[4];
692
693   w0[0] = pws[gid].i[ 0];
694   w0[1] = pws[gid].i[ 1];
695   w0[2] = pws[gid].i[ 2];
696   w0[3] = pws[gid].i[ 3];
697
698   u32x w1[4];
699
700   w1[0] = pws[gid].i[ 4];
701   w1[1] = pws[gid].i[ 5];
702   w1[2] = pws[gid].i[ 6];
703   w1[3] = pws[gid].i[ 7];
704
705   u32x w2[4];
706
707   w2[0] = pws[gid].i[ 8];
708   w2[1] = pws[gid].i[ 9];
709   w2[2] = pws[gid].i[10];
710   w2[3] = pws[gid].i[11];
711
712   u32x w3[4];
713
714   w3[0] = pws[gid].i[12];
715   w3[1] = pws[gid].i[13];
716   w3[2] = 0;
717   w3[3] = 0;
718
719   const u32 pw_len = pws[gid].pw_len;
720
721   /**
722    * main
723    */
724
725   m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
726 }