Upgrade kernel to support dynamic local work sizes
[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 "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19
20 #define COMPARE_S "OpenCL/check_single_comp4.c"
21 #define COMPARE_M "OpenCL/check_multi_comp4.c"
22
23 #define uint_to_hex_lower8(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 kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
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 kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
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 m04400_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
570 {
571   /**
572    * base
573    */
574
575   const u32 gid = get_global_id (0);
576   const u32 lid = get_local_id (0);
577   const u32 lsz = get_local_size (0);
578
579   /**
580    * bin2asc table
581    */
582
583   __local u32 l_bin2asc[256];
584
585   for (u32 i = lid; i < 256; i += lsz)
586   {
587     const u32 i0 = (i >> 0) & 15;
588     const u32 i1 = (i >> 4) & 15;
589
590     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
591                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
592   }
593
594   barrier (CLK_LOCAL_MEM_FENCE);
595
596   if (gid >= gid_max) return;
597
598   /**
599    * modifier
600    */
601
602   u32 w0[4];
603
604   w0[0] = pws[gid].i[ 0];
605   w0[1] = pws[gid].i[ 1];
606   w0[2] = pws[gid].i[ 2];
607   w0[3] = pws[gid].i[ 3];
608
609   u32 w1[4];
610
611   w1[0] = 0;
612   w1[1] = 0;
613   w1[2] = 0;
614   w1[3] = 0;
615
616   u32 w2[4];
617
618   w2[0] = 0;
619   w2[1] = 0;
620   w2[2] = 0;
621   w2[3] = 0;
622
623   u32 w3[4];
624
625   w3[0] = 0;
626   w3[1] = 0;
627   w3[2] = 0;
628   w3[3] = pws[gid].i[15];
629
630   const u32 pw_len = pws[gid].pw_len;
631
632   /**
633    * main
634    */
635
636   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);
637 }
638
639 __kernel void m04400_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
640 {
641   /**
642    * base
643    */
644
645   const u32 gid = get_global_id (0);
646   const u32 lid = get_local_id (0);
647   const u32 lsz = get_local_size (0);
648
649   /**
650    * bin2asc table
651    */
652
653   __local u32 l_bin2asc[256];
654
655   for (u32 i = lid; i < 256; i += lsz)
656   {
657     const u32 i0 = (i >> 0) & 15;
658     const u32 i1 = (i >> 4) & 15;
659
660     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
661                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
662   }
663
664   barrier (CLK_LOCAL_MEM_FENCE);
665
666   if (gid >= gid_max) return;
667
668   /**
669    * modifier
670    */
671
672   u32 w0[4];
673
674   w0[0] = pws[gid].i[ 0];
675   w0[1] = pws[gid].i[ 1];
676   w0[2] = pws[gid].i[ 2];
677   w0[3] = pws[gid].i[ 3];
678
679   u32 w1[4];
680
681   w1[0] = pws[gid].i[ 4];
682   w1[1] = pws[gid].i[ 5];
683   w1[2] = pws[gid].i[ 6];
684   w1[3] = pws[gid].i[ 7];
685
686   u32 w2[4];
687
688   w2[0] = 0;
689   w2[1] = 0;
690   w2[2] = 0;
691   w2[3] = 0;
692
693   u32 w3[4];
694
695   w3[0] = 0;
696   w3[1] = 0;
697   w3[2] = 0;
698   w3[3] = pws[gid].i[15];
699
700   const u32 pw_len = pws[gid].pw_len;
701
702   /**
703    * main
704    */
705
706   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);
707 }
708
709 __kernel void m04400_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
710 {
711   /**
712    * base
713    */
714
715   const u32 gid = get_global_id (0);
716   const u32 lid = get_local_id (0);
717   const u32 lsz = get_local_size (0);
718
719   /**
720    * bin2asc table
721    */
722
723   __local u32 l_bin2asc[256];
724
725   for (u32 i = lid; i < 256; i += lsz)
726   {
727     const u32 i0 = (i >> 0) & 15;
728     const u32 i1 = (i >> 4) & 15;
729
730     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
731                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
732   }
733
734   barrier (CLK_LOCAL_MEM_FENCE);
735
736   if (gid >= gid_max) return;
737
738   /**
739    * modifier
740    */
741
742   u32 w0[4];
743
744   w0[0] = pws[gid].i[ 0];
745   w0[1] = pws[gid].i[ 1];
746   w0[2] = pws[gid].i[ 2];
747   w0[3] = pws[gid].i[ 3];
748
749   u32 w1[4];
750
751   w1[0] = pws[gid].i[ 4];
752   w1[1] = pws[gid].i[ 5];
753   w1[2] = pws[gid].i[ 6];
754   w1[3] = pws[gid].i[ 7];
755
756   u32 w2[4];
757
758   w2[0] = pws[gid].i[ 8];
759   w2[1] = pws[gid].i[ 9];
760   w2[2] = pws[gid].i[10];
761   w2[3] = pws[gid].i[11];
762
763   u32 w3[4];
764
765   w3[0] = pws[gid].i[12];
766   w3[1] = pws[gid].i[13];
767   w3[2] = pws[gid].i[14];
768   w3[3] = pws[gid].i[15];
769
770   const u32 pw_len = pws[gid].pw_len;
771
772   /**
773    * main
774    */
775
776   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);
777 }
778
779 __kernel void m04400_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
780 {
781   /**
782    * base
783    */
784
785   const u32 gid = get_global_id (0);
786   const u32 lid = get_local_id (0);
787   const u32 lsz = get_local_size (0);
788
789   /**
790    * bin2asc table
791    */
792
793   __local u32 l_bin2asc[256];
794
795   for (u32 i = lid; i < 256; i += lsz)
796   {
797     const u32 i0 = (i >> 0) & 15;
798     const u32 i1 = (i >> 4) & 15;
799
800     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
801                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
802   }
803
804   barrier (CLK_LOCAL_MEM_FENCE);
805
806   if (gid >= gid_max) return;
807
808   /**
809    * modifier
810    */
811
812   u32 w0[4];
813
814   w0[0] = pws[gid].i[ 0];
815   w0[1] = pws[gid].i[ 1];
816   w0[2] = pws[gid].i[ 2];
817   w0[3] = pws[gid].i[ 3];
818
819   u32 w1[4];
820
821   w1[0] = 0;
822   w1[1] = 0;
823   w1[2] = 0;
824   w1[3] = 0;
825
826   u32 w2[4];
827
828   w2[0] = 0;
829   w2[1] = 0;
830   w2[2] = 0;
831   w2[3] = 0;
832
833   u32 w3[4];
834
835   w3[0] = 0;
836   w3[1] = 0;
837   w3[2] = 0;
838   w3[3] = pws[gid].i[15];
839
840   const u32 pw_len = pws[gid].pw_len;
841
842   /**
843    * main
844    */
845
846   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);
847 }
848
849 __kernel void m04400_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
850 {
851   /**
852    * base
853    */
854
855   const u32 gid = get_global_id (0);
856   const u32 lid = get_local_id (0);
857   const u32 lsz = get_local_size (0);
858
859   /**
860    * bin2asc table
861    */
862
863   __local u32 l_bin2asc[256];
864
865   for (u32 i = lid; i < 256; i += lsz)
866   {
867     const u32 i0 = (i >> 0) & 15;
868     const u32 i1 = (i >> 4) & 15;
869
870     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
871                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
872   }
873
874   barrier (CLK_LOCAL_MEM_FENCE);
875
876   if (gid >= gid_max) return;
877
878   /**
879    * modifier
880    */
881
882   u32 w0[4];
883
884   w0[0] = pws[gid].i[ 0];
885   w0[1] = pws[gid].i[ 1];
886   w0[2] = pws[gid].i[ 2];
887   w0[3] = pws[gid].i[ 3];
888
889   u32 w1[4];
890
891   w1[0] = pws[gid].i[ 4];
892   w1[1] = pws[gid].i[ 5];
893   w1[2] = pws[gid].i[ 6];
894   w1[3] = pws[gid].i[ 7];
895
896   u32 w2[4];
897
898   w2[0] = 0;
899   w2[1] = 0;
900   w2[2] = 0;
901   w2[3] = 0;
902
903   u32 w3[4];
904
905   w3[0] = 0;
906   w3[1] = 0;
907   w3[2] = 0;
908   w3[3] = pws[gid].i[15];
909
910   const u32 pw_len = pws[gid].pw_len;
911
912   /**
913    * main
914    */
915
916   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);
917 }
918
919 __kernel void m04400_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
920 {
921   /**
922    * base
923    */
924
925   const u32 gid = get_global_id (0);
926   const u32 lid = get_local_id (0);
927   const u32 lsz = get_local_size (0);
928
929   /**
930    * bin2asc table
931    */
932
933   __local u32 l_bin2asc[256];
934
935   for (u32 i = lid; i < 256; i += lsz)
936   {
937     const u32 i0 = (i >> 0) & 15;
938     const u32 i1 = (i >> 4) & 15;
939
940     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
941                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
942   }
943
944   barrier (CLK_LOCAL_MEM_FENCE);
945
946   if (gid >= gid_max) return;
947
948   /**
949    * modifier
950    */
951
952   u32 w0[4];
953
954   w0[0] = pws[gid].i[ 0];
955   w0[1] = pws[gid].i[ 1];
956   w0[2] = pws[gid].i[ 2];
957   w0[3] = pws[gid].i[ 3];
958
959   u32 w1[4];
960
961   w1[0] = pws[gid].i[ 4];
962   w1[1] = pws[gid].i[ 5];
963   w1[2] = pws[gid].i[ 6];
964   w1[3] = pws[gid].i[ 7];
965
966   u32 w2[4];
967
968   w2[0] = pws[gid].i[ 8];
969   w2[1] = pws[gid].i[ 9];
970   w2[2] = pws[gid].i[10];
971   w2[3] = pws[gid].i[11];
972
973   u32 w3[4];
974
975   w3[0] = pws[gid].i[12];
976   w3[1] = pws[gid].i[13];
977   w3[2] = pws[gid].i[14];
978   w3[3] = pws[gid].i[15];
979
980   const u32 pw_len = pws[gid].pw_len;
981
982   /**
983    * main
984    */
985
986   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);
987 }