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