Initial commit
[hashcat.git] / amd / m12600_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA256_SHA1_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE4
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE4
21 #endif
22
23 #define DGST_R0 3
24 #define DGST_R1 7
25 #define DGST_R2 2
26 #define DGST_R3 6
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31
32 #ifdef  VECT_SIZE1
33 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
34 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
35 #endif
36
37 #ifdef  VECT_SIZE2
38 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
39 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
40 #endif
41
42 #ifdef  VECT_SIZE4
43 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
44 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
45 #endif
46
47 #ifdef VECT_SIZE1
48 #define uint_to_hex_upper8(i) l_bin2asc[(i)]
49 #endif
50
51 #ifdef VECT_SIZE2
52 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
53 #endif
54
55 #ifdef VECT_SIZE4
56 #define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3])
57 #endif
58
59 static void m12600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x 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])
60 {
61   /**
62    * modifier
63    */
64
65   const u32 gid = get_global_id (0);
66   const u32 lid = get_local_id (0);
67
68   /**
69    * salt
70    */
71
72   u32 pc256[8];
73
74   pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0];
75   pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1];
76   pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2];
77   pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3];
78   pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4];
79   pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5];
80   pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6];
81   pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7];
82
83   /**
84    * loop
85    */
86
87   u32x w0l = w0[0];
88
89   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
90   {
91     const u32 w0r = bfs_buf[il_pos].i;
92
93     w0[0] = w0l | w0r;
94
95     /**
96      * sha1
97      */
98
99     u32x w0_t = w0[0];
100     u32x w1_t = w0[1];
101     u32x w2_t = w0[2];
102     u32x w3_t = w0[3];
103     u32x w4_t = w1[0];
104     u32x w5_t = w1[1];
105     u32x w6_t = w1[2];
106     u32x w7_t = w1[3];
107     u32x w8_t = w2[0];
108     u32x w9_t = w2[1];
109     u32x wa_t = w2[2];
110     u32x wb_t = w2[3];
111     u32x wc_t = w3[0];
112     u32x wd_t = w3[1];
113     u32x we_t = 0;
114     u32x wf_t = pw_len * 8;
115
116     u32x a = SHA1M_A;
117     u32x b = SHA1M_B;
118     u32x c = SHA1M_C;
119     u32x d = SHA1M_D;
120     u32x e = SHA1M_E;
121     u32x f = 0;
122     u32x g = 0;
123     u32x h = 0;
124
125     #undef K
126     #define K SHA1C00
127
128     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t);
129     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t);
130     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t);
131     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t);
132     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t);
133     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t);
134     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t);
135     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t);
136     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t);
137     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t);
138     SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t);
139     SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t);
140     SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t);
141     SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t);
142     SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t);
143     SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t);
144     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t);
145     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t);
146     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t);
147     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t);
148
149     #undef K
150     #define K SHA1C01
151
152     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t);
153     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t);
154     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t);
155     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t);
156     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t);
157     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t);
158     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t);
159     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t);
160     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t);
161     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t);
162     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t);
163     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t);
164     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t);
165     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t);
166     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t);
167     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t);
168     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t);
169     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t);
170     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t);
171     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t);
172
173     #undef K
174     #define K SHA1C02
175
176     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t);
177     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t);
178     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t);
179     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t);
180     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t);
181     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t);
182     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t);
183     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t);
184     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t);
185     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t);
186     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t);
187     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t);
188     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t);
189     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t);
190     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t);
191     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t);
192     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t);
193     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t);
194     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t);
195     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t);
196
197     #undef K
198     #define K SHA1C03
199
200     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t);
201     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t);
202     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t);
203     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t);
204     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t);
205     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t);
206     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t);
207     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t);
208     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t);
209     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t);
210     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t);
211     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t);
212     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t);
213     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t);
214     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t);
215     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t);
216     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t);
217     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t);
218     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t);
219     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t);
220
221     a += SHA1M_A;
222     b += SHA1M_B;
223     c += SHA1M_C;
224     d += SHA1M_D;
225     e += SHA1M_E;
226
227     /**
228      * sha256
229      */
230
231     w0_t = uint_to_hex_upper8 ((a >> 24) & 255) <<  0
232          | uint_to_hex_upper8 ((a >> 16) & 255) << 16;
233     w1_t = uint_to_hex_upper8 ((a >>  8) & 255) <<  0
234          | uint_to_hex_upper8 ((a >>  0) & 255) << 16;
235     w2_t = uint_to_hex_upper8 ((b >> 24) & 255) <<  0
236          | uint_to_hex_upper8 ((b >> 16) & 255) << 16;
237     w3_t = uint_to_hex_upper8 ((b >>  8) & 255) <<  0
238          | uint_to_hex_upper8 ((b >>  0) & 255) << 16;
239     w4_t = uint_to_hex_upper8 ((c >> 24) & 255) <<  0
240          | uint_to_hex_upper8 ((c >> 16) & 255) << 16;
241     w5_t = uint_to_hex_upper8 ((c >>  8) & 255) <<  0
242          | uint_to_hex_upper8 ((c >>  0) & 255) << 16;
243     w6_t = uint_to_hex_upper8 ((d >> 24) & 255) <<  0
244          | uint_to_hex_upper8 ((d >> 16) & 255) << 16;
245     w7_t = uint_to_hex_upper8 ((d >>  8) & 255) <<  0
246          | uint_to_hex_upper8 ((d >>  0) & 255) << 16;
247     w8_t = uint_to_hex_upper8 ((e >> 24) & 255) <<  0
248          | uint_to_hex_upper8 ((e >> 16) & 255) << 16;
249     w9_t = uint_to_hex_upper8 ((e >>  8) & 255) <<  0
250          | uint_to_hex_upper8 ((e >>  0) & 255) << 16;
251
252     w0_t = swap_workaround (w0_t);
253     w1_t = swap_workaround (w1_t);
254     w2_t = swap_workaround (w2_t);
255     w3_t = swap_workaround (w3_t);
256     w4_t = swap_workaround (w4_t);
257     w5_t = swap_workaround (w5_t);
258     w6_t = swap_workaround (w6_t);
259     w7_t = swap_workaround (w7_t);
260     w8_t = swap_workaround (w8_t);
261     w9_t = swap_workaround (w9_t);
262     wa_t = 0x80000000;
263     wb_t = 0;
264     wc_t = 0;
265     wd_t = 0;
266     we_t = 0;
267     wf_t = (64 + 40) * 8;
268
269     a = pc256[0];
270     b = pc256[1];
271     c = pc256[2];
272     d = pc256[3];
273     e = pc256[4];
274     f = pc256[5];
275     g = pc256[6];
276     h = pc256[7];
277
278     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00);
279     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01);
280     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02);
281     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03);
282     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04);
283     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05);
284     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06);
285     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07);
286     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08);
287     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09);
288     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a);
289     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b);
290     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c);
291     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d);
292     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e);
293     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f);
294
295     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10);
296     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11);
297     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12);
298     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13);
299     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14);
300     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15);
301     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16);
302     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17);
303     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18);
304     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19);
305     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a);
306     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b);
307     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c);
308     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d);
309     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e);
310     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f);
311
312     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20);
313     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21);
314     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22);
315     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23);
316     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24);
317     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25);
318     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26);
319     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27);
320     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28);
321     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29);
322     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a);
323     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b);
324     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c);
325     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d);
326     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e);
327     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f);
328
329     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30);
330     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31);
331     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32);
332     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33);
333     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34);
334     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35);
335     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36);
336     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37);
337     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38);
338     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39);
339     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a);
340     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b);
341     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c);
342     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d);
343     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e);
344     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f);
345
346     const u32x r0 = d;
347     const u32x r1 = h;
348     const u32x r2 = c;
349     const u32x r3 = g;
350
351     #include VECT_COMPARE_M
352   }
353 }
354
355 static void m12600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x 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])
356 {
357   /**
358    * modifier
359    */
360
361   const u32 gid = get_global_id (0);
362   const u32 lid = get_local_id (0);
363
364   /**
365    * digest
366    */
367
368   const u32 search[4] =
369   {
370     digests_buf[digests_offset].digest_buf[DGST_R0],
371     digests_buf[digests_offset].digest_buf[DGST_R1],
372     digests_buf[digests_offset].digest_buf[DGST_R2],
373     digests_buf[digests_offset].digest_buf[DGST_R3]
374   };
375
376   /**
377    * salt
378    */
379
380   u32 pc256[8];
381
382   pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0];
383   pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1];
384   pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2];
385   pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3];
386   pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4];
387   pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5];
388   pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6];
389   pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7];
390
391   /**
392    * loop
393    */
394
395   u32x w0l = w0[0];
396
397   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
398   {
399     const u32 w0r = bfs_buf[il_pos].i;
400
401     w0[0] = w0l | w0r;
402
403     /**
404      * sha1
405      */
406
407     u32x w0_t = w0[0];
408     u32x w1_t = w0[1];
409     u32x w2_t = w0[2];
410     u32x w3_t = w0[3];
411     u32x w4_t = w1[0];
412     u32x w5_t = w1[1];
413     u32x w6_t = w1[2];
414     u32x w7_t = w1[3];
415     u32x w8_t = w2[0];
416     u32x w9_t = w2[1];
417     u32x wa_t = w2[2];
418     u32x wb_t = w2[3];
419     u32x wc_t = w3[0];
420     u32x wd_t = w3[1];
421     u32x we_t = 0;
422     u32x wf_t = pw_len * 8;
423
424     u32x a = SHA1M_A;
425     u32x b = SHA1M_B;
426     u32x c = SHA1M_C;
427     u32x d = SHA1M_D;
428     u32x e = SHA1M_E;
429     u32x f = 0;
430     u32x g = 0;
431     u32x h = 0;
432
433     #undef K
434     #define K SHA1C00
435
436     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t);
437     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t);
438     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t);
439     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t);
440     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t);
441     SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t);
442     SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t);
443     SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t);
444     SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t);
445     SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t);
446     SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t);
447     SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t);
448     SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t);
449     SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t);
450     SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t);
451     SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t);
452     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t);
453     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t);
454     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t);
455     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t);
456
457     #undef K
458     #define K SHA1C01
459
460     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t);
461     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t);
462     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t);
463     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t);
464     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t);
465     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t);
466     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t);
467     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t);
468     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t);
469     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t);
470     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t);
471     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t);
472     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t);
473     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t);
474     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t);
475     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t);
476     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t);
477     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t);
478     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t);
479     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t);
480
481     #undef K
482     #define K SHA1C02
483
484     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t);
485     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t);
486     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t);
487     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t);
488     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t);
489     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t);
490     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t);
491     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t);
492     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t);
493     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t);
494     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t);
495     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t);
496     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t);
497     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t);
498     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t);
499     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t);
500     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t);
501     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t);
502     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t);
503     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t);
504
505     #undef K
506     #define K SHA1C03
507
508     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t);
509     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t);
510     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t);
511     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t);
512     w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t);
513     w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t);
514     w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t);
515     w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t);
516     w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t);
517     w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t);
518     w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t);
519     w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t);
520     w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t);
521     w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t);
522     wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t);
523     wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t);
524     wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t);
525     wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t);
526     we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t);
527     wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t);
528
529     a += SHA1M_A;
530     b += SHA1M_B;
531     c += SHA1M_C;
532     d += SHA1M_D;
533     e += SHA1M_E;
534
535     /**
536      * sha256
537      */
538
539     w0_t = uint_to_hex_upper8 ((a >> 24) & 255) <<  0
540          | uint_to_hex_upper8 ((a >> 16) & 255) << 16;
541     w1_t = uint_to_hex_upper8 ((a >>  8) & 255) <<  0
542          | uint_to_hex_upper8 ((a >>  0) & 255) << 16;
543     w2_t = uint_to_hex_upper8 ((b >> 24) & 255) <<  0
544          | uint_to_hex_upper8 ((b >> 16) & 255) << 16;
545     w3_t = uint_to_hex_upper8 ((b >>  8) & 255) <<  0
546          | uint_to_hex_upper8 ((b >>  0) & 255) << 16;
547     w4_t = uint_to_hex_upper8 ((c >> 24) & 255) <<  0
548          | uint_to_hex_upper8 ((c >> 16) & 255) << 16;
549     w5_t = uint_to_hex_upper8 ((c >>  8) & 255) <<  0
550          | uint_to_hex_upper8 ((c >>  0) & 255) << 16;
551     w6_t = uint_to_hex_upper8 ((d >> 24) & 255) <<  0
552          | uint_to_hex_upper8 ((d >> 16) & 255) << 16;
553     w7_t = uint_to_hex_upper8 ((d >>  8) & 255) <<  0
554          | uint_to_hex_upper8 ((d >>  0) & 255) << 16;
555     w8_t = uint_to_hex_upper8 ((e >> 24) & 255) <<  0
556          | uint_to_hex_upper8 ((e >> 16) & 255) << 16;
557     w9_t = uint_to_hex_upper8 ((e >>  8) & 255) <<  0
558          | uint_to_hex_upper8 ((e >>  0) & 255) << 16;
559
560     w0_t = swap_workaround (w0_t);
561     w1_t = swap_workaround (w1_t);
562     w2_t = swap_workaround (w2_t);
563     w3_t = swap_workaround (w3_t);
564     w4_t = swap_workaround (w4_t);
565     w5_t = swap_workaround (w5_t);
566     w6_t = swap_workaround (w6_t);
567     w7_t = swap_workaround (w7_t);
568     w8_t = swap_workaround (w8_t);
569     w9_t = swap_workaround (w9_t);
570     wa_t = 0x80000000;
571     wb_t = 0;
572     wc_t = 0;
573     wd_t = 0;
574     we_t = 0;
575     wf_t = (64 + 40) * 8;
576
577     a = pc256[0];
578     b = pc256[1];
579     c = pc256[2];
580     d = pc256[3];
581     e = pc256[4];
582     f = pc256[5];
583     g = pc256[6];
584     h = pc256[7];
585
586     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00);
587     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01);
588     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02);
589     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03);
590     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04);
591     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05);
592     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06);
593     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07);
594     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08);
595     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09);
596     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a);
597     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b);
598     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c);
599     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d);
600     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e);
601     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f);
602
603     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10);
604     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11);
605     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12);
606     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13);
607     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14);
608     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15);
609     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16);
610     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17);
611     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18);
612     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19);
613     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a);
614     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b);
615     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c);
616     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d);
617     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e);
618     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f);
619
620     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20);
621     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21);
622     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22);
623     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23);
624     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24);
625     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25);
626     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26);
627     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27);
628     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28);
629     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29);
630     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a);
631     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b);
632     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c);
633     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d);
634     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e);
635     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f);
636
637     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30);
638     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31);
639     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32);
640     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33);
641     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34);
642     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35);
643     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36);
644     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37);
645     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38);
646     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39);
647     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a);
648     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b);
649     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c);
650     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d);
651     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e);
652     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f);
653
654     const u32x r0 = d;
655     const u32x r1 = h;
656     const u32x r2 = c;
657     const u32x r3 = g;
658
659     #include VECT_COMPARE_S
660   }
661 }
662
663 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_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)
664 {
665   /**
666    * base
667    */
668
669   const u32 gid = get_global_id (0);
670
671   /**
672    * modifier
673    */
674
675   const u32 lid = get_local_id (0);
676
677
678   u32x w0[4];
679
680   w0[0] = pws[gid].i[ 0];
681   w0[1] = pws[gid].i[ 1];
682   w0[2] = pws[gid].i[ 2];
683   w0[3] = pws[gid].i[ 3];
684
685   u32x w1[4];
686
687   w1[0] = 0;
688   w1[1] = 0;
689   w1[2] = 0;
690   w1[3] = 0;
691
692   u32x w2[4];
693
694   w2[0] = 0;
695   w2[1] = 0;
696   w2[2] = 0;
697   w2[3] = 0;
698
699   u32x w3[4];
700
701   w3[0] = 0;
702   w3[1] = 0;
703   w3[2] = 0;
704   w3[3] = pws[gid].i[15];
705
706   const u32 pw_len = pws[gid].pw_len;
707
708   /**
709    * bin2asc table
710    */
711
712   __local u32 l_bin2asc[256];
713
714   const u32 lid4 = lid * 4;
715
716   const u32 lid40 = lid4 + 0;
717   const u32 lid41 = lid4 + 1;
718   const u32 lid42 = lid4 + 2;
719   const u32 lid43 = lid4 + 3;
720
721   const u32 v400 = (lid40 >> 0) & 15;
722   const u32 v401 = (lid40 >> 4) & 15;
723   const u32 v410 = (lid41 >> 0) & 15;
724   const u32 v411 = (lid41 >> 4) & 15;
725   const u32 v420 = (lid42 >> 0) & 15;
726   const u32 v421 = (lid42 >> 4) & 15;
727   const u32 v430 = (lid43 >> 0) & 15;
728   const u32 v431 = (lid43 >> 4) & 15;
729
730   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
731                    | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
732   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
733                    | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
734   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
735                    | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
736   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
737                    | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
738
739   barrier (CLK_LOCAL_MEM_FENCE);
740
741   if (gid >= gid_max) return;
742
743   /**
744    * main
745    */
746
747   m12600m (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);
748 }
749
750 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_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)
751 {
752   /**
753    * base
754    */
755
756   const u32 gid = get_global_id (0);
757
758   /**
759    * modifier
760    */
761
762   const u32 lid = get_local_id (0);
763
764   u32x w0[4];
765
766   w0[0] = pws[gid].i[ 0];
767   w0[1] = pws[gid].i[ 1];
768   w0[2] = pws[gid].i[ 2];
769   w0[3] = pws[gid].i[ 3];
770
771   u32x w1[4];
772
773   w1[0] = pws[gid].i[ 4];
774   w1[1] = pws[gid].i[ 5];
775   w1[2] = pws[gid].i[ 6];
776   w1[3] = pws[gid].i[ 7];
777
778   u32x w2[4];
779
780   w2[0] = 0;
781   w2[1] = 0;
782   w2[2] = 0;
783   w2[3] = 0;
784
785   u32x w3[4];
786
787   w3[0] = 0;
788   w3[1] = 0;
789   w3[2] = 0;
790   w3[3] = pws[gid].i[15];
791
792   const u32 pw_len = pws[gid].pw_len;
793
794   /**
795    * bin2asc table
796    */
797
798   __local u32 l_bin2asc[256];
799
800   const u32 lid4 = lid * 4;
801
802   const u32 lid40 = lid4 + 0;
803   const u32 lid41 = lid4 + 1;
804   const u32 lid42 = lid4 + 2;
805   const u32 lid43 = lid4 + 3;
806
807   const u32 v400 = (lid40 >> 0) & 15;
808   const u32 v401 = (lid40 >> 4) & 15;
809   const u32 v410 = (lid41 >> 0) & 15;
810   const u32 v411 = (lid41 >> 4) & 15;
811   const u32 v420 = (lid42 >> 0) & 15;
812   const u32 v421 = (lid42 >> 4) & 15;
813   const u32 v430 = (lid43 >> 0) & 15;
814   const u32 v431 = (lid43 >> 4) & 15;
815
816   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
817                    | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
818   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
819                    | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
820   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
821                    | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
822   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
823                    | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
824
825   barrier (CLK_LOCAL_MEM_FENCE);
826
827   if (gid >= gid_max) return;
828
829   /**
830    * main
831    */
832
833   m12600m (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);
834 }
835
836 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_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)
837 {
838   /**
839    * base
840    */
841
842   const u32 gid = get_global_id (0);
843
844   /**
845    * modifier
846    */
847
848   const u32 lid = get_local_id (0);
849
850   u32x w0[4];
851
852   w0[0] = pws[gid].i[ 0];
853   w0[1] = pws[gid].i[ 1];
854   w0[2] = pws[gid].i[ 2];
855   w0[3] = pws[gid].i[ 3];
856
857   u32x w1[4];
858
859   w1[0] = pws[gid].i[ 4];
860   w1[1] = pws[gid].i[ 5];
861   w1[2] = pws[gid].i[ 6];
862   w1[3] = pws[gid].i[ 7];
863
864   u32x w2[4];
865
866   w2[0] = pws[gid].i[ 8];
867   w2[1] = pws[gid].i[ 9];
868   w2[2] = pws[gid].i[10];
869   w2[3] = pws[gid].i[11];
870
871   u32x w3[4];
872
873   w3[0] = pws[gid].i[12];
874   w3[1] = pws[gid].i[13];
875   w3[2] = pws[gid].i[14];
876   w3[3] = pws[gid].i[15];
877
878   const u32 pw_len = pws[gid].pw_len;
879
880   /**
881    * bin2asc table
882    */
883
884   __local u32 l_bin2asc[256];
885
886   const u32 lid4 = lid * 4;
887
888   const u32 lid40 = lid4 + 0;
889   const u32 lid41 = lid4 + 1;
890   const u32 lid42 = lid4 + 2;
891   const u32 lid43 = lid4 + 3;
892
893   const u32 v400 = (lid40 >> 0) & 15;
894   const u32 v401 = (lid40 >> 4) & 15;
895   const u32 v410 = (lid41 >> 0) & 15;
896   const u32 v411 = (lid41 >> 4) & 15;
897   const u32 v420 = (lid42 >> 0) & 15;
898   const u32 v421 = (lid42 >> 4) & 15;
899   const u32 v430 = (lid43 >> 0) & 15;
900   const u32 v431 = (lid43 >> 4) & 15;
901
902   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
903                    | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
904   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
905                    | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
906   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
907                    | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
908   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
909                    | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
910
911   barrier (CLK_LOCAL_MEM_FENCE);
912
913   if (gid >= gid_max) return;
914
915   /**
916    * main
917    */
918
919   m12600m (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);
920 }
921
922 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_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)
923 {
924   /**
925    * base
926    */
927
928   const u32 gid = get_global_id (0);
929
930   /**
931    * modifier
932    */
933
934   const u32 lid = get_local_id (0);
935
936   u32x w0[4];
937
938   w0[0] = pws[gid].i[ 0];
939   w0[1] = pws[gid].i[ 1];
940   w0[2] = pws[gid].i[ 2];
941   w0[3] = pws[gid].i[ 3];
942
943   u32x w1[4];
944
945   w1[0] = 0;
946   w1[1] = 0;
947   w1[2] = 0;
948   w1[3] = 0;
949
950   u32x w2[4];
951
952   w2[0] = 0;
953   w2[1] = 0;
954   w2[2] = 0;
955   w2[3] = 0;
956
957   u32x w3[4];
958
959   w3[0] = 0;
960   w3[1] = 0;
961   w3[2] = 0;
962   w3[3] = pws[gid].i[15];
963
964   const u32 pw_len = pws[gid].pw_len;
965
966   /**
967    * bin2asc table
968    */
969
970   __local u32 l_bin2asc[256];
971
972   const u32 lid4 = lid * 4;
973
974   const u32 lid40 = lid4 + 0;
975   const u32 lid41 = lid4 + 1;
976   const u32 lid42 = lid4 + 2;
977   const u32 lid43 = lid4 + 3;
978
979   const u32 v400 = (lid40 >> 0) & 15;
980   const u32 v401 = (lid40 >> 4) & 15;
981   const u32 v410 = (lid41 >> 0) & 15;
982   const u32 v411 = (lid41 >> 4) & 15;
983   const u32 v420 = (lid42 >> 0) & 15;
984   const u32 v421 = (lid42 >> 4) & 15;
985   const u32 v430 = (lid43 >> 0) & 15;
986   const u32 v431 = (lid43 >> 4) & 15;
987
988   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
989                    | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
990   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
991                    | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
992   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
993                    | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
994   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
995                    | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
996
997   barrier (CLK_LOCAL_MEM_FENCE);
998
999   if (gid >= gid_max) return;
1000
1001   /**
1002    * main
1003    */
1004
1005   m12600s (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);
1006 }
1007
1008 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_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)
1009 {
1010   /**
1011    * base
1012    */
1013
1014   const u32 gid = get_global_id (0);
1015
1016   /**
1017    * modifier
1018    */
1019
1020   const u32 lid = get_local_id (0);
1021
1022   u32x w0[4];
1023
1024   w0[0] = pws[gid].i[ 0];
1025   w0[1] = pws[gid].i[ 1];
1026   w0[2] = pws[gid].i[ 2];
1027   w0[3] = pws[gid].i[ 3];
1028
1029   u32x w1[4];
1030
1031   w1[0] = pws[gid].i[ 4];
1032   w1[1] = pws[gid].i[ 5];
1033   w1[2] = pws[gid].i[ 6];
1034   w1[3] = pws[gid].i[ 7];
1035
1036   u32x w2[4];
1037
1038   w2[0] = 0;
1039   w2[1] = 0;
1040   w2[2] = 0;
1041   w2[3] = 0;
1042
1043   u32x w3[4];
1044
1045   w3[0] = 0;
1046   w3[1] = 0;
1047   w3[2] = 0;
1048   w3[3] = pws[gid].i[15];
1049
1050   const u32 pw_len = pws[gid].pw_len;
1051
1052   /**
1053    * bin2asc table
1054    */
1055
1056   __local u32 l_bin2asc[256];
1057
1058   const u32 lid4 = lid * 4;
1059
1060   const u32 lid40 = lid4 + 0;
1061   const u32 lid41 = lid4 + 1;
1062   const u32 lid42 = lid4 + 2;
1063   const u32 lid43 = lid4 + 3;
1064
1065   const u32 v400 = (lid40 >> 0) & 15;
1066   const u32 v401 = (lid40 >> 4) & 15;
1067   const u32 v410 = (lid41 >> 0) & 15;
1068   const u32 v411 = (lid41 >> 4) & 15;
1069   const u32 v420 = (lid42 >> 0) & 15;
1070   const u32 v421 = (lid42 >> 4) & 15;
1071   const u32 v430 = (lid43 >> 0) & 15;
1072   const u32 v431 = (lid43 >> 4) & 15;
1073
1074   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
1075                    | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
1076   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
1077                    | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
1078   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
1079                    | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
1080   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
1081                    | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
1082
1083   barrier (CLK_LOCAL_MEM_FENCE);
1084
1085   if (gid >= gid_max) return;
1086
1087   /**
1088    * main
1089    */
1090
1091   m12600s (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);
1092 }
1093
1094 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_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)
1095 {
1096   /**
1097    * base
1098    */
1099
1100   const u32 gid = get_global_id (0);
1101
1102   /**
1103    * modifier
1104    */
1105
1106   const u32 lid = get_local_id (0);
1107
1108   u32x w0[4];
1109
1110   w0[0] = pws[gid].i[ 0];
1111   w0[1] = pws[gid].i[ 1];
1112   w0[2] = pws[gid].i[ 2];
1113   w0[3] = pws[gid].i[ 3];
1114
1115   u32x w1[4];
1116
1117   w1[0] = pws[gid].i[ 4];
1118   w1[1] = pws[gid].i[ 5];
1119   w1[2] = pws[gid].i[ 6];
1120   w1[3] = pws[gid].i[ 7];
1121
1122   u32x w2[4];
1123
1124   w2[0] = pws[gid].i[ 8];
1125   w2[1] = pws[gid].i[ 9];
1126   w2[2] = pws[gid].i[10];
1127   w2[3] = pws[gid].i[11];
1128
1129   u32x w3[4];
1130
1131   w3[0] = pws[gid].i[12];
1132   w3[1] = pws[gid].i[13];
1133   w3[2] = pws[gid].i[14];
1134   w3[3] = pws[gid].i[15];
1135
1136   const u32 pw_len = pws[gid].pw_len;
1137
1138   /**
1139    * bin2asc table
1140    */
1141
1142   __local u32 l_bin2asc[256];
1143
1144   const u32 lid4 = lid * 4;
1145
1146   const u32 lid40 = lid4 + 0;
1147   const u32 lid41 = lid4 + 1;
1148   const u32 lid42 = lid4 + 2;
1149   const u32 lid43 = lid4 + 3;
1150
1151   const u32 v400 = (lid40 >> 0) & 15;
1152   const u32 v401 = (lid40 >> 4) & 15;
1153   const u32 v410 = (lid41 >> 0) & 15;
1154   const u32 v411 = (lid41 >> 4) & 15;
1155   const u32 v420 = (lid42 >> 0) & 15;
1156   const u32 v421 = (lid42 >> 4) & 15;
1157   const u32 v430 = (lid43 >> 0) & 15;
1158   const u32 v431 = (lid43 >> 4) & 15;
1159
1160   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
1161                    | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
1162   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
1163                    | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
1164   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
1165                    | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
1166   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
1167                    | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
1168
1169   barrier (CLK_LOCAL_MEM_FENCE);
1170
1171   if (gid >= gid_max) return;
1172
1173   /**
1174    * main
1175    */
1176
1177   m12600s (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);
1178 }