Allow and support vector-width 16, which is current maximum for
[hashcat.git] / OpenCL / m02710_a3.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *               magnum <john.magnum@hushmail.com>
5  *
6  * License.....: MIT
7  */
8
9 #define _MD5_
10
11 #define NEW_SIMD_CODE
12
13 #include "include/constants.h"
14 #include "include/kernel_vendor.h"
15
16 #define DGST_R0 0
17 #define DGST_R1 3
18 #define DGST_R2 2
19 #define DGST_R3 1
20
21 #include "include/kernel_functions.c"
22 #include "OpenCL/types_ocl.c"
23 #include "OpenCL/common.c"
24 #include "OpenCL/simd.c"
25
26 #if   VECT_SIZE == 1
27 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)])
28 #elif VECT_SIZE == 2
29 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
30 #elif VECT_SIZE == 4
31 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3])
32 #elif VECT_SIZE == 8
33 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7])
34 #elif VECT_SIZE == 16
35 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf])
36 #endif
37
38 static void m02710m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc)
39 {
40   /**
41    * modifier
42    */
43
44   const u32 gid = get_global_id (0);
45   const u32 lid = get_local_id (0);
46
47   /**
48    * salt
49    */
50
51   u32 s[8];
52
53   s[0] = salt_bufs[salt_pos].salt_buf[0];
54   s[1] = salt_bufs[salt_pos].salt_buf[1];
55   s[2] = salt_bufs[salt_pos].salt_buf[2];
56   s[3] = salt_bufs[salt_pos].salt_buf[3];
57   s[4] = salt_bufs[salt_pos].salt_buf[4];
58   s[5] = salt_bufs[salt_pos].salt_buf[5];
59   s[6] = salt_bufs[salt_pos].salt_buf[6];
60   s[7] = salt_bufs[salt_pos].salt_buf[7];
61
62   const u32 salt_len = salt_bufs[salt_pos].salt_len;
63
64   const u32 r_14 = (32 + salt_len) * 8;
65
66   /**
67    * loop
68    */
69
70   u32 w0l = w0[0];
71
72   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
73   {
74     const u32x w0r = w0r_create_bft (bfs_buf, il_pos);
75
76     const u32x w0lr = w0l | w0r;
77
78     u32x w0_t[4];
79
80     w0_t[0] = w0lr;
81     w0_t[1] = w0[1];
82     w0_t[2] = w0[2];
83     w0_t[3] = w0[3];
84
85     u32x w1_t[4];
86
87     w1_t[0] = w1[0];
88     w1_t[1] = w1[1];
89     w1_t[2] = w1[2];
90     w1_t[3] = w1[3];
91
92     u32x w2_t[4];
93
94     w2_t[0] = w2[0];
95     w2_t[1] = w2[1];
96     w2_t[2] = w2[2];
97     w2_t[3] = w2[3];
98
99     u32x w3_t[4];
100
101     w3_t[0] = w3[0];
102     w3_t[1] = w3[1];
103     w3_t[2] = w3[2];
104     w3_t[3] = w3[3];
105
106     u32x a = MD5M_A;
107     u32x b = MD5M_B;
108     u32x c = MD5M_C;
109     u32x d = MD5M_D;
110
111     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
112     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
113     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
114     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
115     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
116     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
117     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
118     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
119     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
120     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
121     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
122     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
123     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
124     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
125     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
126     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
127
128     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
129     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
130     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
131     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
132     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
133     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
134     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
135     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
136     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
137     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
138     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
139     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
140     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
141     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
142     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
143     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
144
145     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
146     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
147     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
148     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
149     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
150     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
151     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
152     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
153     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
154     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
155     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
156     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
157     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
158     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
159     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
160     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
161
162     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
163     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
164     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
165     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
166     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
167     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
168     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
169     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
170     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
171     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
172     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
173     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
174     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
175     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
176     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
177     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
178
179     a += MD5M_A;
180     b += MD5M_B;
181     c += MD5M_C;
182     d += MD5M_D;
183
184     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
185             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
186     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
187             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
188     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
189             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
190     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
191             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
192     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
193             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
194     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
195             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
196     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
197             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
198     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
199             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
200
201     w2_t[0] = s[0];
202     w2_t[1] = s[1];
203     w2_t[2] = s[2];
204     w2_t[3] = s[3];
205
206     w3_t[0] = s[4];
207     w3_t[1] = s[5];
208     w3_t[2] = s[6];
209     w3_t[3] = s[7];
210
211     a = MD5M_A;
212     b = MD5M_B;
213     c = MD5M_C;
214     d = MD5M_D;
215
216     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
217     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
218     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
219     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
220     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
221     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
222     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
223     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
224     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
225     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
226     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
227     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
228     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
229     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
230     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
231     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
232
233     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
234     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
235     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
236     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
237     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
238     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
239     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
240     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
241     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
242     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
243     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
244     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
245     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
246     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
247     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
248     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
249
250     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
251     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
252     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
253     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
254     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
255     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
256     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
257     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
258     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
259     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
260     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
261     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
262     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
263     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
264     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
265     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
266
267     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
268     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
269     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
270     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
271     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
272     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
273     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
274     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
275     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
276     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
277     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
278     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
279     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
280     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
281     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
282     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
283
284     const u32x r_a = a + MD5M_A;
285     const u32x r_b = b + MD5M_B;
286     const u32x r_c = c + MD5M_C;
287     const u32x r_d = d + MD5M_D;
288
289     a = r_a;
290     b = r_b;
291     c = r_c;
292     d = r_d;
293
294     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C00, MD5S00);
295     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C01, MD5S01);
296     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C02, MD5S02);
297     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C03, MD5S03);
298     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C04, MD5S00);
299     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C05, MD5S01);
300     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C06, MD5S02);
301     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C07, MD5S03);
302     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C08, MD5S00);
303     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C09, MD5S01);
304     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C0a, MD5S02);
305     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0b, MD5S03);
306     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C0c, MD5S00);
307     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C0d, MD5S01);
308     MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02);
309     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0f, MD5S03);
310
311     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C10, MD5S10);
312     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C11, MD5S11);
313     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C12, MD5S12);
314     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C13, MD5S13);
315     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C14, MD5S10);
316     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C15, MD5S11);
317     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C16, MD5S12);
318     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C17, MD5S13);
319     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C18, MD5S10);
320     MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11);
321     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1a, MD5S12);
322     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1b, MD5S13);
323     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C1c, MD5S10);
324     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C1d, MD5S11);
325     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1e, MD5S12);
326     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1f, MD5S13);
327
328     MD5_STEP0(MD5_H , a, b, c, d,       MD5C20, MD5S20);
329     MD5_STEP0(MD5_H , d, a, b, c,       MD5C21, MD5S21);
330     MD5_STEP0(MD5_H , c, d, a, b,       MD5C22, MD5S22);
331     MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23);
332     MD5_STEP0(MD5_H , a, b, c, d,       MD5C24, MD5S20);
333     MD5_STEP0(MD5_H , d, a, b, c,       MD5C25, MD5S21);
334     MD5_STEP0(MD5_H , c, d, a, b,       MD5C26, MD5S22);
335     MD5_STEP0(MD5_H , b, c, d, a,       MD5C27, MD5S23);
336     MD5_STEP0(MD5_H , a, b, c, d,       MD5C28, MD5S20);
337     MD5_STEP0(MD5_H , d, a, b, c,       MD5C29, MD5S21);
338     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2a, MD5S22);
339     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2b, MD5S23);
340     MD5_STEP0(MD5_H , a, b, c, d,       MD5C2c, MD5S20);
341     MD5_STEP0(MD5_H , d, a, b, c,       MD5C2d, MD5S21);
342     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2e, MD5S22);
343     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2f, MD5S23);
344
345     MD5_STEP0(MD5_I , a, b, c, d,       MD5C30, MD5S30);
346     MD5_STEP0(MD5_I , d, a, b, c,       MD5C31, MD5S31);
347     MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32);
348     MD5_STEP0(MD5_I , b, c, d, a,       MD5C33, MD5S33);
349     MD5_STEP0(MD5_I , a, b, c, d,       MD5C34, MD5S30);
350     MD5_STEP0(MD5_I , d, a, b, c,       MD5C35, MD5S31);
351     MD5_STEP0(MD5_I , c, d, a, b,       MD5C36, MD5S32);
352     MD5_STEP0(MD5_I , b, c, d, a,       MD5C37, MD5S33);
353     MD5_STEP0(MD5_I , a, b, c, d,       MD5C38, MD5S30);
354     MD5_STEP0(MD5_I , d, a, b, c,       MD5C39, MD5S31);
355     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3a, MD5S32);
356     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3b, MD5S33);
357     MD5_STEP0(MD5_I , a, b, c, d,       MD5C3c, MD5S30);
358     MD5_STEP0(MD5_I , d, a, b, c,       MD5C3d, MD5S31);
359     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3e, MD5S32);
360     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3f, MD5S33);
361
362     a += r_a;
363     b += r_b;
364     c += r_c;
365     d += r_d;
366
367     COMPARE_M_SIMD (a, d, c, b);
368   }
369 }
370
371 static void m02710s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 *l_bin2asc)
372 {
373   /**
374    * modifier
375    */
376
377   const u32 gid = get_global_id (0);
378   const u32 lid = get_local_id (0);
379
380   /**
381    * digest
382    */
383
384   const u32 search[4] =
385   {
386     digests_buf[digests_offset].digest_buf[DGST_R0],
387     digests_buf[digests_offset].digest_buf[DGST_R1],
388     digests_buf[digests_offset].digest_buf[DGST_R2],
389     digests_buf[digests_offset].digest_buf[DGST_R3]
390   };
391
392   /**
393    * salt
394    */
395
396   u32 s[8];
397
398   s[0] = salt_bufs[salt_pos].salt_buf[0];
399   s[1] = salt_bufs[salt_pos].salt_buf[1];
400   s[2] = salt_bufs[salt_pos].salt_buf[2];
401   s[3] = salt_bufs[salt_pos].salt_buf[3];
402   s[4] = salt_bufs[salt_pos].salt_buf[4];
403   s[5] = salt_bufs[salt_pos].salt_buf[5];
404   s[6] = salt_bufs[salt_pos].salt_buf[6];
405   s[7] = salt_bufs[salt_pos].salt_buf[7];
406
407   const u32 salt_len = salt_bufs[salt_pos].salt_len;
408
409   const u32 r_14 = (32 + salt_len) * 8;
410
411   /**
412    * loop
413    */
414
415   u32 w0l = w0[0];
416
417   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
418   {
419     const u32x w0r = w0r_create_bft (bfs_buf, il_pos);
420
421     const u32x w0lr = w0l | w0r;
422
423     u32x w0_t[4];
424
425     w0_t[0] = w0lr;
426     w0_t[1] = w0[1];
427     w0_t[2] = w0[2];
428     w0_t[3] = w0[3];
429
430     u32x w1_t[4];
431
432     w1_t[0] = w1[0];
433     w1_t[1] = w1[1];
434     w1_t[2] = w1[2];
435     w1_t[3] = w1[3];
436
437     u32x w2_t[4];
438
439     w2_t[0] = w2[0];
440     w2_t[1] = w2[1];
441     w2_t[2] = w2[2];
442     w2_t[3] = w2[3];
443
444     u32x w3_t[4];
445
446     w3_t[0] = w3[0];
447     w3_t[1] = w3[1];
448     w3_t[2] = w3[2];
449     w3_t[3] = w3[3];
450
451     u32x a = MD5M_A;
452     u32x b = MD5M_B;
453     u32x c = MD5M_C;
454     u32x d = MD5M_D;
455
456     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
457     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
458     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
459     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
460     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
461     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
462     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
463     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
464     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
465     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
466     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
467     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
468     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
469     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
470     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
471     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
472
473     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
474     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
475     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
476     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
477     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
478     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
479     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
480     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
481     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
482     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
483     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
484     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
485     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
486     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
487     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
488     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
489
490     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
491     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
492     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
493     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
494     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
495     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
496     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
497     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
498     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
499     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
500     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
501     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
502     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
503     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
504     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
505     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
506
507     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
508     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
509     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
510     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
511     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
512     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
513     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
514     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
515     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
516     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
517     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
518     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
519     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
520     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
521     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
522     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
523
524     a += MD5M_A;
525     b += MD5M_B;
526     c += MD5M_C;
527     d += MD5M_D;
528
529     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
530             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
531     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
532             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
533     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
534             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
535     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
536             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
537     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
538             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
539     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
540             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
541     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
542             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
543     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
544             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
545
546     w2_t[0] = s[0];
547     w2_t[1] = s[1];
548     w2_t[2] = s[2];
549     w2_t[3] = s[3];
550
551     w3_t[0] = s[4];
552     w3_t[1] = s[5];
553     w3_t[2] = s[6];
554     w3_t[3] = s[7];
555
556     a = MD5M_A;
557     b = MD5M_B;
558     c = MD5M_C;
559     d = MD5M_D;
560
561     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
562     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
563     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
564     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
565     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
566     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
567     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
568     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
569     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
570     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
571     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
572     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
573     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
574     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
575     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
576     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
577
578     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
579     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
580     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
581     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
582     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
583     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
584     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
585     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
586     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
587     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
588     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
589     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
590     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
591     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
592     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
593     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
594
595     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
596     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
597     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
598     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
599     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
600     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
601     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
602     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
603     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
604     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
605     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
606     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
607     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
608     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
609     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
610     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
611
612     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
613     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
614     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
615     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
616     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
617     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
618     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
619     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
620     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
621     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
622     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
623     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
624     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
625     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
626     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
627     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
628
629     const u32x r_a = a + MD5M_A;
630     const u32x r_b = b + MD5M_B;
631     const u32x r_c = c + MD5M_C;
632     const u32x r_d = d + MD5M_D;
633
634     a = r_a;
635     b = r_b;
636     c = r_c;
637     d = r_d;
638
639     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C00, MD5S00);
640     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C01, MD5S01);
641     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C02, MD5S02);
642     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C03, MD5S03);
643     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C04, MD5S00);
644     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C05, MD5S01);
645     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C06, MD5S02);
646     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C07, MD5S03);
647     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C08, MD5S00);
648     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C09, MD5S01);
649     MD5_STEP0(MD5_Fo, c, d, a, b,       MD5C0a, MD5S02);
650     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0b, MD5S03);
651     MD5_STEP0(MD5_Fo, a, b, c, d,       MD5C0c, MD5S00);
652     MD5_STEP0(MD5_Fo, d, a, b, c,       MD5C0d, MD5S01);
653     MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02);
654     MD5_STEP0(MD5_Fo, b, c, d, a,       MD5C0f, MD5S03);
655
656     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C10, MD5S10);
657     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C11, MD5S11);
658     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C12, MD5S12);
659     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C13, MD5S13);
660     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C14, MD5S10);
661     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C15, MD5S11);
662     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C16, MD5S12);
663     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C17, MD5S13);
664     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C18, MD5S10);
665     MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11);
666     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1a, MD5S12);
667     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1b, MD5S13);
668     MD5_STEP0(MD5_Go, a, b, c, d,       MD5C1c, MD5S10);
669     MD5_STEP0(MD5_Go, d, a, b, c,       MD5C1d, MD5S11);
670     MD5_STEP0(MD5_Go, c, d, a, b,       MD5C1e, MD5S12);
671     MD5_STEP0(MD5_Go, b, c, d, a,       MD5C1f, MD5S13);
672
673     MD5_STEP0(MD5_H , a, b, c, d,       MD5C20, MD5S20);
674     MD5_STEP0(MD5_H , d, a, b, c,       MD5C21, MD5S21);
675     MD5_STEP0(MD5_H , c, d, a, b,       MD5C22, MD5S22);
676     MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23);
677     MD5_STEP0(MD5_H , a, b, c, d,       MD5C24, MD5S20);
678     MD5_STEP0(MD5_H , d, a, b, c,       MD5C25, MD5S21);
679     MD5_STEP0(MD5_H , c, d, a, b,       MD5C26, MD5S22);
680     MD5_STEP0(MD5_H , b, c, d, a,       MD5C27, MD5S23);
681     MD5_STEP0(MD5_H , a, b, c, d,       MD5C28, MD5S20);
682     MD5_STEP0(MD5_H , d, a, b, c,       MD5C29, MD5S21);
683     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2a, MD5S22);
684     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2b, MD5S23);
685     MD5_STEP0(MD5_H , a, b, c, d,       MD5C2c, MD5S20);
686     MD5_STEP0(MD5_H , d, a, b, c,       MD5C2d, MD5S21);
687     MD5_STEP0(MD5_H , c, d, a, b,       MD5C2e, MD5S22);
688     MD5_STEP0(MD5_H , b, c, d, a,       MD5C2f, MD5S23);
689
690     MD5_STEP0(MD5_I , a, b, c, d,       MD5C30, MD5S30);
691     MD5_STEP0(MD5_I , d, a, b, c,       MD5C31, MD5S31);
692     MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32);
693     MD5_STEP0(MD5_I , b, c, d, a,       MD5C33, MD5S33);
694     MD5_STEP0(MD5_I , a, b, c, d,       MD5C34, MD5S30);
695     MD5_STEP0(MD5_I , d, a, b, c,       MD5C35, MD5S31);
696     MD5_STEP0(MD5_I , c, d, a, b,       MD5C36, MD5S32);
697     MD5_STEP0(MD5_I , b, c, d, a,       MD5C37, MD5S33);
698     MD5_STEP0(MD5_I , a, b, c, d,       MD5C38, MD5S30);
699     MD5_STEP0(MD5_I , d, a, b, c,       MD5C39, MD5S31);
700     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3a, MD5S32);
701     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3b, MD5S33);
702     MD5_STEP0(MD5_I , a, b, c, d,       MD5C3c, MD5S30);
703
704     if (MATCHES_NONE_VS ((a + r_a), search[0])) continue;
705
706     MD5_STEP0(MD5_I , d, a, b, c,       MD5C3d, MD5S31);
707     MD5_STEP0(MD5_I , c, d, a, b,       MD5C3e, MD5S32);
708     MD5_STEP0(MD5_I , b, c, d, a,       MD5C3f, MD5S33);
709
710     a += r_a;
711     b += r_b;
712     c += r_c;
713     d += r_d;
714
715     COMPARE_S_SIMD (a, d, c, b);
716   }
717 }
718
719 __kernel void m02710_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
720 {
721   /**
722    * base
723    */
724
725   const u32 gid = get_global_id (0);
726   const u32 lid = get_local_id (0);
727   const u32 lsz = get_local_size (0);
728
729   /**
730    * modifier
731    */
732
733   u32 w0[4];
734
735   w0[0] = pws[gid].i[ 0];
736   w0[1] = pws[gid].i[ 1];
737   w0[2] = pws[gid].i[ 2];
738   w0[3] = pws[gid].i[ 3];
739
740   u32 w1[4];
741
742   w1[0] = 0;
743   w1[1] = 0;
744   w1[2] = 0;
745   w1[3] = 0;
746
747   u32 w2[4];
748
749   w2[0] = 0;
750   w2[1] = 0;
751   w2[2] = 0;
752   w2[3] = 0;
753
754   u32 w3[4];
755
756   w3[0] = 0;
757   w3[1] = 0;
758   w3[2] = pws[gid].i[14];
759   w3[3] = 0;
760
761   const u32 pw_len = pws[gid].pw_len;
762
763   /**
764    * bin2asc table
765    */
766
767   __local u32 l_bin2asc[256];
768
769   for (u32 i = lid; i < 256; i += lsz)
770   {
771     const u32 i0 = (i >> 0) & 15;
772     const u32 i1 = (i >> 4) & 15;
773
774     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
775                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
776   }
777
778   barrier (CLK_LOCAL_MEM_FENCE);
779
780   if (gid >= gid_max) return;
781
782   /**
783    * main
784    */
785
786   m02710m (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, l_bin2asc);
787 }
788
789 __kernel void m02710_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
790 {
791   /**
792    * base
793    */
794
795   const u32 gid = get_global_id (0);
796   const u32 lid = get_local_id (0);
797   const u32 lsz = get_local_size (0);
798
799   /**
800    * modifier
801    */
802
803   u32 w0[4];
804
805   w0[0] = pws[gid].i[ 0];
806   w0[1] = pws[gid].i[ 1];
807   w0[2] = pws[gid].i[ 2];
808   w0[3] = pws[gid].i[ 3];
809
810   u32 w1[4];
811
812   w1[0] = pws[gid].i[ 4];
813   w1[1] = pws[gid].i[ 5];
814   w1[2] = pws[gid].i[ 6];
815   w1[3] = pws[gid].i[ 7];
816
817   u32 w2[4];
818
819   w2[0] = 0;
820   w2[1] = 0;
821   w2[2] = 0;
822   w2[3] = 0;
823
824   u32 w3[4];
825
826   w3[0] = 0;
827   w3[1] = 0;
828   w3[2] = pws[gid].i[14];
829   w3[3] = 0;
830
831   const u32 pw_len = pws[gid].pw_len;
832
833   /**
834    * bin2asc table
835    */
836
837   __local u32 l_bin2asc[256];
838
839   for (u32 i = lid; i < 256; i += lsz)
840   {
841     const u32 i0 = (i >> 0) & 15;
842     const u32 i1 = (i >> 4) & 15;
843
844     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
845                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
846   }
847
848   barrier (CLK_LOCAL_MEM_FENCE);
849
850   if (gid >= gid_max) return;
851
852   /**
853    * main
854    */
855
856   m02710m (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, l_bin2asc);
857 }
858
859 __kernel void m02710_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
860 {
861   /**
862    * base
863    */
864
865   const u32 gid = get_global_id (0);
866   const u32 lid = get_local_id (0);
867   const u32 lsz = get_local_size (0);
868
869   /**
870    * modifier
871    */
872
873   u32 w0[4];
874
875   w0[0] = pws[gid].i[ 0];
876   w0[1] = pws[gid].i[ 1];
877   w0[2] = pws[gid].i[ 2];
878   w0[3] = pws[gid].i[ 3];
879
880   u32 w1[4];
881
882   w1[0] = pws[gid].i[ 4];
883   w1[1] = pws[gid].i[ 5];
884   w1[2] = pws[gid].i[ 6];
885   w1[3] = pws[gid].i[ 7];
886
887   u32 w2[4];
888
889   w2[0] = pws[gid].i[ 8];
890   w2[1] = pws[gid].i[ 9];
891   w2[2] = pws[gid].i[10];
892   w2[3] = pws[gid].i[11];
893
894   u32 w3[4];
895
896   w3[0] = pws[gid].i[12];
897   w3[1] = pws[gid].i[13];
898   w3[2] = pws[gid].i[14];
899   w3[3] = pws[gid].i[15];
900
901   const u32 pw_len = pws[gid].pw_len;
902
903   /**
904    * bin2asc table
905    */
906
907   __local u32 l_bin2asc[256];
908
909   for (u32 i = lid; i < 256; i += lsz)
910   {
911     const u32 i0 = (i >> 0) & 15;
912     const u32 i1 = (i >> 4) & 15;
913
914     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
915                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
916   }
917
918   barrier (CLK_LOCAL_MEM_FENCE);
919
920   if (gid >= gid_max) return;
921
922   /**
923    * main
924    */
925
926   m02710m (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, l_bin2asc);
927 }
928
929 __kernel void m02710_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
930 {
931   /**
932    * base
933    */
934
935   const u32 gid = get_global_id (0);
936   const u32 lid = get_local_id (0);
937   const u32 lsz = get_local_size (0);
938
939   /**
940    * modifier
941    */
942
943   u32 w0[4];
944
945   w0[0] = pws[gid].i[ 0];
946   w0[1] = pws[gid].i[ 1];
947   w0[2] = pws[gid].i[ 2];
948   w0[3] = pws[gid].i[ 3];
949
950   u32 w1[4];
951
952   w1[0] = 0;
953   w1[1] = 0;
954   w1[2] = 0;
955   w1[3] = 0;
956
957   u32 w2[4];
958
959   w2[0] = 0;
960   w2[1] = 0;
961   w2[2] = 0;
962   w2[3] = 0;
963
964   u32 w3[4];
965
966   w3[0] = 0;
967   w3[1] = 0;
968   w3[2] = pws[gid].i[14];
969   w3[3] = 0;
970
971   const u32 pw_len = pws[gid].pw_len;
972
973   /**
974    * bin2asc table
975    */
976
977   __local u32 l_bin2asc[256];
978
979   for (u32 i = lid; i < 256; i += lsz)
980   {
981     const u32 i0 = (i >> 0) & 15;
982     const u32 i1 = (i >> 4) & 15;
983
984     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
985                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
986   }
987
988   barrier (CLK_LOCAL_MEM_FENCE);
989
990   if (gid >= gid_max) return;
991
992   /**
993    * main
994    */
995
996   m02710s (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, l_bin2asc);
997 }
998
999 __kernel void m02710_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1000 {
1001   /**
1002    * base
1003    */
1004
1005   const u32 gid = get_global_id (0);
1006   const u32 lid = get_local_id (0);
1007   const u32 lsz = get_local_size (0);
1008
1009   /**
1010    * modifier
1011    */
1012
1013   u32 w0[4];
1014
1015   w0[0] = pws[gid].i[ 0];
1016   w0[1] = pws[gid].i[ 1];
1017   w0[2] = pws[gid].i[ 2];
1018   w0[3] = pws[gid].i[ 3];
1019
1020   u32 w1[4];
1021
1022   w1[0] = pws[gid].i[ 4];
1023   w1[1] = pws[gid].i[ 5];
1024   w1[2] = pws[gid].i[ 6];
1025   w1[3] = pws[gid].i[ 7];
1026
1027   u32 w2[4];
1028
1029   w2[0] = 0;
1030   w2[1] = 0;
1031   w2[2] = 0;
1032   w2[3] = 0;
1033
1034   u32 w3[4];
1035
1036   w3[0] = 0;
1037   w3[1] = 0;
1038   w3[2] = pws[gid].i[14];
1039   w3[3] = 0;
1040
1041   const u32 pw_len = pws[gid].pw_len;
1042
1043   /**
1044    * bin2asc table
1045    */
1046
1047   __local u32 l_bin2asc[256];
1048
1049   for (u32 i = lid; i < 256; i += lsz)
1050   {
1051     const u32 i0 = (i >> 0) & 15;
1052     const u32 i1 = (i >> 4) & 15;
1053
1054     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
1055                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
1056   }
1057
1058   barrier (CLK_LOCAL_MEM_FENCE);
1059
1060   if (gid >= gid_max) return;
1061
1062   /**
1063    * main
1064    */
1065
1066   m02710s (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, l_bin2asc);
1067 }
1068
1069 __kernel void m02710_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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1070 {
1071   /**
1072    * base
1073    */
1074
1075   const u32 gid = get_global_id (0);
1076   const u32 lid = get_local_id (0);
1077   const u32 lsz = get_local_size (0);
1078
1079   /**
1080    * modifier
1081    */
1082
1083   u32 w0[4];
1084
1085   w0[0] = pws[gid].i[ 0];
1086   w0[1] = pws[gid].i[ 1];
1087   w0[2] = pws[gid].i[ 2];
1088   w0[3] = pws[gid].i[ 3];
1089
1090   u32 w1[4];
1091
1092   w1[0] = pws[gid].i[ 4];
1093   w1[1] = pws[gid].i[ 5];
1094   w1[2] = pws[gid].i[ 6];
1095   w1[3] = pws[gid].i[ 7];
1096
1097   u32 w2[4];
1098
1099   w2[0] = pws[gid].i[ 8];
1100   w2[1] = pws[gid].i[ 9];
1101   w2[2] = pws[gid].i[10];
1102   w2[3] = pws[gid].i[11];
1103
1104   u32 w3[4];
1105
1106   w3[0] = pws[gid].i[12];
1107   w3[1] = pws[gid].i[13];
1108   w3[2] = pws[gid].i[14];
1109   w3[3] = pws[gid].i[15];
1110
1111   const u32 pw_len = pws[gid].pw_len;
1112
1113   /**
1114    * bin2asc table
1115    */
1116
1117   __local u32 l_bin2asc[256];
1118
1119   for (u32 i = lid; i < 256; i += lsz)
1120   {
1121     const u32 i0 = (i >> 0) & 15;
1122     const u32 i1 = (i >> 4) & 15;
1123
1124     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
1125                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
1126   }
1127
1128   barrier (CLK_LOCAL_MEM_FENCE);
1129
1130   if (gid >= gid_max) return;
1131
1132   /**
1133    * main
1134    */
1135
1136   m02710s (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, l_bin2asc);
1137 }