ab9f6436ab7659ccf709fd16d8ab8b19b4242b71
[hashcat.git] / OpenCL / m02810_a0.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 #define DGST_R0 0
12 #define DGST_R1 3
13 #define DGST_R2 2
14 #define DGST_R3 1
15
16 #include "include/kernel_functions.c"
17 #include "types_ocl.c"
18 #include "common.c"
19 #include "include/rp_gpu.h"
20 #include "rp.c"
21
22 #define COMPARE_S "check_single_comp4.c"
23 #define COMPARE_M "check_multi_comp4.c"
24
25 #ifdef VECT_SIZE1
26 #define uint_to_hex_lower8(i) l_bin2asc[(i)]
27 #endif
28
29 #ifdef VECT_SIZE2
30 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
31 #endif
32
33 #ifdef VECT_SIZE4
34 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3])
35 #endif
36
37 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
38 {
39   /**
40    * modifier
41    */
42
43   const u32 lid = get_local_id (0);
44
45   /**
46    * base
47    */
48
49   const u32 gid = get_global_id (0);
50
51   u32 pw_buf0[4];
52
53   pw_buf0[0] = pws[gid].i[ 0];
54   pw_buf0[1] = pws[gid].i[ 1];
55   pw_buf0[2] = pws[gid].i[ 2];
56   pw_buf0[3] = pws[gid].i[ 3];
57
58   u32 pw_buf1[4];
59
60   pw_buf1[0] = pws[gid].i[ 4];
61   pw_buf1[1] = pws[gid].i[ 5];
62   pw_buf1[2] = pws[gid].i[ 6];
63   pw_buf1[3] = pws[gid].i[ 7];
64
65   const u32 pw_len = pws[gid].pw_len;
66
67   /**
68    * salt
69    */
70
71   u32 s[8];
72
73   s[0] = salt_bufs[salt_pos].salt_buf_pc[0];
74   s[1] = salt_bufs[salt_pos].salt_buf_pc[1];
75   s[2] = salt_bufs[salt_pos].salt_buf_pc[2];
76   s[3] = salt_bufs[salt_pos].salt_buf_pc[3];
77   s[4] = salt_bufs[salt_pos].salt_buf_pc[4];
78   s[5] = salt_bufs[salt_pos].salt_buf_pc[5];
79   s[6] = salt_bufs[salt_pos].salt_buf_pc[6];
80   s[7] = salt_bufs[salt_pos].salt_buf_pc[7];
81
82   const u32 r_00 = 0x80;
83   const u32 r_14 = 64 * 8;
84
85   /**
86    * bin2asc table
87    */
88
89   __local u32 l_bin2asc[256];
90
91   const u32 lid4 = lid * 4;
92
93   const u32 lid40 = lid4 + 0;
94   const u32 lid41 = lid4 + 1;
95   const u32 lid42 = lid4 + 2;
96   const u32 lid43 = lid4 + 3;
97
98   const u32 v400 = (lid40 >> 0) & 15;
99   const u32 v401 = (lid40 >> 4) & 15;
100   const u32 v410 = (lid41 >> 0) & 15;
101   const u32 v411 = (lid41 >> 4) & 15;
102   const u32 v420 = (lid42 >> 0) & 15;
103   const u32 v421 = (lid42 >> 4) & 15;
104   const u32 v430 = (lid43 >> 0) & 15;
105   const u32 v431 = (lid43 >> 4) & 15;
106
107   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
108                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
109   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
110                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
111   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
112                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
113   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
114                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
115
116   barrier (CLK_LOCAL_MEM_FENCE);
117
118   if (gid >= gid_max) return;
119
120   /**
121    * loop
122    */
123
124   /**
125    * loop
126    */
127
128   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
129   {
130     u32 w0[4];
131
132     w0[0] = pw_buf0[0];
133     w0[1] = pw_buf0[1];
134     w0[2] = pw_buf0[2];
135     w0[3] = pw_buf0[3];
136
137     u32 w1[4];
138
139     w1[0] = pw_buf1[0];
140     w1[1] = pw_buf1[1];
141     w1[2] = pw_buf1[2];
142     w1[3] = pw_buf1[3];
143
144     u32 w2[4];
145
146     w2[0] = 0;
147     w2[1] = 0;
148     w2[2] = 0;
149     w2[3] = 0;
150
151     u32 w3[4];
152
153     w3[0] = 0;
154     w3[1] = 0;
155     w3[2] = 0;
156     w3[3] = 0;
157
158     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
159
160     append_0x80_2 (w0, w1, out_len);
161
162     w3[2] = out_len * 8;
163
164     u32 a = MD5M_A;
165     u32 b = MD5M_B;
166     u32 c = MD5M_C;
167     u32 d = MD5M_D;
168
169     MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00);
170     MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01);
171     MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02);
172     MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03);
173     MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00);
174     MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01);
175     MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02);
176     MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03);
177     MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00);
178     MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01);
179     MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02);
180     MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03);
181     MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00);
182     MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01);
183     MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02);
184     MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03);
185
186     MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10);
187     MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11);
188     MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12);
189     MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13);
190     MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10);
191     MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11);
192     MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12);
193     MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13);
194     MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10);
195     MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11);
196     MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12);
197     MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13);
198     MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10);
199     MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11);
200     MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12);
201     MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13);
202
203     MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20);
204     MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21);
205     MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22);
206     MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23);
207     MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20);
208     MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21);
209     MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22);
210     MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23);
211     MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20);
212     MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21);
213     MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22);
214     MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23);
215     MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20);
216     MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21);
217     MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22);
218     MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23);
219
220     MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30);
221     MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31);
222     MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32);
223     MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33);
224     MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30);
225     MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31);
226     MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32);
227     MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33);
228     MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30);
229     MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31);
230     MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32);
231     MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33);
232     MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30);
233     MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31);
234     MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32);
235     MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33);
236
237     a += MD5M_A;
238     b += MD5M_B;
239     c += MD5M_C;
240     d += MD5M_D;
241
242     const u32  w0_t = s[0];
243     const u32  w1_t = s[1];
244     const u32  w2_t = s[2];
245     const u32  w3_t = s[3];
246     const u32  w4_t = s[4];
247     const u32  w5_t = s[5];
248     const u32  w6_t = s[6];
249     const u32  w7_t = s[7];
250
251     const u32 w8_t = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
252                      | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
253     const u32 w9_t = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
254                      | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
255     const u32 wa_t = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
256                      | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
257     const u32 wb_t = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
258                      | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
259     const u32 wc_t = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
260                      | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
261     const u32 wd_t = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
262                      | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
263     const u32 we_t = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
264                      | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
265     const u32 wf_t = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
266                      | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
267
268     a = MD5M_A;
269     b = MD5M_B;
270     c = MD5M_C;
271     d = MD5M_D;
272
273     MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
274     MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
275     MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
276     MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
277     MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
278     MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
279     MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
280     MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
281     MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
282     MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
283     MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
284     MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
285     MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
286     MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
287     MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
288     MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
289
290     MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
291     MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
292     MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
293     MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
294     MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
295     MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
296     MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
297     MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
298     MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
299     MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
300     MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
301     MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
302     MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
303     MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
304     MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
305     MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
306
307     MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
308     MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
309     MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
310     MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
311     MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
312     MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
313     MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
314     MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
315     MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
316     MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
317     MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
318     MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
319     MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
320     MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
321     MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
322     MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
323
324     MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
325     MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
326     MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
327     MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
328     MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
329     MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
330     MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
331     MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
332     MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
333     MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
334     MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
335     MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
336     MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
337     MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
338     MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
339     MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
340
341     const u32 r_a = a + MD5M_A;
342     const u32 r_b = b + MD5M_B;
343     const u32 r_c = c + MD5M_C;
344     const u32 r_d = d + MD5M_D;
345
346     a = r_a;
347     b = r_b;
348     c = r_c;
349     d = r_d;
350
351     MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00);
352     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C01, MD5S01);
353     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C02, MD5S02);
354     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C03, MD5S03);
355     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C04, MD5S00);
356     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C05, MD5S01);
357     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C06, MD5S02);
358     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C07, MD5S03);
359     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C08, MD5S00);
360     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C09, MD5S01);
361     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C0a, MD5S02);
362     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0b, MD5S03);
363     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C0c, MD5S00);
364     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C0d, MD5S01);
365     MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02);
366     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0f, MD5S03);
367
368     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C10, MD5S10);
369     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C11, MD5S11);
370     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C12, MD5S12);
371     MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13);
372     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C14, MD5S10);
373     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C15, MD5S11);
374     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C16, MD5S12);
375     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C17, MD5S13);
376     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C18, MD5S10);
377     MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11);
378     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1a, MD5S12);
379     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1b, MD5S13);
380     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C1c, MD5S10);
381     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C1d, MD5S11);
382     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1e, MD5S12);
383     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1f, MD5S13);
384
385     MD5_STEP0(MD5_H , a, b, c, d,       MD5C20, MD5S20);
386     MD5_STEP0(MD5_H , d, a, b, c,       MD5C21, MD5S21);
387     MD5_STEP0(MD5_H , c, d, a, b,       MD5C22, MD5S22);
388     MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23);
389     MD5_STEP0(MD5_H , a, b, c, d,       MD5C24, MD5S20);
390     MD5_STEP0(MD5_H , d, a, b, c,       MD5C25, MD5S21);
391     MD5_STEP0(MD5_H , c, d, a, b,       MD5C26, MD5S22);
392     MD5_STEP0(MD5_H , b, c, d, a,       MD5C27, MD5S23);
393     MD5_STEP0(MD5_H , a, b, c, d,       MD5C28, MD5S20);
394     MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21);
395     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2a, MD5S22);
396     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2b, MD5S23);
397     MD5_STEP0(MD5_H , a, b, c, d,       MD5C2c, MD5S20);
398     MD5_STEP0(MD5_H , d, a, b, c,       MD5C2d, MD5S21);
399     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2e, MD5S22);
400     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2f, MD5S23);
401
402     MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30);
403     MD5_STEP0(MD5_I , d, a, b, c,       MD5C31, MD5S31);
404     MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32);
405     MD5_STEP0(MD5_I , b, c, d, a,       MD5C33, MD5S33);
406     MD5_STEP0(MD5_I , a, b, c, d,       MD5C34, MD5S30);
407     MD5_STEP0(MD5_I , d, a, b, c,       MD5C35, MD5S31);
408     MD5_STEP0(MD5_I , c, d, a, b,       MD5C36, MD5S32);
409     MD5_STEP0(MD5_I , b, c, d, a,       MD5C37, MD5S33);
410     MD5_STEP0(MD5_I , a, b, c, d,       MD5C38, MD5S30);
411     MD5_STEP0(MD5_I , d, a, b, c,       MD5C39, MD5S31);
412     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3a, MD5S32);
413     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3b, MD5S33);
414     MD5_STEP0(MD5_I , a, b, c, d,       MD5C3c, MD5S30);
415     MD5_STEP0(MD5_I , d, a, b, c,       MD5C3d, MD5S31);
416     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3e, MD5S32);
417     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3f, MD5S33);
418
419     a += r_a;
420     b += r_b;
421     c += r_c;
422     d += r_d;
423
424     const u32 r0 = a;
425     const u32 r1 = d;
426     const u32 r2 = c;
427     const u32 r3 = b;
428
429     #include COMPARE_M
430   }
431 }
432
433 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
434 {
435 }
436
437 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
438 {
439 }
440
441 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
442 {
443   /**
444    * modifier
445    */
446
447   const u32 lid = get_local_id (0);
448
449   /**
450    * base
451    */
452
453   const u32 gid = get_global_id (0);
454
455   u32 pw_buf0[4];
456
457   pw_buf0[0] = pws[gid].i[ 0];
458   pw_buf0[1] = pws[gid].i[ 1];
459   pw_buf0[2] = pws[gid].i[ 2];
460   pw_buf0[3] = pws[gid].i[ 3];
461
462   u32 pw_buf1[4];
463
464   pw_buf1[0] = pws[gid].i[ 4];
465   pw_buf1[1] = pws[gid].i[ 5];
466   pw_buf1[2] = pws[gid].i[ 6];
467   pw_buf1[3] = pws[gid].i[ 7];
468
469   const u32 pw_len = pws[gid].pw_len;
470
471   /**
472    * salt
473    */
474
475   u32 s[8];
476
477   s[0] = salt_bufs[salt_pos].salt_buf_pc[0];
478   s[1] = salt_bufs[salt_pos].salt_buf_pc[1];
479   s[2] = salt_bufs[salt_pos].salt_buf_pc[2];
480   s[3] = salt_bufs[salt_pos].salt_buf_pc[3];
481   s[4] = salt_bufs[salt_pos].salt_buf_pc[4];
482   s[5] = salt_bufs[salt_pos].salt_buf_pc[5];
483   s[6] = salt_bufs[salt_pos].salt_buf_pc[6];
484   s[7] = salt_bufs[salt_pos].salt_buf_pc[7];
485
486   const u32 r_00 = 0x80;
487   const u32 r_14 = 64 * 8;
488
489   /**
490    * digest
491    */
492
493   const u32 search[4] =
494   {
495     digests_buf[digests_offset].digest_buf[DGST_R0],
496     digests_buf[digests_offset].digest_buf[DGST_R1],
497     digests_buf[digests_offset].digest_buf[DGST_R2],
498     digests_buf[digests_offset].digest_buf[DGST_R3]
499   };
500
501   /**
502    * bin2asc table
503    */
504
505   __local u32 l_bin2asc[256];
506
507   const u32 lid4 = lid * 4;
508
509   const u32 lid40 = lid4 + 0;
510   const u32 lid41 = lid4 + 1;
511   const u32 lid42 = lid4 + 2;
512   const u32 lid43 = lid4 + 3;
513
514   const u32 v400 = (lid40 >> 0) & 15;
515   const u32 v401 = (lid40 >> 4) & 15;
516   const u32 v410 = (lid41 >> 0) & 15;
517   const u32 v411 = (lid41 >> 4) & 15;
518   const u32 v420 = (lid42 >> 0) & 15;
519   const u32 v421 = (lid42 >> 4) & 15;
520   const u32 v430 = (lid43 >> 0) & 15;
521   const u32 v431 = (lid43 >> 4) & 15;
522
523   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
524                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
525   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
526                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
527   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
528                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
529   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
530                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
531
532   barrier (CLK_LOCAL_MEM_FENCE);
533
534   if (gid >= gid_max) return;
535
536   /**
537    * loop
538    */
539
540   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
541   {
542     u32 w0[4];
543
544     w0[0] = pw_buf0[0];
545     w0[1] = pw_buf0[1];
546     w0[2] = pw_buf0[2];
547     w0[3] = pw_buf0[3];
548
549     u32 w1[4];
550
551     w1[0] = pw_buf1[0];
552     w1[1] = pw_buf1[1];
553     w1[2] = pw_buf1[2];
554     w1[3] = pw_buf1[3];
555
556     u32 w2[4];
557
558     w2[0] = 0;
559     w2[1] = 0;
560     w2[2] = 0;
561     w2[3] = 0;
562
563     u32 w3[4];
564
565     w3[0] = 0;
566     w3[1] = 0;
567     w3[2] = 0;
568     w3[3] = 0;
569
570     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
571
572     append_0x80_2 (w0, w1, out_len);
573
574     w3[2] = out_len * 8;
575
576     u32 a = MD5M_A;
577     u32 b = MD5M_B;
578     u32 c = MD5M_C;
579     u32 d = MD5M_D;
580
581     MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00);
582     MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01);
583     MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02);
584     MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03);
585     MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00);
586     MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01);
587     MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02);
588     MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03);
589     MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00);
590     MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01);
591     MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02);
592     MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03);
593     MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00);
594     MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01);
595     MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02);
596     MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03);
597
598     MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10);
599     MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11);
600     MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12);
601     MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13);
602     MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10);
603     MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11);
604     MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12);
605     MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13);
606     MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10);
607     MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11);
608     MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12);
609     MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13);
610     MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10);
611     MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11);
612     MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12);
613     MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13);
614
615     MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20);
616     MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21);
617     MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22);
618     MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23);
619     MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20);
620     MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21);
621     MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22);
622     MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23);
623     MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20);
624     MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21);
625     MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22);
626     MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23);
627     MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20);
628     MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21);
629     MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22);
630     MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23);
631
632     MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30);
633     MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31);
634     MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32);
635     MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33);
636     MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30);
637     MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31);
638     MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32);
639     MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33);
640     MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30);
641     MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31);
642     MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32);
643     MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33);
644     MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30);
645     MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31);
646     MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32);
647     MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33);
648
649     a += MD5M_A;
650     b += MD5M_B;
651     c += MD5M_C;
652     d += MD5M_D;
653
654     const u32  w0_t = s[0];
655     const u32  w1_t = s[1];
656     const u32  w2_t = s[2];
657     const u32  w3_t = s[3];
658     const u32  w4_t = s[4];
659     const u32  w5_t = s[5];
660     const u32  w6_t = s[6];
661     const u32  w7_t = s[7];
662
663     const u32 w8_t = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
664                      | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
665     const u32 w9_t = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
666                      | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
667     const u32 wa_t = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
668                      | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
669     const u32 wb_t = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
670                      | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
671     const u32 wc_t = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
672                      | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
673     const u32 wd_t = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
674                      | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
675     const u32 we_t = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
676                      | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
677     const u32 wf_t = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
678                      | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
679
680     a = MD5M_A;
681     b = MD5M_B;
682     c = MD5M_C;
683     d = MD5M_D;
684
685     MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
686     MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
687     MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
688     MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
689     MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
690     MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
691     MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
692     MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
693     MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
694     MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
695     MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
696     MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
697     MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
698     MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
699     MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
700     MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
701
702     MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
703     MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
704     MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
705     MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
706     MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
707     MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
708     MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
709     MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
710     MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
711     MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
712     MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
713     MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
714     MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
715     MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
716     MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
717     MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
718
719     MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
720     MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
721     MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
722     MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
723     MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
724     MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
725     MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
726     MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
727     MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
728     MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
729     MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
730     MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
731     MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
732     MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
733     MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
734     MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
735
736     MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
737     MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
738     MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
739     MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
740     MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
741     MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
742     MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
743     MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
744     MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
745     MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
746     MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
747     MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
748     MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
749     MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
750     MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
751     MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
752
753     const u32 r_a = a + MD5M_A;
754     const u32 r_b = b + MD5M_B;
755     const u32 r_c = c + MD5M_C;
756     const u32 r_d = d + MD5M_D;
757
758     a = r_a;
759     b = r_b;
760     c = r_c;
761     d = r_d;
762
763     MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00);
764     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C01, MD5S01);
765     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C02, MD5S02);
766     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C03, MD5S03);
767     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C04, MD5S00);
768     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C05, MD5S01);
769     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C06, MD5S02);
770     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C07, MD5S03);
771     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C08, MD5S00);
772     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C09, MD5S01);
773     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C0a, MD5S02);
774     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0b, MD5S03);
775     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C0c, MD5S00);
776     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C0d, MD5S01);
777     MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02);
778     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0f, MD5S03);
779
780     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C10, MD5S10);
781     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C11, MD5S11);
782     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C12, MD5S12);
783     MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13);
784     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C14, MD5S10);
785     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C15, MD5S11);
786     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C16, MD5S12);
787     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C17, MD5S13);
788     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C18, MD5S10);
789     MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11);
790     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1a, MD5S12);
791     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1b, MD5S13);
792     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C1c, MD5S10);
793     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C1d, MD5S11);
794     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1e, MD5S12);
795     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1f, MD5S13);
796
797     MD5_STEP0(MD5_H , a, b, c, d,       MD5C20, MD5S20);
798     MD5_STEP0(MD5_H , d, a, b, c,       MD5C21, MD5S21);
799     MD5_STEP0(MD5_H , c, d, a, b,       MD5C22, MD5S22);
800     MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23);
801     MD5_STEP0(MD5_H , a, b, c, d,       MD5C24, MD5S20);
802     MD5_STEP0(MD5_H , d, a, b, c,       MD5C25, MD5S21);
803     MD5_STEP0(MD5_H , c, d, a, b,       MD5C26, MD5S22);
804     MD5_STEP0(MD5_H , b, c, d, a,       MD5C27, MD5S23);
805     MD5_STEP0(MD5_H , a, b, c, d,       MD5C28, MD5S20);
806     MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21);
807     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2a, MD5S22);
808     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2b, MD5S23);
809     MD5_STEP0(MD5_H , a, b, c, d,       MD5C2c, MD5S20);
810     MD5_STEP0(MD5_H , d, a, b, c,       MD5C2d, MD5S21);
811     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2e, MD5S22);
812     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2f, MD5S23);
813
814     MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30);
815     MD5_STEP0(MD5_I , d, a, b, c,       MD5C31, MD5S31);
816     MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32);
817     MD5_STEP0(MD5_I , b, c, d, a,       MD5C33, MD5S33);
818     MD5_STEP0(MD5_I , a, b, c, d,       MD5C34, MD5S30);
819     MD5_STEP0(MD5_I , d, a, b, c,       MD5C35, MD5S31);
820     MD5_STEP0(MD5_I , c, d, a, b,       MD5C36, MD5S32);
821     MD5_STEP0(MD5_I , b, c, d, a,       MD5C37, MD5S33);
822     MD5_STEP0(MD5_I , a, b, c, d,       MD5C38, MD5S30);
823     MD5_STEP0(MD5_I , d, a, b, c,       MD5C39, MD5S31);
824     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3a, MD5S32);
825     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3b, MD5S33);
826     MD5_STEP0(MD5_I , a, b, c, d,       MD5C3c, MD5S30);
827
828     if (allx ((a + r_a) != search[0])) continue;
829
830     MD5_STEP0(MD5_I , d, a, b, c,       MD5C3d, MD5S31);
831     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3e, MD5S32);
832     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3f, MD5S33);
833
834     a += r_a;
835     b += r_b;
836     c += r_c;
837     d += r_d;
838
839     const u32 r0 = a;
840     const u32 r1 = d;
841     const u32 r2 = c;
842     const u32 r3 = b;
843
844     #include COMPARE_S
845   }
846 }
847
848 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
849 {
850 }
851
852 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
853 {
854 }