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