Merge branch 'master' of https://github.com/hashcat/oclHashcat
[hashcat.git] / OpenCL / m08400_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 3
12 #define DGST_R1 4
13 #define DGST_R2 2
14 #define DGST_R3 1
15
16 #include "include/kernel_functions.c"
17 #include "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19
20 #define COMPARE_S "OpenCL/check_single_comp4.c"
21 #define COMPARE_M "OpenCL/check_multi_comp4.c"
22
23 #define uint_to_hex_lower8_le(i) l_bin2asc[(i)]
24
25 static void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5])
26 {
27   u32 A = digest[0];
28   u32 B = digest[1];
29   u32 C = digest[2];
30   u32 D = digest[3];
31   u32 E = digest[4];
32
33   u32 w0_t = w0[0];
34   u32 w1_t = w0[1];
35   u32 w2_t = w0[2];
36   u32 w3_t = w0[3];
37   u32 w4_t = w1[0];
38   u32 w5_t = w1[1];
39   u32 w6_t = w1[2];
40   u32 w7_t = w1[3];
41   u32 w8_t = w2[0];
42   u32 w9_t = w2[1];
43   u32 wa_t = w2[2];
44   u32 wb_t = w2[3];
45   u32 wc_t = w3[0];
46   u32 wd_t = w3[1];
47   u32 we_t = w3[2];
48   u32 wf_t = w3[3];
49
50   #undef K
51   #define K SHA1C00
52
53   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
54   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
55   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
56   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
57   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
58   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
59   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
60   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
61   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
62   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
63   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
64   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
65   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
66   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
67   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
68   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
69   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
70   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
71   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
72   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
73
74   #undef K
75   #define K SHA1C01
76
77   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
78   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
79   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
80   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
81   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
82   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
83   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
84   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
85   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
86   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
87   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
88   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
89   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
90   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
91   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
92   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
93   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
94   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
95   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
96   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
97
98   #undef K
99   #define K SHA1C02
100
101   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
102   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
103   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
104   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
105   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
106   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
107   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
108   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
109   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
110   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
111   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
112   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
113   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
114   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
115   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
116   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
117   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
118   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
119   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
120   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
121
122   #undef K
123   #define K SHA1C03
124
125   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
126   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
127   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
128   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
129   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
130   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
131   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
132   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
133   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
134   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
135   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
136   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
137   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
138   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
139   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
140   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
141   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
142   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
143   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
144   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
145
146   digest[0] += A;
147   digest[1] += B;
148   digest[2] += C;
149   digest[3] += D;
150   digest[4] += E;
151 }
152
153 static void m08400m (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[256])
154 {
155   /**
156    * modifier
157    */
158
159   const u32 gid = get_global_id (0);
160   const u32 lid = get_local_id (0);
161
162   /**
163    * salt
164    */
165
166   u32 salt_buf0[4];
167
168   salt_buf0[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 0]);
169   salt_buf0[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 1]);
170   salt_buf0[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 2]);
171   salt_buf0[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 3]);
172
173   u32 salt_buf1[4];
174
175   salt_buf1[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 4]);
176   salt_buf1[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 5]);
177   salt_buf1[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 6]);
178   salt_buf1[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 7]);
179
180   u32 salt_buf2[4];
181
182   salt_buf2[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 8]);
183   salt_buf2[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 9]);
184   salt_buf2[2] = 0;
185   salt_buf2[3] = 0;
186
187   const u32 salt_len = salt_bufs[salt_pos].salt_len;
188
189   /**
190    * loop
191    */
192
193   u32 w0l = w0[0];
194
195   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
196   {
197     const u32 w0r = bfs_buf[il_pos].i;
198
199     w0[0] = w0l | w0r;
200
201     u32 w0_t[4];
202
203     w0_t[0] = w0[0];
204     w0_t[1] = w0[1];
205     w0_t[2] = w0[2];
206     w0_t[3] = w0[3];
207
208     u32 w1_t[4];
209
210     w1_t[0] = w1[0];
211     w1_t[1] = w1[1];
212     w1_t[2] = w1[2];
213     w1_t[3] = w1[3];
214
215     u32 w2_t[4];
216
217     w2_t[0] = w2[0];
218     w2_t[1] = w2[1];
219     w2_t[2] = w2[2];
220     w2_t[3] = w2[3];
221
222     u32 w3_t[4];
223
224     w3_t[0] = w3[0];
225     w3_t[1] = w3[1];
226     w3_t[2] = 0;
227     w3_t[3] = pw_len * 8;
228
229     u32 digest[5];
230
231     digest[0] = SHA1M_A;
232     digest[1] = SHA1M_B;
233     digest[2] = SHA1M_C;
234     digest[3] = SHA1M_D;
235     digest[4] = SHA1M_E;
236
237     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
238
239     u32 a;
240     u32 b;
241     u32 c;
242     u32 d;
243     u32 e;
244
245     a = digest[0];
246     b = digest[1];
247     c = digest[2];
248     d = digest[3];
249     e = digest[4];
250
251     w0_t[0] = salt_buf0[0];
252     w0_t[1] = salt_buf0[1];
253     w0_t[2] = salt_buf0[2];
254     w0_t[3] = salt_buf0[3];
255     w1_t[0] = salt_buf1[0];
256     w1_t[1] = salt_buf1[1];
257     w1_t[2] = salt_buf1[2];
258     w1_t[3] = salt_buf1[3];
259     w2_t[0] = salt_buf2[0];
260     w2_t[1] = salt_buf2[1];
261     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
262             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
263     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
264             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
265     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
266             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
267     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
268             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
269     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
270             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
271     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
272             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
273
274     digest[0] = SHA1M_A;
275     digest[1] = SHA1M_B;
276     digest[2] = SHA1M_C;
277     digest[3] = SHA1M_D;
278     digest[4] = SHA1M_E;
279
280     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
281
282     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
283             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
284     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
285             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
286     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
287             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
288     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
289             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
290     w1_t[0] = 0x80000000;
291     w1_t[1] = 0;
292     w1_t[2] = 0;
293     w1_t[3] = 0;
294     w2_t[0] = 0;
295     w2_t[1] = 0;
296     w2_t[2] = 0;
297     w2_t[3] = 0;
298     w3_t[0] = 0;
299     w3_t[1] = 0;
300     w3_t[2] = 0;
301     w3_t[3] = 80 * 8;
302
303     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
304
305     a = digest[0];
306     b = digest[1];
307     c = digest[2];
308     d = digest[3];
309     e = digest[4];
310
311     w0_t[0] = salt_buf0[0];
312     w0_t[1] = salt_buf0[1];
313     w0_t[2] = salt_buf0[2];
314     w0_t[3] = salt_buf0[3];
315     w1_t[0] = salt_buf1[0];
316     w1_t[1] = salt_buf1[1];
317     w1_t[2] = salt_buf1[2];
318     w1_t[3] = salt_buf1[3];
319     w2_t[0] = salt_buf2[0];
320     w2_t[1] = salt_buf2[1];
321     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
322             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
323     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
324             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
325     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
326             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
327     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
328             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
329     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
330             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
331     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
332             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
333
334     digest[0] = SHA1M_A;
335     digest[1] = SHA1M_B;
336     digest[2] = SHA1M_C;
337     digest[3] = SHA1M_D;
338     digest[4] = SHA1M_E;
339
340     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
341
342     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
343             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
344     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
345             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
346     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
347             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
348     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
349             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
350     w1_t[0] = 0x80000000;
351     w1_t[1] = 0;
352     w1_t[2] = 0;
353     w1_t[3] = 0;
354     w2_t[0] = 0;
355     w2_t[1] = 0;
356     w2_t[2] = 0;
357     w2_t[3] = 0;
358     w3_t[0] = 0;
359     w3_t[1] = 0;
360     w3_t[2] = 0;
361     w3_t[3] = 80 * 8;
362
363     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
364
365     const u32 r0 = digest[3];
366     const u32 r1 = digest[4];
367     const u32 r2 = digest[2];
368     const u32 r3 = digest[1];
369
370     #include COMPARE_M
371   }
372 }
373
374 static void m08400s (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[256])
375 {
376   /**
377    * modifier
378    */
379
380   const u32 gid = get_global_id (0);
381   const u32 lid = get_local_id (0);
382
383   /**
384    * digest
385    */
386
387   const u32 search[4] =
388   {
389     digests_buf[digests_offset].digest_buf[DGST_R0],
390     digests_buf[digests_offset].digest_buf[DGST_R1],
391     digests_buf[digests_offset].digest_buf[DGST_R2],
392     digests_buf[digests_offset].digest_buf[DGST_R3]
393   };
394
395   /**
396    * salt
397    */
398
399   u32 salt_buf0[4];
400
401   salt_buf0[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 0]);
402   salt_buf0[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 1]);
403   salt_buf0[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 2]);
404   salt_buf0[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 3]);
405
406   u32 salt_buf1[4];
407
408   salt_buf1[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 4]);
409   salt_buf1[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 5]);
410   salt_buf1[2] = swap32 (salt_bufs[salt_pos].salt_buf[ 6]);
411   salt_buf1[3] = swap32 (salt_bufs[salt_pos].salt_buf[ 7]);
412
413   u32 salt_buf2[4];
414
415   salt_buf2[0] = swap32 (salt_bufs[salt_pos].salt_buf[ 8]);
416   salt_buf2[1] = swap32 (salt_bufs[salt_pos].salt_buf[ 9]);
417   salt_buf2[2] = 0;
418   salt_buf2[3] = 0;
419
420   const u32 salt_len = salt_bufs[salt_pos].salt_len;
421
422   /**
423    * loop
424    */
425
426   u32 w0l = w0[0];
427
428   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
429   {
430     const u32 w0r = bfs_buf[il_pos].i;
431
432     w0[0] = w0l | w0r;
433
434     u32 w0_t[4];
435
436     w0_t[0] = w0[0];
437     w0_t[1] = w0[1];
438     w0_t[2] = w0[2];
439     w0_t[3] = w0[3];
440
441     u32 w1_t[4];
442
443     w1_t[0] = w1[0];
444     w1_t[1] = w1[1];
445     w1_t[2] = w1[2];
446     w1_t[3] = w1[3];
447
448     u32 w2_t[4];
449
450     w2_t[0] = w2[0];
451     w2_t[1] = w2[1];
452     w2_t[2] = w2[2];
453     w2_t[3] = w2[3];
454
455     u32 w3_t[4];
456
457     w3_t[0] = w3[0];
458     w3_t[1] = w3[1];
459     w3_t[2] = 0;
460     w3_t[3] = pw_len * 8;
461
462     u32 digest[5];
463
464     digest[0] = SHA1M_A;
465     digest[1] = SHA1M_B;
466     digest[2] = SHA1M_C;
467     digest[3] = SHA1M_D;
468     digest[4] = SHA1M_E;
469
470     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
471
472     u32 a;
473     u32 b;
474     u32 c;
475     u32 d;
476     u32 e;
477
478     a = digest[0];
479     b = digest[1];
480     c = digest[2];
481     d = digest[3];
482     e = digest[4];
483
484     w0_t[0] = salt_buf0[0];
485     w0_t[1] = salt_buf0[1];
486     w0_t[2] = salt_buf0[2];
487     w0_t[3] = salt_buf0[3];
488     w1_t[0] = salt_buf1[0];
489     w1_t[1] = salt_buf1[1];
490     w1_t[2] = salt_buf1[2];
491     w1_t[3] = salt_buf1[3];
492     w2_t[0] = salt_buf2[0];
493     w2_t[1] = salt_buf2[1];
494     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
495             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
496     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
497             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
498     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
499             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
500     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
501             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
502     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
503             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
504     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
505             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
506
507     digest[0] = SHA1M_A;
508     digest[1] = SHA1M_B;
509     digest[2] = SHA1M_C;
510     digest[3] = SHA1M_D;
511     digest[4] = SHA1M_E;
512
513     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
514
515     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
516             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
517     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
518             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
519     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
520             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
521     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
522             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
523     w1_t[0] = 0x80000000;
524     w1_t[1] = 0;
525     w1_t[2] = 0;
526     w1_t[3] = 0;
527     w2_t[0] = 0;
528     w2_t[1] = 0;
529     w2_t[2] = 0;
530     w2_t[3] = 0;
531     w3_t[0] = 0;
532     w3_t[1] = 0;
533     w3_t[2] = 0;
534     w3_t[3] = (salt_len + 40) * 8;
535
536     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
537
538     a = digest[0];
539     b = digest[1];
540     c = digest[2];
541     d = digest[3];
542     e = digest[4];
543
544     w0_t[0] = salt_buf0[0];
545     w0_t[1] = salt_buf0[1];
546     w0_t[2] = salt_buf0[2];
547     w0_t[3] = salt_buf0[3];
548     w1_t[0] = salt_buf1[0];
549     w1_t[1] = salt_buf1[1];
550     w1_t[2] = salt_buf1[2];
551     w1_t[3] = salt_buf1[3];
552     w2_t[0] = salt_buf2[0];
553     w2_t[1] = salt_buf2[1];
554     w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) <<  0
555             | uint_to_hex_lower8_le ((a >> 24) & 255) << 16;
556     w2_t[3] = uint_to_hex_lower8_le ((a >>  0) & 255) <<  0
557             | uint_to_hex_lower8_le ((a >>  8) & 255) << 16;
558     w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) <<  0
559             | uint_to_hex_lower8_le ((b >> 24) & 255) << 16;
560     w3_t[1] = uint_to_hex_lower8_le ((b >>  0) & 255) <<  0
561             | uint_to_hex_lower8_le ((b >>  8) & 255) << 16;
562     w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) <<  0
563             | uint_to_hex_lower8_le ((c >> 24) & 255) << 16;
564     w3_t[3] = uint_to_hex_lower8_le ((c >>  0) & 255) <<  0
565             | uint_to_hex_lower8_le ((c >>  8) & 255) << 16;
566
567     digest[0] = SHA1M_A;
568     digest[1] = SHA1M_B;
569     digest[2] = SHA1M_C;
570     digest[3] = SHA1M_D;
571     digest[4] = SHA1M_E;
572
573     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
574
575     w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) <<  0
576             | uint_to_hex_lower8_le ((d >> 24) & 255) << 16;
577     w0_t[1] = uint_to_hex_lower8_le ((d >>  0) & 255) <<  0
578             | uint_to_hex_lower8_le ((d >>  8) & 255) << 16;
579     w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) <<  0
580             | uint_to_hex_lower8_le ((e >> 24) & 255) << 16;
581     w0_t[3] = uint_to_hex_lower8_le ((e >>  0) & 255) <<  0
582             | uint_to_hex_lower8_le ((e >>  8) & 255) << 16;
583     w1_t[0] = 0x80000000;
584     w1_t[1] = 0;
585     w1_t[2] = 0;
586     w1_t[3] = 0;
587     w2_t[0] = 0;
588     w2_t[1] = 0;
589     w2_t[2] = 0;
590     w2_t[3] = 0;
591     w3_t[0] = 0;
592     w3_t[1] = 0;
593     w3_t[2] = 0;
594     w3_t[3] = (salt_len + 40) * 8;
595
596     sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
597
598     const u32 r0 = digest[3];
599     const u32 r1 = digest[4];
600     const u32 r2 = digest[2];
601     const u32 r3 = digest[1];
602
603     #include COMPARE_S
604   }
605 }
606
607 __kernel void m08400_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 *ss, __global void *ess, __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)
608 {
609   /**
610    * modifier
611    */
612
613   const u32 gid = get_global_id (0);
614   const u32 lid = get_local_id (0);
615   const u32 lsz = get_local_size (0);
616
617   /**
618    * shared
619    */
620
621   __local u32 l_bin2asc[256];
622
623   for (u32 i = lid; i < 256; i += lsz)
624   {
625     const u32 i0 = (i >> 0) & 15;
626     const u32 i1 = (i >> 4) & 15;
627
628     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
629                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
630   }
631
632   barrier (CLK_LOCAL_MEM_FENCE);
633
634   if (gid >= gid_max) return;
635
636   /**
637    * base
638    */
639
640   u32 w0[4];
641
642   w0[0] = pws[gid].i[ 0];
643   w0[1] = pws[gid].i[ 1];
644   w0[2] = pws[gid].i[ 2];
645   w0[3] = pws[gid].i[ 3];
646
647   u32 w1[4];
648
649   w1[0] = 0;
650   w1[1] = 0;
651   w1[2] = 0;
652   w1[3] = 0;
653
654   u32 w2[4];
655
656   w2[0] = 0;
657   w2[1] = 0;
658   w2[2] = 0;
659   w2[3] = 0;
660
661   u32 w3[4];
662
663   w3[0] = 0;
664   w3[1] = 0;
665   w3[2] = 0;
666   w3[3] = 0;
667
668   const u32 pw_len = pws[gid].pw_len;
669
670   /**
671    * main
672    */
673
674   m08400m (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, ss, ess, 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);
675 }
676
677 __kernel void m08400_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 *ss, __global void *ess, __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)
678 {
679   /**
680    * modifier
681    */
682
683   const u32 gid = get_global_id (0);
684   const u32 lid = get_local_id (0);
685   const u32 lsz = get_local_size (0);
686
687   /**
688    * shared
689    */
690
691   __local u32 l_bin2asc[256];
692
693   for (u32 i = lid; i < 256; i += lsz)
694   {
695     const u32 i0 = (i >> 0) & 15;
696     const u32 i1 = (i >> 4) & 15;
697
698     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
699                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
700   }
701
702   barrier (CLK_LOCAL_MEM_FENCE);
703
704   if (gid >= gid_max) return;
705
706   /**
707    * base
708    */
709
710   u32 w0[4];
711
712   w0[0] = pws[gid].i[ 0];
713   w0[1] = pws[gid].i[ 1];
714   w0[2] = pws[gid].i[ 2];
715   w0[3] = pws[gid].i[ 3];
716
717   u32 w1[4];
718
719   w1[0] = pws[gid].i[ 4];
720   w1[1] = pws[gid].i[ 5];
721   w1[2] = pws[gid].i[ 6];
722   w1[3] = pws[gid].i[ 7];
723
724   u32 w2[4];
725
726   w2[0] = 0;
727   w2[1] = 0;
728   w2[2] = 0;
729   w2[3] = 0;
730
731   u32 w3[4];
732
733   w3[0] = 0;
734   w3[1] = 0;
735   w3[2] = 0;
736   w3[3] = 0;
737
738   const u32 pw_len = pws[gid].pw_len;
739
740   /**
741    * main
742    */
743
744   m08400m (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, ss, ess, 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);
745 }
746
747 __kernel void m08400_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 *ss, __global void *ess, __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)
748 {
749   /**
750    * modifier
751    */
752
753   const u32 gid = get_global_id (0);
754   const u32 lid = get_local_id (0);
755   const u32 lsz = get_local_size (0);
756
757   /**
758    * shared
759    */
760
761   __local u32 l_bin2asc[256];
762
763   for (u32 i = lid; i < 256; i += lsz)
764   {
765     const u32 i0 = (i >> 0) & 15;
766     const u32 i1 = (i >> 4) & 15;
767
768     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
769                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
770   }
771
772   barrier (CLK_LOCAL_MEM_FENCE);
773
774   if (gid >= gid_max) return;
775
776   /**
777    * base
778    */
779
780   u32 w0[4];
781
782   w0[0] = pws[gid].i[ 0];
783   w0[1] = pws[gid].i[ 1];
784   w0[2] = pws[gid].i[ 2];
785   w0[3] = pws[gid].i[ 3];
786
787   u32 w1[4];
788
789   w1[0] = pws[gid].i[ 4];
790   w1[1] = pws[gid].i[ 5];
791   w1[2] = pws[gid].i[ 6];
792   w1[3] = pws[gid].i[ 7];
793
794   u32 w2[4];
795
796   w2[0] = pws[gid].i[ 8];
797   w2[1] = pws[gid].i[ 9];
798   w2[2] = pws[gid].i[10];
799   w2[3] = pws[gid].i[11];
800
801   u32 w3[4];
802
803   w3[0] = pws[gid].i[12];
804   w3[1] = pws[gid].i[13];
805   w3[2] = 0;
806   w3[3] = 0;
807
808   const u32 pw_len = pws[gid].pw_len;
809
810   /**
811    * main
812    */
813
814   m08400m (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, ss, ess, 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);
815 }
816
817 __kernel void m08400_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 *ss, __global void *ess, __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)
818 {
819   /**
820    * modifier
821    */
822
823   const u32 gid = get_global_id (0);
824   const u32 lid = get_local_id (0);
825   const u32 lsz = get_local_size (0);
826
827   /**
828    * shared
829    */
830
831   __local u32 l_bin2asc[256];
832
833   for (u32 i = lid; i < 256; i += lsz)
834   {
835     const u32 i0 = (i >> 0) & 15;
836     const u32 i1 = (i >> 4) & 15;
837
838     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
839                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
840   }
841
842   barrier (CLK_LOCAL_MEM_FENCE);
843
844   if (gid >= gid_max) return;
845
846   /**
847    * base
848    */
849
850   u32 w0[4];
851
852   w0[0] = pws[gid].i[ 0];
853   w0[1] = pws[gid].i[ 1];
854   w0[2] = pws[gid].i[ 2];
855   w0[3] = pws[gid].i[ 3];
856
857   u32 w1[4];
858
859   w1[0] = 0;
860   w1[1] = 0;
861   w1[2] = 0;
862   w1[3] = 0;
863
864   u32 w2[4];
865
866   w2[0] = 0;
867   w2[1] = 0;
868   w2[2] = 0;
869   w2[3] = 0;
870
871   u32 w3[4];
872
873   w3[0] = 0;
874   w3[1] = 0;
875   w3[2] = 0;
876   w3[3] = 0;
877
878   const u32 pw_len = pws[gid].pw_len;
879
880   /**
881    * main
882    */
883
884   m08400s (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, ss, ess, 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);
885 }
886
887 __kernel void m08400_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 *ss, __global void *ess, __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)
888 {
889   /**
890    * modifier
891    */
892
893   const u32 gid = get_global_id (0);
894   const u32 lid = get_local_id (0);
895   const u32 lsz = get_local_size (0);
896
897   /**
898    * shared
899    */
900
901   __local u32 l_bin2asc[256];
902
903   for (u32 i = lid; i < 256; i += lsz)
904   {
905     const u32 i0 = (i >> 0) & 15;
906     const u32 i1 = (i >> 4) & 15;
907
908     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
909                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
910   }
911
912   barrier (CLK_LOCAL_MEM_FENCE);
913
914   if (gid >= gid_max) return;
915
916   /**
917    * base
918    */
919
920   u32 w0[4];
921
922   w0[0] = pws[gid].i[ 0];
923   w0[1] = pws[gid].i[ 1];
924   w0[2] = pws[gid].i[ 2];
925   w0[3] = pws[gid].i[ 3];
926
927   u32 w1[4];
928
929   w1[0] = pws[gid].i[ 4];
930   w1[1] = pws[gid].i[ 5];
931   w1[2] = pws[gid].i[ 6];
932   w1[3] = pws[gid].i[ 7];
933
934   u32 w2[4];
935
936   w2[0] = 0;
937   w2[1] = 0;
938   w2[2] = 0;
939   w2[3] = 0;
940
941   u32 w3[4];
942
943   w3[0] = 0;
944   w3[1] = 0;
945   w3[2] = 0;
946   w3[3] = 0;
947
948   const u32 pw_len = pws[gid].pw_len;
949
950   /**
951    * main
952    */
953
954   m08400s (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, ss, ess, 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);
955 }
956
957 __kernel void m08400_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 *ss, __global void *ess, __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)
958 {
959   /**
960    * modifier
961    */
962
963   const u32 gid = get_global_id (0);
964   const u32 lid = get_local_id (0);
965   const u32 lsz = get_local_size (0);
966
967   /**
968    * shared
969    */
970
971   __local u32 l_bin2asc[256];
972
973   for (u32 i = lid; i < 256; i += lsz)
974   {
975     const u32 i0 = (i >> 0) & 15;
976     const u32 i1 = (i >> 4) & 15;
977
978     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0
979                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8;
980   }
981
982   barrier (CLK_LOCAL_MEM_FENCE);
983
984   if (gid >= gid_max) return;
985
986   /**
987    * base
988    */
989
990   u32 w0[4];
991
992   w0[0] = pws[gid].i[ 0];
993   w0[1] = pws[gid].i[ 1];
994   w0[2] = pws[gid].i[ 2];
995   w0[3] = pws[gid].i[ 3];
996
997   u32 w1[4];
998
999   w1[0] = pws[gid].i[ 4];
1000   w1[1] = pws[gid].i[ 5];
1001   w1[2] = pws[gid].i[ 6];
1002   w1[3] = pws[gid].i[ 7];
1003
1004   u32 w2[4];
1005
1006   w2[0] = pws[gid].i[ 8];
1007   w2[1] = pws[gid].i[ 9];
1008   w2[2] = pws[gid].i[10];
1009   w2[3] = pws[gid].i[11];
1010
1011   u32 w3[4];
1012
1013   w3[0] = pws[gid].i[12];
1014   w3[1] = pws[gid].i[13];
1015   w3[2] = 0;
1016   w3[3] = 0;
1017
1018   const u32 pw_len = pws[gid].pw_len;
1019
1020   /**
1021    * main
1022    */
1023
1024   m08400s (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, ss, ess, 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);
1025 }