Initial commit
[hashcat.git] / amd / m01500_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  * NOTE........: sboxes were taken from JtR, license below
5  */
6
7 #define _DES_
8 #define _SCALAR_
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #ifdef  VLIW1
14 #define VECT_SIZE1
15 #endif
16
17 #ifdef  VLIW4
18 #define VECT_SIZE1
19 #endif
20
21 #ifdef  VLIW5
22 #define VECT_SIZE1
23 #endif
24
25 #define DGST_R0 0
26 #define DGST_R1 1
27 #define DGST_R2 2
28 #define DGST_R3 3
29
30 #include "include/kernel_functions.c"
31 #include "types_amd.c"
32 #include "common_amd.c"
33
34 #ifdef  VECT_SIZE1
35 #define VECT_COMPARE_S "check_single_vect1_comp4_warp_bs.c"
36 #define VECT_COMPARE_M "check_multi_vect1_comp4_warp_bs.c"
37 #endif
38
39 #ifdef  VECT_SIZE2
40 #define VECT_COMPARE_S "check_single_vect2_comp4_warp_bs.c"
41 #define VECT_COMPARE_M "check_multi_vect2_comp4_warp_bs.c"
42 #endif
43
44 #ifdef  VECT_SIZE4
45 #define VECT_COMPARE_S "check_single_vect4_comp4_warp_bs.c"
46 #define VECT_COMPARE_M "check_multi_vect4_comp4_warp_bs.c"
47 #endif
48
49 #define KXX_DECL  volatile
50 #define sXXX_DECL volatile
51
52 //#define myselx(a,b,c) ((c) ? (b) : (a))
53 //#define myselx(a,b,c) ((b & c) | (a & ~c))
54 #define myselx(a,b,c) bitselect ((a), (b), (c))
55
56 /*
57  * Bitslice DES S-boxes making use of a vector conditional select operation
58  * (e.g., vsel on PowerPC with AltiVec).
59  *
60  * Gate counts: 36 33 33 26 35 34 34 32
61  * Average: 32.875
62  *
63  * Several same-gate-count expressions for each S-box are included (for use on
64  * different CPUs/GPUs).
65  *
66  * These Boolean expressions corresponding to DES S-boxes have been generated
67  * by Roman Rusakov <roman_rus at openwall.com> for use in Openwall's
68  * John the Ripper password cracker: http://www.openwall.com/john/
69  * Being mathematical formulas, they are not copyrighted and are free for reuse
70  * by anyone.
71  *
72  * This file (a specific representation of the S-box expressions, surrounding
73  * logic) is Copyright (c) 2011 by Solar Designer <solar at openwall.com>.
74  * Redistribution and use in source and binary forms, with or without
75  * modification, are permitted.  (This is a heavily cut-down "BSD license".)
76  *
77  * The effort has been sponsored by Rapid7: http://www.rapid7.com
78  */
79
80 #define vnot(dst, a)                                            (dst) = ~(a)
81 #define vand(dst, a, b)                                 (dst) = (a) & (b)
82 #define vor(dst, a, b)                                  (dst) = (a) | (b)
83 #define vandn(dst, a, b)                                (dst) = (a) & ~(b)
84 #define vxor(dst, a, b)                                 (dst) = (a) ^ (b)
85 #define vsel(dst, a, b, c)                      (dst) = bitselect((a),(b),(c))
86
87 static void
88 s1(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
89     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
90 {
91         u32 x0F0F3333, x3C3C3C3C, x55FF55FF, x69C369C3, x0903B73F, x09FCB7C0,
92             x5CA9E295;
93         u32 x55AFD1B7, x3C3C69C3, x6993B874;
94         u32 x5CEDE59F, x09FCE295, x5D91A51E, x529E962D;
95         u32 x29EEADC0, x4B8771A3, x428679F3, x6B68D433;
96         u32 x5BA7E193, x026F12F3, x6B27C493, x94D83B6C;
97         u32 x965E0B0F, x3327A113, x847F0A1F, xD6E19C32;
98         u32 x0DBCE883, x3A25A215, x37994A96;
99         u32 x8A487EA7, x8B480F07, xB96C2D16;
100         u32 x0, x1, x2, x3;
101
102         vsel(x0F0F3333, a3, a2, a5);
103         vxor(x3C3C3C3C, a2, a3);
104         vor(x55FF55FF, a1, a4);
105         vxor(x69C369C3, x3C3C3C3C, x55FF55FF);
106         vsel(x0903B73F, a5, x0F0F3333, x69C369C3);
107         vxor(x09FCB7C0, a4, x0903B73F);
108         vxor(x5CA9E295, a1, x09FCB7C0);
109
110         vsel(x55AFD1B7, x5CA9E295, x55FF55FF, x0F0F3333);
111         vsel(x3C3C69C3, x3C3C3C3C, x69C369C3, a5);
112         vxor(x6993B874, x55AFD1B7, x3C3C69C3);
113
114         vsel(x5CEDE59F, x55FF55FF, x5CA9E295, x6993B874);
115         vsel(x09FCE295, x09FCB7C0, x5CA9E295, a5);
116         vsel(x5D91A51E, x5CEDE59F, x6993B874, x09FCE295);
117         vxor(x529E962D, x0F0F3333, x5D91A51E);
118
119         vsel(x29EEADC0, x69C369C3, x09FCB7C0, x5CEDE59F);
120         vsel(x4B8771A3, x0F0F3333, x69C369C3, x5CA9E295);
121         vsel(x428679F3, a5, x4B8771A3, x529E962D);
122         vxor(x6B68D433, x29EEADC0, x428679F3);
123
124         vsel(x5BA7E193, x5CA9E295, x4B8771A3, a3);
125         vsel(x026F12F3, a4, x0F0F3333, x529E962D);
126         vsel(x6B27C493, x6B68D433, x5BA7E193, x026F12F3);
127         vnot(x94D83B6C, x6B27C493);
128         vsel(x0, x94D83B6C, x6B68D433, a6);
129         vxor(*out1, *out1, x0);
130
131         vsel(x965E0B0F, x94D83B6C, a3, x428679F3);
132         vsel(x3327A113, x5BA7E193, a2, x69C369C3);
133         vsel(x847F0A1F, x965E0B0F, a4, x3327A113);
134         vxor(xD6E19C32, x529E962D, x847F0A1F);
135         vsel(x1, xD6E19C32, x5CA9E295, a6);
136         vxor(*out2, *out2, x1);
137
138         vsel(x0DBCE883, x09FCE295, x3C3C69C3, x847F0A1F);
139         vsel(x3A25A215, x3327A113, x5CA9E295, x0903B73F);
140         vxor(x37994A96, x0DBCE883, x3A25A215);
141         vsel(x3, x37994A96, x529E962D, a6);
142         vxor(*out4, *out4, x3);
143
144         vxor(x8A487EA7, x5CA9E295, xD6E19C32);
145         vsel(x8B480F07, a3, x8A487EA7, x847F0A1F);
146         vsel(xB96C2D16, x8B480F07, x3C3C3C3C, x3A25A215);
147         vsel(x2, xB96C2D16, x6993B874, a6);
148         vxor(*out3, *out3, x2);
149 }
150
151 static void
152 s2(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
153     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
154 {
155         u32 x55553333, x0055FF33, x33270F03, x66725A56, x00FFFF00, x668DA556;
156         u32 x0F0F5A56, xF0F0A5A9, xA5A5969A, xA55A699A;
157         u32 x0F5AF03C, x6600FF56, x87A5F09C;
158         u32 xA55A963C, x3C69C30F, xB44BC32D;
159         u32 x66D7CC56, x0F4B0F2D, x699CC37B, x996C66D2;
160         u32 xB46C662D, x278DB412, xB66CB43B;
161         u32 xD2DC4E52, x27993333, xD2994E33;
162         u32 x278D0F2D, x2E0E547B, x09976748;
163         u32 x0, x1, x2, x3;
164
165         vsel(x55553333, a1, a3, a6);
166         vsel(x0055FF33, a6, x55553333, a5);
167         vsel(x33270F03, a3, a4, x0055FF33);
168         vxor(x66725A56, a1, x33270F03);
169         vxor(x00FFFF00, a5, a6);
170         vxor(x668DA556, x66725A56, x00FFFF00);
171
172         vsel(x0F0F5A56, a4, x66725A56, a6);
173         vnot(xF0F0A5A9, x0F0F5A56);
174         vxor(xA5A5969A, x55553333, xF0F0A5A9);
175         vxor(xA55A699A, x00FFFF00, xA5A5969A);
176         vsel(x1, xA55A699A, x668DA556, a2);
177         vxor(*out2, *out2, x1);
178
179         vxor(x0F5AF03C, a4, x0055FF33);
180         vsel(x6600FF56, x66725A56, a6, x00FFFF00);
181         vsel(x87A5F09C, xA5A5969A, x0F5AF03C, x6600FF56);
182
183         vsel(xA55A963C, xA5A5969A, x0F5AF03C, a5);
184         vxor(x3C69C30F, a3, x0F5AF03C);
185         vsel(xB44BC32D, xA55A963C, x3C69C30F, a1);
186
187         vsel(x66D7CC56, x66725A56, x668DA556, xA5A5969A);
188         vsel(x0F4B0F2D, a4, xB44BC32D, a5);
189         vxor(x699CC37B, x66D7CC56, x0F4B0F2D);
190         vxor(x996C66D2, xF0F0A5A9, x699CC37B);
191         vsel(x0, x996C66D2, xB44BC32D, a2);
192         vxor(*out1, *out1, x0);
193
194         vsel(xB46C662D, xB44BC32D, x996C66D2, x00FFFF00);
195         vsel(x278DB412, x668DA556, xA5A5969A, a1);
196         vsel(xB66CB43B, xB46C662D, x278DB412, x6600FF56);
197
198         vsel(xD2DC4E52, x66D7CC56, x996C66D2, xB44BC32D);
199         vsel(x27993333, x278DB412, a3, x0055FF33);
200         vsel(xD2994E33, xD2DC4E52, x27993333, a5);
201         vsel(x3, x87A5F09C, xD2994E33, a2);
202         vxor(*out4, *out4, x3);
203
204         vsel(x278D0F2D, x278DB412, x0F4B0F2D, a6);
205         vsel(x2E0E547B, x0F0F5A56, xB66CB43B, x278D0F2D);
206         vxor(x09976748, x27993333, x2E0E547B);
207         vsel(x2, xB66CB43B, x09976748, a2);
208         vxor(*out3, *out3, x2);
209 }
210
211 static void
212 s3(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
213     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
214 {
215         u32 x0F330F33, x0F33F0CC, x5A66A599;
216         u32 x2111B7BB, x03FF3033, x05BB50EE, x074F201F, x265E97A4;
217         u32 x556BA09E, x665A93AC, x99A56C53;
218         u32 x25A1A797, x5713754C, x66559355, x47B135C6;
219         u32 x9A5A5C60, xD07AF8F8, x87698DB4, xE13C1EE1;
220         u32 x9E48CDE4, x655B905E, x00A55CFF, x9E49915E;
221         u32 xD6599874, x05330022, xD2699876;
222         u32 x665F9364, xD573F0F2, xB32C6396;
223         u32 x0, x1, x2, x3;
224
225         vsel(x0F330F33, a4, a3, a5);
226         vxor(x0F33F0CC, a6, x0F330F33);
227         vxor(x5A66A599, a2, x0F33F0CC);
228
229         vsel(x2111B7BB, a3, a6, x5A66A599);
230         vsel(x03FF3033, a5, a3, x0F33F0CC);
231         vsel(x05BB50EE, a5, x0F33F0CC, a2);
232         vsel(x074F201F, x03FF3033, a4, x05BB50EE);
233         vxor(x265E97A4, x2111B7BB, x074F201F);
234
235         vsel(x556BA09E, x5A66A599, x05BB50EE, a4);
236         vsel(x665A93AC, x556BA09E, x265E97A4, a3);
237         vnot(x99A56C53, x665A93AC);
238         vsel(x1, x265E97A4, x99A56C53, a1);
239         vxor(*out2, *out2, x1);
240
241         vxor(x25A1A797, x03FF3033, x265E97A4);
242         vsel(x5713754C, a2, x0F33F0CC, x074F201F);
243         vsel(x66559355, x665A93AC, a2, a5);
244         vsel(x47B135C6, x25A1A797, x5713754C, x66559355);
245
246         vxor(x9A5A5C60, x03FF3033, x99A56C53);
247         vsel(xD07AF8F8, x9A5A5C60, x556BA09E, x5A66A599);
248         vxor(x87698DB4, x5713754C, xD07AF8F8);
249         vxor(xE13C1EE1, x66559355, x87698DB4);
250
251         vsel(x9E48CDE4, x9A5A5C60, x87698DB4, x265E97A4);
252         vsel(x655B905E, x66559355, x05BB50EE, a4);
253         vsel(x00A55CFF, a5, a6, x9A5A5C60);
254         vsel(x9E49915E, x9E48CDE4, x655B905E, x00A55CFF);
255         vsel(x0, x9E49915E, xE13C1EE1, a1);
256         vxor(*out1, *out1, x0);
257
258         vsel(xD6599874, xD07AF8F8, x66559355, x0F33F0CC);
259         vand(x05330022, x0F330F33, x05BB50EE);
260         vsel(xD2699876, xD6599874, x00A55CFF, x05330022);
261         vsel(x3, x5A66A599, xD2699876, a1);
262         vxor(*out4, *out4, x3);
263
264         vsel(x665F9364, x265E97A4, x66559355, x47B135C6);
265         vsel(xD573F0F2, xD07AF8F8, x05330022, a4);
266         vxor(xB32C6396, x665F9364, xD573F0F2);
267         vsel(x2, xB32C6396, x47B135C6, a1);
268         vxor(*out3, *out3, x2);
269 }
270
271 static void
272 s4(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
273     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
274 {
275         u32 x0505AFAF, x0555AF55, x0A5AA05A, x46566456, x0A0A5F5F, x0AF55FA0,
276             x0AF50F0F, x4CA36B59;
277         u32 xB35C94A6;
278         u32 x01BB23BB, x5050FAFA, xA31C26BE, xA91679E1;
279         u32 x56E9861E;
280         u32 x50E9FA1E, x0AF55F00, x827D9784, xD2946D9A;
281         u32 x31F720B3, x11FB21B3, x4712A7AD, x9586CA37;
282         u32 x0, x1, x2, x3;
283
284         vsel(x0505AFAF, a5, a3, a1);
285         vsel(x0555AF55, x0505AFAF, a1, a4);
286         vxor(x0A5AA05A, a3, x0555AF55);
287         vsel(x46566456, a1, x0A5AA05A, a2);
288         vsel(x0A0A5F5F, a3, a5, a1);
289         vxor(x0AF55FA0, a4, x0A0A5F5F);
290         vsel(x0AF50F0F, x0AF55FA0, a3, a5);
291         vxor(x4CA36B59, x46566456, x0AF50F0F);
292
293         vnot(xB35C94A6, x4CA36B59);
294
295         vsel(x01BB23BB, a4, a2, x0555AF55);
296         vxor(x5050FAFA, a1, x0505AFAF);
297         vsel(xA31C26BE, xB35C94A6, x01BB23BB, x5050FAFA);
298         vxor(xA91679E1, x0A0A5F5F, xA31C26BE);
299
300         vnot(x56E9861E, xA91679E1);
301
302         vsel(x50E9FA1E, x5050FAFA, x56E9861E, a4);
303         vsel(x0AF55F00, x0AF50F0F, x0AF55FA0, x0A0A5F5F);
304         vsel(x827D9784, xB35C94A6, x0AF55F00, a2);
305         vxor(xD2946D9A, x50E9FA1E, x827D9784);
306         vsel(x2, xD2946D9A, x4CA36B59, a6);
307         vxor(*out3, *out3, x2);
308         vsel(x3, xB35C94A6, xD2946D9A, a6);
309         vxor(*out4, *out4, x3);
310
311         vsel(x31F720B3, a2, a4, x0AF55FA0);
312         vsel(x11FB21B3, x01BB23BB, x31F720B3, x5050FAFA);
313         vxor(x4712A7AD, x56E9861E, x11FB21B3);
314         vxor(x9586CA37, xD2946D9A, x4712A7AD);
315         vsel(x0, x56E9861E, x9586CA37, a6);
316         vxor(*out1, *out1, x0);
317         vsel(x1, x9586CA37, xA91679E1, a6);
318         vxor(*out2, *out2, x1);
319 }
320
321 static void
322 s5(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
323     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
324 {
325         u32 x550F550F, xAAF0AAF0, xA5F5A5F5, x96C696C6, x00FFFF00, x963969C6;
326         u32 x2E3C2E3C, xB73121F7, x1501DF0F, x00558A5F, x2E69A463;
327         u32 x0679ED42, x045157FD, xB32077FF, x9D49D39C;
328         u32 xAC81CFB2, xF72577AF, x5BA4B81D;
329         u32 x5BA477AF, x4895469F, x3A35273A, x1A35669A;
330         u32 x12E6283D, x9E47D3D4, x1A676AB4;
331         u32 x891556DF, xE5E77F82, x6CF2295D;
332         u32 x2E3CA5F5, x9697C1C6, x369CC1D6;
333         u32 x0, x1, x2, x3;
334
335         vsel(x550F550F, a1, a3, a5);
336         vnot(xAAF0AAF0, x550F550F);
337         vsel(xA5F5A5F5, xAAF0AAF0, a1, a3);
338         vxor(x96C696C6, a2, xA5F5A5F5);
339         vxor(x00FFFF00, a5, a6);
340         vxor(x963969C6, x96C696C6, x00FFFF00);
341
342         vsel(x2E3C2E3C, a3, xAAF0AAF0, a2);
343         vsel(xB73121F7, a2, x963969C6, x96C696C6);
344         vsel(x1501DF0F, a6, x550F550F, xB73121F7);
345         vsel(x00558A5F, x1501DF0F, a5, a1);
346         vxor(x2E69A463, x2E3C2E3C, x00558A5F);
347
348         vsel(x0679ED42, x00FFFF00, x2E69A463, x96C696C6);
349         vsel(x045157FD, a6, a1, x0679ED42);
350         vsel(xB32077FF, xB73121F7, a6, x045157FD);
351         vxor(x9D49D39C, x2E69A463, xB32077FF);
352         vsel(x2, x9D49D39C, x2E69A463, a4);
353         vxor(*out3, *out3, x2);
354
355         vsel(xAC81CFB2, xAAF0AAF0, x1501DF0F, x0679ED42);
356         vsel(xF72577AF, xB32077FF, x550F550F, a1);
357         vxor(x5BA4B81D, xAC81CFB2, xF72577AF);
358         vsel(x1, x5BA4B81D, x963969C6, a4);
359         vxor(*out2, *out2, x1);
360
361         vsel(x5BA477AF, x5BA4B81D, xF72577AF, a6);
362         vsel(x4895469F, x5BA477AF, x00558A5F, a2);
363         vsel(x3A35273A, x2E3C2E3C, a2, x963969C6);
364         vsel(x1A35669A, x4895469F, x3A35273A, x5BA4B81D);
365
366         vsel(x12E6283D, a5, x5BA4B81D, x963969C6);
367         vsel(x9E47D3D4, x96C696C6, x9D49D39C, xAC81CFB2);
368         vsel(x1A676AB4, x12E6283D, x9E47D3D4, x4895469F);
369
370         vsel(x891556DF, xB32077FF, x4895469F, x3A35273A);
371         vsel(xE5E77F82, xF72577AF, x00FFFF00, x12E6283D);
372         vxor(x6CF2295D, x891556DF, xE5E77F82);
373         vsel(x3, x1A35669A, x6CF2295D, a4);
374         vxor(*out4, *out4, x3);
375
376         vsel(x2E3CA5F5, x2E3C2E3C, xA5F5A5F5, a6);
377         vsel(x9697C1C6, x96C696C6, x963969C6, x045157FD);
378         vsel(x369CC1D6, x2E3CA5F5, x9697C1C6, x5BA477AF);
379         vsel(x0, x369CC1D6, x1A676AB4, a4);
380         vxor(*out1, *out1, x0);
381 }
382
383 static void
384 s6(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
385     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
386 {
387         u32 x555500FF, x666633CC, x606F30CF, x353A659A, x353A9A65, xCAC5659A;
388         u32 x353A6565, x0A3F0A6F, x6C5939A3, x5963A3C6;
389         u32 x35FF659A, x3AF06A95, x05CF0A9F, x16E94A97;
390         u32 x86CD4C9B, x12E0FFFD, x942D9A67;
391         u32 x142956AB, x455D45DF, x1C3EE619;
392         u32 x2AEA70D5, x20CF7A9F, x3CF19C86, x69A49C79;
393         u32 x840DBB67, x6DA19C1E, x925E63E1;
394         u32 x9C3CA761, x257A75D5, xB946D2B4;
395         u32 x0, x1, x2, x3;
396
397         vsel(x555500FF, a1, a4, a5);
398         vxor(x666633CC, a2, x555500FF);
399         vsel(x606F30CF, x666633CC, a4, a3);
400         vxor(x353A659A, a1, x606F30CF);
401         vxor(x353A9A65, a5, x353A659A);
402         vnot(xCAC5659A, x353A9A65);
403
404         vsel(x353A6565, x353A659A, x353A9A65, a4);
405         vsel(x0A3F0A6F, a3, a4, x353A6565);
406         vxor(x6C5939A3, x666633CC, x0A3F0A6F);
407         vxor(x5963A3C6, x353A9A65, x6C5939A3);
408
409         vsel(x35FF659A, a4, x353A659A, x353A6565);
410         vxor(x3AF06A95, a3, x35FF659A);
411         vsel(x05CF0A9F, a4, a3, x353A9A65);
412         vsel(x16E94A97, x3AF06A95, x05CF0A9F, x6C5939A3);
413
414         vsel(x86CD4C9B, xCAC5659A, x05CF0A9F, x6C5939A3);
415         vsel(x12E0FFFD, a5, x3AF06A95, x16E94A97);
416         vsel(x942D9A67, x86CD4C9B, x353A9A65, x12E0FFFD);
417         vsel(x0, xCAC5659A, x942D9A67, a6);
418         vxor(*out1, *out1, x0);
419
420         vsel(x142956AB, x353A659A, x942D9A67, a2);
421         vsel(x455D45DF, a1, x86CD4C9B, x142956AB);
422         vxor(x1C3EE619, x5963A3C6, x455D45DF);
423         vsel(x3, x5963A3C6, x1C3EE619, a6);
424         vxor(*out4, *out4, x3);
425
426         vsel(x2AEA70D5, x3AF06A95, x606F30CF, x353A9A65);
427         vsel(x20CF7A9F, x2AEA70D5, x05CF0A9F, x0A3F0A6F);
428         vxor(x3CF19C86, x1C3EE619, x20CF7A9F);
429         vxor(x69A49C79, x555500FF, x3CF19C86);
430
431         vsel(x840DBB67, a5, x942D9A67, x86CD4C9B);
432         vsel(x6DA19C1E, x69A49C79, x3CF19C86, x840DBB67);
433         vnot(x925E63E1, x6DA19C1E);
434         vsel(x1, x925E63E1, x69A49C79, a6);
435         vxor(*out2, *out2, x1);
436
437         vsel(x9C3CA761, x840DBB67, x1C3EE619, x3CF19C86);
438         vsel(x257A75D5, x455D45DF, x2AEA70D5, x606F30CF);
439         vxor(xB946D2B4, x9C3CA761, x257A75D5);
440         vsel(x2, x16E94A97, xB946D2B4, a6);
441         vxor(*out3, *out3, x2);
442 }
443
444 static void
445 s7(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
446     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
447 {
448         u32 x44447777, x4B4B7878, x22772277, x0505F5F5, x220522F5, x694E5A8D;
449         u32 x00FFFF00, x66666666, x32353235, x26253636, x26DAC936;
450         u32 x738F9C63, x11EF9867, x26DA9867;
451         u32 x4B4B9C63, x4B666663, x4E639396;
452         u32 x4E4B393C, xFF00FF00, xFF05DD21, xB14EE41D;
453         u32 xD728827B, x6698807B, x699C585B;
454         u32 x738C847B, xA4A71E18, x74878E78;
455         u32 x333D9639, x74879639, x8B7869C6;
456         u32 x0, x1, x2, x3;
457
458         vsel(x44447777, a2, a6, a3);
459         vxor(x4B4B7878, a4, x44447777);
460         vsel(x22772277, a3, a5, a2);
461         vsel(x0505F5F5, a6, a2, a4);
462         vsel(x220522F5, x22772277, x0505F5F5, a5);
463         vxor(x694E5A8D, x4B4B7878, x220522F5);
464
465         vxor(x00FFFF00, a5, a6);
466         vxor(x66666666, a2, a3);
467         vsel(x32353235, a3, x220522F5, a4);
468         vsel(x26253636, x66666666, x32353235, x4B4B7878);
469         vxor(x26DAC936, x00FFFF00, x26253636);
470         vsel(x0, x26DAC936, x694E5A8D, a1);
471         vxor(*out1, *out1, x0);
472
473         vxor(x738F9C63, a2, x26DAC936);
474         vsel(x11EF9867, x738F9C63, a5, x66666666);
475         vsel(x26DA9867, x26DAC936, x11EF9867, a6);
476
477         vsel(x4B4B9C63, x4B4B7878, x738F9C63, a6);
478         vsel(x4B666663, x4B4B9C63, x66666666, x00FFFF00);
479         vxor(x4E639396, x0505F5F5, x4B666663);
480
481         vsel(x4E4B393C, x4B4B7878, x4E639396, a2);
482         vnot(xFF00FF00, a5);
483         vsel(xFF05DD21, xFF00FF00, x738F9C63, x32353235);
484         vxor(xB14EE41D, x4E4B393C, xFF05DD21);
485         vsel(x1, xB14EE41D, x26DA9867, a1);
486         vxor(*out2, *out2, x1);
487
488         vxor(xD728827B, x66666666, xB14EE41D);
489         vsel(x6698807B, x26DA9867, xD728827B, x4E4B393C);
490         vsel(x699C585B, x6698807B, x694E5A8D, xFF05DD21);
491         vsel(x2, x699C585B, x4E639396, a1);
492         vxor(*out3, *out3, x2);
493
494         vsel(x738C847B, x738F9C63, xD728827B, x4B4B7878);
495         vxor(xA4A71E18, x738F9C63, xD728827B);
496         vsel(x74878E78, x738C847B, xA4A71E18, a4);
497
498         vsel(x333D9639, x32353235, x738C847B, xB14EE41D);
499         vsel(x74879639, x74878E78, x333D9639, a6);
500         vnot(x8B7869C6, x74879639);
501         vsel(x3, x74878E78, x8B7869C6, a1);
502         vxor(*out4, *out4, x3);
503 }
504
505 static void
506 s8(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6,
507     u32 * out1, u32 * out2, u32 * out3, u32 * out4)
508 {
509         u32 x0505F5F5, x05FAF50A, x0F0F00FF, x22227777, x07DA807F, x34E9B34C;
510         u32 x00FFF00F, x0033FCCF, x5565B15C, x0C0C3F3F, x59698E63;
511         u32 x3001F74E, x30555745, x693CD926;
512         u32 x0C0CD926, x0C3F25E9, x38D696A5;
513         u32 xC729695A;
514         u32 x03D2117B, xC778395B, xCB471CB2;
515         u32 x5425B13F, x56B3803F, x919AE965;
516         u32 x17B3023F, x75555755, x62E6556A, xA59E6C31;
517         u32 x0, x1, x2, x3;
518
519         vsel(x0505F5F5, a5, a1, a3);
520         vxor(x05FAF50A, a4, x0505F5F5);
521         vsel(x0F0F00FF, a3, a4, a5);
522         vsel(x22227777, a2, a5, a1);
523         vsel(x07DA807F, x05FAF50A, x0F0F00FF, x22227777);
524         vxor(x34E9B34C, a2, x07DA807F);
525
526         vsel(x00FFF00F, x05FAF50A, a4, a3);
527         vsel(x0033FCCF, a5, x00FFF00F, a2);
528         vsel(x5565B15C, a1, x34E9B34C, x0033FCCF);
529         vsel(x0C0C3F3F, a3, a5, a2);
530         vxor(x59698E63, x5565B15C, x0C0C3F3F);
531
532         vsel(x3001F74E, x34E9B34C, a5, x05FAF50A);
533         vsel(x30555745, x3001F74E, a1, x00FFF00F);
534         vxor(x693CD926, x59698E63, x30555745);
535         vsel(x2, x693CD926, x59698E63, a6);
536         vxor(*out3, *out3, x2);
537
538         vsel(x0C0CD926, x0C0C3F3F, x693CD926, a5);
539         vxor(x0C3F25E9, x0033FCCF, x0C0CD926);
540         vxor(x38D696A5, x34E9B34C, x0C3F25E9);
541
542         vnot(xC729695A, x38D696A5);
543
544         vsel(x03D2117B, x07DA807F, a2, x0C0CD926);
545         vsel(xC778395B, xC729695A, x03D2117B, x30555745);
546         vxor(xCB471CB2, x0C3F25E9, xC778395B);
547         vsel(x1, xCB471CB2, x34E9B34C, a6);
548         vxor(*out2, *out2, x1);
549
550         vsel(x5425B13F, x5565B15C, x0C0C3F3F, x03D2117B);
551         vsel(x56B3803F, x07DA807F, x5425B13F, x59698E63);
552         vxor(x919AE965, xC729695A, x56B3803F);
553         vsel(x3, xC729695A, x919AE965, a6);
554         vxor(*out4, *out4, x3);
555
556         vsel(x17B3023F, x07DA807F, a2, x59698E63);
557         vor(x75555755, a1, x30555745);
558         vxor(x62E6556A, x17B3023F, x75555755);
559         vxor(xA59E6C31, xC778395B, x62E6556A);
560         vsel(x0, xA59E6C31, x38D696A5, a6);
561         vxor(*out1, *out1, x0);
562 }
563
564 #define SWAP(a, b) { u32 tmp=a;a=b;b=tmp; }
565
566 #define DATASWAP  \
567   SWAP(D00, D32); \
568   SWAP(D01, D33); \
569   SWAP(D02, D34); \
570   SWAP(D03, D35); \
571   SWAP(D04, D36); \
572   SWAP(D05, D37); \
573   SWAP(D06, D38); \
574   SWAP(D07, D39); \
575   SWAP(D08, D40); \
576   SWAP(D09, D41); \
577   SWAP(D10, D42); \
578   SWAP(D11, D43); \
579   SWAP(D12, D44); \
580   SWAP(D13, D45); \
581   SWAP(D14, D46); \
582   SWAP(D15, D47); \
583   SWAP(D16, D48); \
584   SWAP(D17, D49); \
585   SWAP(D18, D50); \
586   SWAP(D19, D51); \
587   SWAP(D20, D52); \
588   SWAP(D21, D53); \
589   SWAP(D22, D54); \
590   SWAP(D23, D55); \
591   SWAP(D24, D56); \
592   SWAP(D25, D57); \
593   SWAP(D26, D58); \
594   SWAP(D27, D59); \
595   SWAP(D28, D60); \
596   SWAP(D29, D61); \
597   SWAP(D30, D62); \
598   SWAP(D31, D63);
599
600 #define KEYSET00 { k00 = K08; k01 = K44; k02 = K29; k03 = K52; k04 = K42; k05 = K14; k06 = K28; k07 = K49; k08 = K01; k09 = K07; k10 = K16; k11 = K36; k12 = K02; k13 = K30; k14 = K22; k15 = K21; k16 = K38; k17 = K50; k18 = K51; k19 = K00; k20 = K31; k21 = K23; k22 = K15; k23 = K35; k24 = K19; k25 = K24; k26 = K34; k27 = K47; k28 = K32; k29 = K03; k30 = K41; k31 = K26; k32 = K04; k33 = K46; k34 = K20; k35 = K25; k36 = K53; k37 = K18; k38 = K33; k39 = K55; k40 = K13; k41 = K17; k42 = K39; k43 = K12; k44 = K11; k45 = K54; k46 = K48; k47 = K27; }
601 #define KEYSET10 { k00 = K49; k01 = K28; k02 = K45; k03 = K36; k04 = K01; k05 = K30; k06 = K44; k07 = K08; k08 = K42; k09 = K23; k10 = K00; k11 = K52; k12 = K43; k13 = K14; k14 = K38; k15 = K37; k16 = K22; k17 = K09; k18 = K35; k19 = K16; k20 = K15; k21 = K07; k22 = K31; k23 = K51; k24 = K03; k25 = K40; k26 = K46; k27 = K04; k28 = K20; k29 = K19; k30 = K53; k31 = K10; k32 = K47; k33 = K34; k34 = K32; k35 = K13; k36 = K41; k37 = K06; k38 = K17; k39 = K12; k40 = K25; k41 = K33; k42 = K27; k43 = K55; k44 = K54; k45 = K11; k46 = K05; k47 = K39; }
602 #define KEYSET01 { k00 = K01; k01 = K37; k02 = K22; k03 = K45; k04 = K35; k05 = K07; k06 = K21; k07 = K42; k08 = K51; k09 = K00; k10 = K09; k11 = K29; k12 = K52; k13 = K23; k14 = K15; k15 = K14; k16 = K31; k17 = K43; k18 = K44; k19 = K50; k20 = K49; k21 = K16; k22 = K08; k23 = K28; k24 = K12; k25 = K17; k26 = K27; k27 = K40; k28 = K25; k29 = K55; k30 = K34; k31 = K19; k32 = K24; k33 = K39; k34 = K13; k35 = K18; k36 = K46; k37 = K11; k38 = K26; k39 = K48; k40 = K06; k41 = K10; k42 = K32; k43 = K05; k44 = K04; k45 = K47; k46 = K41; k47 = K20; }
603 #define KEYSET11 { k00 = K35; k01 = K14; k02 = K31; k03 = K22; k04 = K44; k05 = K16; k06 = K30; k07 = K51; k08 = K28; k09 = K09; k10 = K43; k11 = K38; k12 = K29; k13 = K00; k14 = K49; k15 = K23; k16 = K08; k17 = K52; k18 = K21; k19 = K02; k20 = K01; k21 = K50; k22 = K42; k23 = K37; k24 = K48; k25 = K26; k26 = K32; k27 = K17; k28 = K06; k29 = K05; k30 = K39; k31 = K55; k32 = K33; k33 = K20; k34 = K18; k35 = K54; k36 = K27; k37 = K47; k38 = K03; k39 = K53; k40 = K11; k41 = K19; k42 = K13; k43 = K41; k44 = K40; k45 = K24; k46 = K46; k47 = K25; }
604 #define KEYSET02 { k00 = K44; k01 = K23; k02 = K08; k03 = K31; k04 = K21; k05 = K50; k06 = K07; k07 = K28; k08 = K37; k09 = K43; k10 = K52; k11 = K15; k12 = K38; k13 = K09; k14 = K01; k15 = K00; k16 = K42; k17 = K29; k18 = K30; k19 = K36; k20 = K35; k21 = K02; k22 = K51; k23 = K14; k24 = K53; k25 = K03; k26 = K13; k27 = K26; k28 = K11; k29 = K41; k30 = K20; k31 = K05; k32 = K10; k33 = K25; k34 = K54; k35 = K04; k36 = K32; k37 = K24; k38 = K12; k39 = K34; k40 = K47; k41 = K55; k42 = K18; k43 = K46; k44 = K17; k45 = K33; k46 = K27; k47 = K06; }
605 #define KEYSET12 { k00 = K21; k01 = K00; k02 = K42; k03 = K08; k04 = K30; k05 = K02; k06 = K16; k07 = K37; k08 = K14; k09 = K52; k10 = K29; k11 = K49; k12 = K15; k13 = K43; k14 = K35; k15 = K09; k16 = K51; k17 = K38; k18 = K07; k19 = K45; k20 = K44; k21 = K36; k22 = K28; k23 = K23; k24 = K34; k25 = K12; k26 = K18; k27 = K03; k28 = K47; k29 = K46; k30 = K25; k31 = K41; k32 = K19; k33 = K06; k34 = K04; k35 = K40; k36 = K13; k37 = K33; k38 = K48; k39 = K39; k40 = K24; k41 = K05; k42 = K54; k43 = K27; k44 = K26; k45 = K10; k46 = K32; k47 = K11; }
606 #define KEYSET03 { k00 = K30; k01 = K09; k02 = K51; k03 = K42; k04 = K07; k05 = K36; k06 = K50; k07 = K14; k08 = K23; k09 = K29; k10 = K38; k11 = K01; k12 = K49; k13 = K52; k14 = K44; k15 = K43; k16 = K28; k17 = K15; k18 = K16; k19 = K22; k20 = K21; k21 = K45; k22 = K37; k23 = K00; k24 = K39; k25 = K48; k26 = K54; k27 = K12; k28 = K24; k29 = K27; k30 = K06; k31 = K46; k32 = K55; k33 = K11; k34 = K40; k35 = K17; k36 = K18; k37 = K10; k38 = K53; k39 = K20; k40 = K33; k41 = K41; k42 = K04; k43 = K32; k44 = K03; k45 = K19; k46 = K13; k47 = K47; }
607 #define KEYSET13 { k00 = K07; k01 = K43; k02 = K28; k03 = K51; k04 = K16; k05 = K45; k06 = K02; k07 = K23; k08 = K00; k09 = K38; k10 = K15; k11 = K35; k12 = K01; k13 = K29; k14 = K21; k15 = K52; k16 = K37; k17 = K49; k18 = K50; k19 = K31; k20 = K30; k21 = K22; k22 = K14; k23 = K09; k24 = K20; k25 = K53; k26 = K04; k27 = K48; k28 = K33; k29 = K32; k30 = K11; k31 = K27; k32 = K05; k33 = K47; k34 = K17; k35 = K26; k36 = K54; k37 = K19; k38 = K34; k39 = K25; k40 = K10; k41 = K46; k42 = K40; k43 = K13; k44 = K12; k45 = K55; k46 = K18; k47 = K24; }
608 #define KEYSET04 { k00 = K16; k01 = K52; k02 = K37; k03 = K28; k04 = K50; k05 = K22; k06 = K36; k07 = K00; k08 = K09; k09 = K15; k10 = K49; k11 = K44; k12 = K35; k13 = K38; k14 = K30; k15 = K29; k16 = K14; k17 = K01; k18 = K02; k19 = K08; k20 = K07; k21 = K31; k22 = K23; k23 = K43; k24 = K25; k25 = K34; k26 = K40; k27 = K53; k28 = K10; k29 = K13; k30 = K47; k31 = K32; k32 = K41; k33 = K24; k34 = K26; k35 = K03; k36 = K04; k37 = K55; k38 = K39; k39 = K06; k40 = K19; k41 = K27; k42 = K17; k43 = K18; k44 = K48; k45 = K05; k46 = K54; k47 = K33; }
609 #define KEYSET14 { k00 = K50; k01 = K29; k02 = K14; k03 = K37; k04 = K02; k05 = K31; k06 = K45; k07 = K09; k08 = K43; k09 = K49; k10 = K01; k11 = K21; k12 = K44; k13 = K15; k14 = K07; k15 = K38; k16 = K23; k17 = K35; k18 = K36; k19 = K42; k20 = K16; k21 = K08; k22 = K00; k23 = K52; k24 = K06; k25 = K39; k26 = K17; k27 = K34; k28 = K19; k29 = K18; k30 = K24; k31 = K13; k32 = K46; k33 = K33; k34 = K03; k35 = K12; k36 = K40; k37 = K05; k38 = K20; k39 = K11; k40 = K55; k41 = K32; k42 = K26; k43 = K54; k44 = K53; k45 = K41; k46 = K04; k47 = K10; }
610 #define KEYSET05 { k00 = K02; k01 = K38; k02 = K23; k03 = K14; k04 = K36; k05 = K08; k06 = K22; k07 = K43; k08 = K52; k09 = K01; k10 = K35; k11 = K30; k12 = K21; k13 = K49; k14 = K16; k15 = K15; k16 = K00; k17 = K44; k18 = K45; k19 = K51; k20 = K50; k21 = K42; k22 = K09; k23 = K29; k24 = K11; k25 = K20; k26 = K26; k27 = K39; k28 = K55; k29 = K54; k30 = K33; k31 = K18; k32 = K27; k33 = K10; k34 = K12; k35 = K48; k36 = K17; k37 = K41; k38 = K25; k39 = K47; k40 = K05; k41 = K13; k42 = K03; k43 = K04; k44 = K34; k45 = K46; k46 = K40; k47 = K19; }
611 #define KEYSET15 { k00 = K36; k01 = K15; k02 = K00; k03 = K23; k04 = K45; k05 = K42; k06 = K31; k07 = K52; k08 = K29; k09 = K35; k10 = K44; k11 = K07; k12 = K30; k13 = K01; k14 = K50; k15 = K49; k16 = K09; k17 = K21; k18 = K22; k19 = K28; k20 = K02; k21 = K51; k22 = K43; k23 = K38; k24 = K47; k25 = K25; k26 = K03; k27 = K20; k28 = K05; k29 = K04; k30 = K10; k31 = K54; k32 = K32; k33 = K19; k34 = K48; k35 = K53; k36 = K26; k37 = K46; k38 = K06; k39 = K24; k40 = K41; k41 = K18; k42 = K12; k43 = K40; k44 = K39; k45 = K27; k46 = K17; k47 = K55; }
612 #define KEYSET06 { k00 = K45; k01 = K49; k02 = K09; k03 = K00; k04 = K22; k05 = K51; k06 = K08; k07 = K29; k08 = K38; k09 = K44; k10 = K21; k11 = K16; k12 = K07; k13 = K35; k14 = K02; k15 = K01; k16 = K43; k17 = K30; k18 = K31; k19 = K37; k20 = K36; k21 = K28; k22 = K52; k23 = K15; k24 = K24; k25 = K06; k26 = K12; k27 = K25; k28 = K41; k29 = K40; k30 = K19; k31 = K04; k32 = K13; k33 = K55; k34 = K53; k35 = K34; k36 = K03; k37 = K27; k38 = K11; k39 = K33; k40 = K46; k41 = K54; k42 = K48; k43 = K17; k44 = K20; k45 = K32; k46 = K26; k47 = K05; }
613 #define KEYSET16 { k00 = K22; k01 = K01; k02 = K43; k03 = K09; k04 = K31; k05 = K28; k06 = K42; k07 = K38; k08 = K15; k09 = K21; k10 = K30; k11 = K50; k12 = K16; k13 = K44; k14 = K36; k15 = K35; k16 = K52; k17 = K07; k18 = K08; k19 = K14; k20 = K45; k21 = K37; k22 = K29; k23 = K49; k24 = K33; k25 = K11; k26 = K48; k27 = K06; k28 = K46; k29 = K17; k30 = K55; k31 = K40; k32 = K18; k33 = K05; k34 = K34; k35 = K39; k36 = K12; k37 = K32; k38 = K47; k39 = K10; k40 = K27; k41 = K04; k42 = K53; k43 = K26; k44 = K25; k45 = K13; k46 = K03; k47 = K41; }
614 #define KEYSET07 { k00 = K31; k01 = K35; k02 = K52; k03 = K43; k04 = K08; k05 = K37; k06 = K51; k07 = K15; k08 = K49; k09 = K30; k10 = K07; k11 = K02; k12 = K50; k13 = K21; k14 = K45; k15 = K44; k16 = K29; k17 = K16; k18 = K42; k19 = K23; k20 = K22; k21 = K14; k22 = K38; k23 = K01; k24 = K10; k25 = K47; k26 = K53; k27 = K11; k28 = K27; k29 = K26; k30 = K05; k31 = K17; k32 = K54; k33 = K41; k34 = K39; k35 = K20; k36 = K48; k37 = K13; k38 = K24; k39 = K19; k40 = K32; k41 = K40; k42 = K34; k43 = K03; k44 = K06; k45 = K18; k46 = K12; k47 = K46; }
615 #define KEYSET17 { k00 = K15; k01 = K51; k02 = K36; k03 = K02; k04 = K49; k05 = K21; k06 = K35; k07 = K31; k08 = K08; k09 = K14; k10 = K23; k11 = K43; k12 = K09; k13 = K37; k14 = K29; k15 = K28; k16 = K45; k17 = K00; k18 = K01; k19 = K07; k20 = K38; k21 = K30; k22 = K22; k23 = K42; k24 = K26; k25 = K04; k26 = K41; k27 = K54; k28 = K39; k29 = K10; k30 = K48; k31 = K33; k32 = K11; k33 = K53; k34 = K27; k35 = K32; k36 = K05; k37 = K25; k38 = K40; k39 = K03; k40 = K20; k41 = K24; k42 = K46; k43 = K19; k44 = K18; k45 = K06; k46 = K55; k47 = K34; }
616
617 static void DESCrypt (const u32 SALT, const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 &D00, u32 &D01, u32 &D02, u32 &D03, u32 &D04, u32 &D05, u32 &D06, u32 &D07, u32 &D08, u32 &D09, u32 &D10, u32 &D11, u32 &D12, u32 &D13, u32 &D14, u32 &D15, u32 &D16, u32 &D17, u32 &D18, u32 &D19, u32 &D20, u32 &D21, u32 &D22, u32 &D23, u32 &D24, u32 &D25, u32 &D26, u32 &D27, u32 &D28, u32 &D29, u32 &D30, u32 &D31, u32 &D32, u32 &D33, u32 &D34, u32 &D35, u32 &D36, u32 &D37, u32 &D38, u32 &D39, u32 &D40, u32 &D41, u32 &D42, u32 &D43, u32 &D44, u32 &D45, u32 &D46, u32 &D47, u32 &D48, u32 &D49, u32 &D50, u32 &D51, u32 &D52, u32 &D53, u32 &D54, u32 &D55, u32 &D56, u32 &D57, u32 &D58, u32 &D59, u32 &D60, u32 &D61, u32 &D62, u32 &D63)
618 {
619   sXXX_DECL u32 s001 = (0x001 & SALT) ? 0xffffffff : 0;
620   sXXX_DECL u32 s002 = (0x002 & SALT) ? 0xffffffff : 0;
621   sXXX_DECL u32 s004 = (0x004 & SALT) ? 0xffffffff : 0;
622   sXXX_DECL u32 s008 = (0x008 & SALT) ? 0xffffffff : 0;
623   sXXX_DECL u32 s010 = (0x010 & SALT) ? 0xffffffff : 0;
624   sXXX_DECL u32 s020 = (0x020 & SALT) ? 0xffffffff : 0;
625   sXXX_DECL u32 s040 = (0x040 & SALT) ? 0xffffffff : 0;
626   sXXX_DECL u32 s080 = (0x080 & SALT) ? 0xffffffff : 0;
627   sXXX_DECL u32 s100 = (0x100 & SALT) ? 0xffffffff : 0;
628   sXXX_DECL u32 s200 = (0x200 & SALT) ? 0xffffffff : 0;
629   sXXX_DECL u32 s400 = (0x400 & SALT) ? 0xffffffff : 0;
630   sXXX_DECL u32 s800 = (0x800 & SALT) ? 0xffffffff : 0;
631
632   KXX_DECL u32 k00, k01, k02, k03, k04, k05;
633   KXX_DECL u32 k06, k07, k08, k09, k10, k11;
634   KXX_DECL u32 k12, k13, k14, k15, k16, k17;
635   KXX_DECL u32 k18, k19, k20, k21, k22, k23;
636   KXX_DECL u32 k24, k25, k26, k27, k28, k29;
637   KXX_DECL u32 k30, k31, k32, k33, k34, k35;
638   KXX_DECL u32 k36, k37, k38, k39, k40, k41;
639   KXX_DECL u32 k42, k43, k44, k45, k46, k47;
640
641   /*
642    * descrypt uses all zero data input, so we can optimize this first round of des
643    */
644
645   KEYSET00;
646
647   s1(k00, k01, k02, k03, k04, k05, &D08, &D16, &D22, &D30);
648   s2(k06, k07, k08, k09, k10, k11, &D12, &D27, &D01, &D17);
649   s3(k12, k13, k14, k15, k16, k17, &D23, &D15, &D29, &D05);
650   s4(k18, k19, k20, k21, k22, k23, &D25, &D19, &D09, &D00);
651   s5(k24, k25, k26, k27, k28, k29, &D07, &D13, &D24, &D02);
652   s6(k30, k31, k32, k33, k34, k35, &D03, &D28, &D10, &D18);
653   s7(k36, k37, k38, k39, k40, k41, &D31, &D11, &D21, &D06);
654   s8(k42, k43, k44, k45, k46, k47, &D04, &D26, &D14, &D20);
655
656   DATASWAP;
657
658   for (u32 i = 1; i < 16; i++)
659   {
660     switch (i)
661     {
662       case  0: KEYSET00; break;
663       case  1: KEYSET01; break;
664       case  2: KEYSET02; break;
665       case  3: KEYSET03; break;
666       case  4: KEYSET04; break;
667       case  5: KEYSET05; break;
668       case  6: KEYSET06; break;
669       case  7: KEYSET07; break;
670       case  8: KEYSET10; break;
671       case  9: KEYSET11; break;
672       case 10: KEYSET12; break;
673       case 11: KEYSET13; break;
674       case 12: KEYSET14; break;
675       case 13: KEYSET15; break;
676       case 14: KEYSET16; break;
677       case 15: KEYSET17; break;
678     }
679
680     s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30);
681     s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17);
682     s3(             D39        ^ k12,              D40        ^ k13,              D41        ^ k14,              D42        ^ k15,              D43        ^ k16,              D44        ^ k17, &D23, &D15, &D29, &D05);
683     s4(             D43        ^ k18,              D44        ^ k19,              D45        ^ k20,              D46        ^ k21,              D47        ^ k22,              D48        ^ k23, &D25, &D19, &D09, &D00);
684     s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02);
685     s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18);
686     s7(             D55        ^ k36,              D56        ^ k37,              D57        ^ k38,              D58        ^ k39,              D59        ^ k40,              D60        ^ k41, &D31, &D11, &D21, &D06);
687     s8(             D59        ^ k42,              D60        ^ k43,              D61        ^ k44,              D62        ^ k45,              D63        ^ k46,              D32        ^ k47, &D04, &D26, &D14, &D20);
688
689     DATASWAP;
690   }
691
692   DATASWAP;
693
694   for (u32 ii = 1; ii < 25; ii++)
695   {
696     for (u32 i = 0; i < 16; i++)
697     {
698       switch (i)
699       {
700         case  0: KEYSET00; break;
701         case  1: KEYSET01; break;
702         case  2: KEYSET02; break;
703         case  3: KEYSET03; break;
704         case  4: KEYSET04; break;
705         case  5: KEYSET05; break;
706         case  6: KEYSET06; break;
707         case  7: KEYSET07; break;
708         case  8: KEYSET10; break;
709         case  9: KEYSET11; break;
710         case 10: KEYSET12; break;
711         case 11: KEYSET13; break;
712         case 12: KEYSET14; break;
713         case 13: KEYSET15; break;
714         case 14: KEYSET16; break;
715         case 15: KEYSET17; break;
716       }
717
718       s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30);
719       s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17);
720       s3(             D39        ^ k12,              D40        ^ k13,              D41        ^ k14,              D42        ^ k15,              D43        ^ k16,              D44        ^ k17, &D23, &D15, &D29, &D05);
721       s4(             D43        ^ k18,              D44        ^ k19,              D45        ^ k20,              D46        ^ k21,              D47        ^ k22,              D48        ^ k23, &D25, &D19, &D09, &D00);
722       s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02);
723       s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18);
724       s7(             D55        ^ k36,              D56        ^ k37,              D57        ^ k38,              D58        ^ k39,              D59        ^ k40,              D60        ^ k41, &D31, &D11, &D21, &D06);
725       s8(             D59        ^ k42,              D60        ^ k43,              D61        ^ k44,              D62        ^ k45,              D63        ^ k46,              D32        ^ k47, &D04, &D26, &D14, &D20);
726
727       DATASWAP;
728     }
729
730     DATASWAP;
731   }
732
733   DATASWAP;
734 }
735
736 static void transpose32c (u32 data[32])
737 {
738   #define swap(x,y,j,m)               \
739      t  = ((x) ^ ((y) >> (j))) & (m); \
740     (x) = (x) ^ t;                    \
741     (y) = (y) ^ (t << (j));
742
743   u32 t;
744
745   swap (data[ 0], data[16], 16, 0x0000ffff);
746   swap (data[ 1], data[17], 16, 0x0000ffff);
747   swap (data[ 2], data[18], 16, 0x0000ffff);
748   swap (data[ 3], data[19], 16, 0x0000ffff);
749   swap (data[ 4], data[20], 16, 0x0000ffff);
750   swap (data[ 5], data[21], 16, 0x0000ffff);
751   swap (data[ 6], data[22], 16, 0x0000ffff);
752   swap (data[ 7], data[23], 16, 0x0000ffff);
753   swap (data[ 8], data[24], 16, 0x0000ffff);
754   swap (data[ 9], data[25], 16, 0x0000ffff);
755   swap (data[10], data[26], 16, 0x0000ffff);
756   swap (data[11], data[27], 16, 0x0000ffff);
757   swap (data[12], data[28], 16, 0x0000ffff);
758   swap (data[13], data[29], 16, 0x0000ffff);
759   swap (data[14], data[30], 16, 0x0000ffff);
760   swap (data[15], data[31], 16, 0x0000ffff);
761   swap (data[ 0], data[ 8],  8, 0x00ff00ff);
762   swap (data[ 1], data[ 9],  8, 0x00ff00ff);
763   swap (data[ 2], data[10],  8, 0x00ff00ff);
764   swap (data[ 3], data[11],  8, 0x00ff00ff);
765   swap (data[ 4], data[12],  8, 0x00ff00ff);
766   swap (data[ 5], data[13],  8, 0x00ff00ff);
767   swap (data[ 6], data[14],  8, 0x00ff00ff);
768   swap (data[ 7], data[15],  8, 0x00ff00ff);
769   swap (data[ 0], data[ 4],  4, 0x0f0f0f0f);
770   swap (data[ 1], data[ 5],  4, 0x0f0f0f0f);
771   swap (data[ 2], data[ 6],  4, 0x0f0f0f0f);
772   swap (data[ 3], data[ 7],  4, 0x0f0f0f0f);
773   swap (data[ 0], data[ 2],  2, 0x33333333);
774   swap (data[ 1], data[ 3],  2, 0x33333333);
775   swap (data[ 0], data[ 1],  1, 0x55555555);
776   swap (data[ 2], data[ 3],  1, 0x55555555);
777   swap (data[ 4], data[ 6],  2, 0x33333333);
778   swap (data[ 5], data[ 7],  2, 0x33333333);
779   swap (data[ 4], data[ 5],  1, 0x55555555);
780   swap (data[ 6], data[ 7],  1, 0x55555555);
781   swap (data[ 8], data[12],  4, 0x0f0f0f0f);
782   swap (data[ 9], data[13],  4, 0x0f0f0f0f);
783   swap (data[10], data[14],  4, 0x0f0f0f0f);
784   swap (data[11], data[15],  4, 0x0f0f0f0f);
785   swap (data[ 8], data[10],  2, 0x33333333);
786   swap (data[ 9], data[11],  2, 0x33333333);
787   swap (data[ 8], data[ 9],  1, 0x55555555);
788   swap (data[10], data[11],  1, 0x55555555);
789   swap (data[12], data[14],  2, 0x33333333);
790   swap (data[13], data[15],  2, 0x33333333);
791   swap (data[12], data[13],  1, 0x55555555);
792   swap (data[14], data[15],  1, 0x55555555);
793   swap (data[16], data[24],  8, 0x00ff00ff);
794   swap (data[17], data[25],  8, 0x00ff00ff);
795   swap (data[18], data[26],  8, 0x00ff00ff);
796   swap (data[19], data[27],  8, 0x00ff00ff);
797   swap (data[20], data[28],  8, 0x00ff00ff);
798   swap (data[21], data[29],  8, 0x00ff00ff);
799   swap (data[22], data[30],  8, 0x00ff00ff);
800   swap (data[23], data[31],  8, 0x00ff00ff);
801   swap (data[16], data[20],  4, 0x0f0f0f0f);
802   swap (data[17], data[21],  4, 0x0f0f0f0f);
803   swap (data[18], data[22],  4, 0x0f0f0f0f);
804   swap (data[19], data[23],  4, 0x0f0f0f0f);
805   swap (data[16], data[18],  2, 0x33333333);
806   swap (data[17], data[19],  2, 0x33333333);
807   swap (data[16], data[17],  1, 0x55555555);
808   swap (data[18], data[19],  1, 0x55555555);
809   swap (data[20], data[22],  2, 0x33333333);
810   swap (data[21], data[23],  2, 0x33333333);
811   swap (data[20], data[21],  1, 0x55555555);
812   swap (data[22], data[23],  1, 0x55555555);
813   swap (data[24], data[28],  4, 0x0f0f0f0f);
814   swap (data[25], data[29],  4, 0x0f0f0f0f);
815   swap (data[26], data[30],  4, 0x0f0f0f0f);
816   swap (data[27], data[31],  4, 0x0f0f0f0f);
817   swap (data[24], data[26],  2, 0x33333333);
818   swap (data[25], data[27],  2, 0x33333333);
819   swap (data[24], data[25],  1, 0x55555555);
820   swap (data[26], data[27],  1, 0x55555555);
821   swap (data[28], data[30],  2, 0x33333333);
822   swap (data[29], data[31],  2, 0x33333333);
823   swap (data[28], data[29],  1, 0x55555555);
824   swap (data[30], data[31],  1, 0x55555555);
825 }
826
827 static void m01500m (__local u32 *s_S, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
828 {
829   /**
830    * base
831    */
832
833   const u32 gid = get_global_id (0);
834   const u32 lid = get_local_id (0);
835
836   /**
837    * salt
838    */
839
840   const u32 salt = salt_bufs[salt_pos].salt_buf[0];
841
842   /**
843    * keys
844    */
845
846   const u32 K00 = pws[gid].i[ 0];
847   const u32 K01 = pws[gid].i[ 1];
848   const u32 K02 = pws[gid].i[ 2];
849   const u32 K03 = pws[gid].i[ 3];
850   const u32 K04 = pws[gid].i[ 4];
851   const u32 K05 = pws[gid].i[ 5];
852   const u32 K06 = pws[gid].i[ 6];
853   const u32 K07 = pws[gid].i[ 7];
854   const u32 K08 = pws[gid].i[ 8];
855   const u32 K09 = pws[gid].i[ 9];
856   const u32 K10 = pws[gid].i[10];
857   const u32 K11 = pws[gid].i[11];
858   const u32 K12 = pws[gid].i[12];
859   const u32 K13 = pws[gid].i[13];
860   const u32 K14 = pws[gid].i[14];
861   const u32 K15 = pws[gid].i[15];
862   const u32 K16 = pws[gid].i[16];
863   const u32 K17 = pws[gid].i[17];
864   const u32 K18 = pws[gid].i[18];
865   const u32 K19 = pws[gid].i[19];
866   const u32 K20 = pws[gid].i[20];
867   const u32 K21 = pws[gid].i[21];
868   const u32 K22 = pws[gid].i[22];
869   const u32 K23 = pws[gid].i[23];
870   const u32 K24 = pws[gid].i[24];
871   const u32 K25 = pws[gid].i[25];
872   const u32 K26 = pws[gid].i[26];
873   const u32 K27 = pws[gid].i[27];
874   const u32 K28 = pws[gid].i[28];
875   const u32 K29 = pws[gid].i[29];
876   const u32 K30 = pws[gid].i[30];
877   const u32 K31 = pws[gid].i[31];
878   const u32 K32 = pws[gid].i[32];
879   const u32 K33 = pws[gid].i[33];
880   const u32 K34 = pws[gid].i[34];
881   const u32 K35 = pws[gid].i[35];
882   const u32 K36 = pws[gid].i[36];
883   const u32 K37 = pws[gid].i[37];
884   const u32 K38 = pws[gid].i[38];
885   const u32 K39 = pws[gid].i[39];
886   const u32 K40 = pws[gid].i[40];
887   const u32 K41 = pws[gid].i[41];
888   const u32 K42 = pws[gid].i[42];
889   const u32 K43 = pws[gid].i[43];
890   const u32 K44 = pws[gid].i[44];
891   const u32 K45 = pws[gid].i[45];
892   const u32 K46 = pws[gid].i[46];
893   const u32 K47 = pws[gid].i[47];
894   const u32 K48 = pws[gid].i[48];
895   const u32 K49 = pws[gid].i[49];
896   const u32 K50 = pws[gid].i[50];
897   const u32 K51 = pws[gid].i[51];
898   const u32 K52 = pws[gid].i[52];
899   const u32 K53 = pws[gid].i[53];
900   const u32 K54 = pws[gid].i[54];
901   const u32 K55 = pws[gid].i[55];
902
903   /**
904    * inner loop
905    */
906
907   const u32 bf_loops = bfs_cnt;
908
909   const u32 pc_pos = get_local_id (1);
910
911   const u32 il_pos = pc_pos * 32;
912
913   u32 k00 = K00;
914   u32 k01 = K01;
915   u32 k02 = K02;
916   u32 k03 = K03;
917   u32 k04 = K04;
918   u32 k05 = K05;
919   u32 k06 = K06;
920   u32 k07 = K07;
921   u32 k08 = K08;
922   u32 k09 = K09;
923   u32 k10 = K10;
924   u32 k11 = K11;
925   u32 k12 = K12;
926   u32 k13 = K13;
927   u32 k14 = K14;
928   u32 k15 = K15;
929   u32 k16 = K16;
930   u32 k17 = K17;
931   u32 k18 = K18;
932   u32 k19 = K19;
933   u32 k20 = K20;
934   u32 k21 = K21;
935   u32 k22 = K22;
936   u32 k23 = K23;
937   u32 k24 = K24;
938   u32 k25 = K25;
939   u32 k26 = K26;
940   u32 k27 = K27;
941
942   k00 |= words_buf_r[pc_pos].b[ 0];
943   k01 |= words_buf_r[pc_pos].b[ 1];
944   k02 |= words_buf_r[pc_pos].b[ 2];
945   k03 |= words_buf_r[pc_pos].b[ 3];
946   k04 |= words_buf_r[pc_pos].b[ 4];
947   k05 |= words_buf_r[pc_pos].b[ 5];
948   k06 |= words_buf_r[pc_pos].b[ 6];
949   k07 |= words_buf_r[pc_pos].b[ 7];
950   k08 |= words_buf_r[pc_pos].b[ 8];
951   k09 |= words_buf_r[pc_pos].b[ 9];
952   k10 |= words_buf_r[pc_pos].b[10];
953   k11 |= words_buf_r[pc_pos].b[11];
954   k12 |= words_buf_r[pc_pos].b[12];
955   k13 |= words_buf_r[pc_pos].b[13];
956   k14 |= words_buf_r[pc_pos].b[14];
957   k15 |= words_buf_r[pc_pos].b[15];
958   k16 |= words_buf_r[pc_pos].b[16];
959   k17 |= words_buf_r[pc_pos].b[17];
960   k18 |= words_buf_r[pc_pos].b[18];
961   k19 |= words_buf_r[pc_pos].b[19];
962   k20 |= words_buf_r[pc_pos].b[20];
963   k21 |= words_buf_r[pc_pos].b[21];
964   k22 |= words_buf_r[pc_pos].b[22];
965   k23 |= words_buf_r[pc_pos].b[23];
966   k24 |= words_buf_r[pc_pos].b[24];
967   k25 |= words_buf_r[pc_pos].b[25];
968   k26 |= words_buf_r[pc_pos].b[26];
969   k27 |= words_buf_r[pc_pos].b[27];
970
971   u32 D00 = 0;
972   u32 D01 = 0;
973   u32 D02 = 0;
974   u32 D03 = 0;
975   u32 D04 = 0;
976   u32 D05 = 0;
977   u32 D06 = 0;
978   u32 D07 = 0;
979   u32 D08 = 0;
980   u32 D09 = 0;
981   u32 D10 = 0;
982   u32 D11 = 0;
983   u32 D12 = 0;
984   u32 D13 = 0;
985   u32 D14 = 0;
986   u32 D15 = 0;
987   u32 D16 = 0;
988   u32 D17 = 0;
989   u32 D18 = 0;
990   u32 D19 = 0;
991   u32 D20 = 0;
992   u32 D21 = 0;
993   u32 D22 = 0;
994   u32 D23 = 0;
995   u32 D24 = 0;
996   u32 D25 = 0;
997   u32 D26 = 0;
998   u32 D27 = 0;
999   u32 D28 = 0;
1000   u32 D29 = 0;
1001   u32 D30 = 0;
1002   u32 D31 = 0;
1003   u32 D32 = 0;
1004   u32 D33 = 0;
1005   u32 D34 = 0;
1006   u32 D35 = 0;
1007   u32 D36 = 0;
1008   u32 D37 = 0;
1009   u32 D38 = 0;
1010   u32 D39 = 0;
1011   u32 D40 = 0;
1012   u32 D41 = 0;
1013   u32 D42 = 0;
1014   u32 D43 = 0;
1015   u32 D44 = 0;
1016   u32 D45 = 0;
1017   u32 D46 = 0;
1018   u32 D47 = 0;
1019   u32 D48 = 0;
1020   u32 D49 = 0;
1021   u32 D50 = 0;
1022   u32 D51 = 0;
1023   u32 D52 = 0;
1024   u32 D53 = 0;
1025   u32 D54 = 0;
1026   u32 D55 = 0;
1027   u32 D56 = 0;
1028   u32 D57 = 0;
1029   u32 D58 = 0;
1030   u32 D59 = 0;
1031   u32 D60 = 0;
1032   u32 D61 = 0;
1033   u32 D62 = 0;
1034   u32 D63 = 0;
1035
1036   DESCrypt
1037   (
1038     salt,
1039     k00, k01, k02, k03, k04, k05, k06,
1040     k07, k08, k09, k10, k11, k12, k13,
1041     k14, k15, k16, k17, k18, k19, k20,
1042     k21, k22, k23, k24, k25, k26, k27,
1043     K28, K29, K30, K31, K32, K33, K34,
1044     K35, K36, K37, K38, K39, K40, K41,
1045     K42, K43, K44, K45, K46, K47, K48,
1046     K49, K50, K51, K52, K53, K54, K55,
1047     D00, D01, D02, D03, D04, D05, D06, D07,
1048     D08, D09, D10, D11, D12, D13, D14, D15,
1049     D16, D17, D18, D19, D20, D21, D22, D23,
1050     D24, D25, D26, D27, D28, D29, D30, D31,
1051     D32, D33, D34, D35, D36, D37, D38, D39,
1052     D40, D41, D42, D43, D44, D45, D46, D47,
1053     D48, D49, D50, D51, D52, D53, D54, D55,
1054     D56, D57, D58, D59, D60, D61, D62, D63
1055   );
1056
1057   u32 out[64];
1058
1059   out[ 0] = D00;
1060   out[ 1] = D01;
1061   out[ 2] = D02;
1062   out[ 3] = D03;
1063   out[ 4] = D04;
1064   out[ 5] = D05;
1065   out[ 6] = D06;
1066   out[ 7] = D07;
1067   out[ 8] = D08;
1068   out[ 9] = D09;
1069   out[10] = D10;
1070   out[11] = D11;
1071   out[12] = D12;
1072   out[13] = D13;
1073   out[14] = D14;
1074   out[15] = D15;
1075   out[16] = D16;
1076   out[17] = D17;
1077   out[18] = D18;
1078   out[19] = D19;
1079   out[20] = D20;
1080   out[21] = D21;
1081   out[22] = D22;
1082   out[23] = D23;
1083   out[24] = D24;
1084   out[25] = D25;
1085   out[26] = D26;
1086   out[27] = D27;
1087   out[28] = D28;
1088   out[29] = D29;
1089   out[30] = D30;
1090   out[31] = D31;
1091   out[32] = D32;
1092   out[33] = D33;
1093   out[34] = D34;
1094   out[35] = D35;
1095   out[36] = D36;
1096   out[37] = D37;
1097   out[38] = D38;
1098   out[39] = D39;
1099   out[40] = D40;
1100   out[41] = D41;
1101   out[42] = D42;
1102   out[43] = D43;
1103   out[44] = D44;
1104   out[45] = D45;
1105   out[46] = D46;
1106   out[47] = D47;
1107   out[48] = D48;
1108   out[49] = D49;
1109   out[50] = D50;
1110   out[51] = D51;
1111   out[52] = D52;
1112   out[53] = D53;
1113   out[54] = D54;
1114   out[55] = D55;
1115   out[56] = D56;
1116   out[57] = D57;
1117   out[58] = D58;
1118   out[59] = D59;
1119   out[60] = D60;
1120   out[61] = D61;
1121   out[62] = D62;
1122   out[63] = D63;
1123
1124   if (digests_cnt < 16)
1125   {
1126     for (u32 d = 0; d < digests_cnt; d++)
1127     {
1128       const u32 final_hash_pos = digests_offset + d;
1129
1130       if (hashes_shown[final_hash_pos]) continue;
1131
1132       u32 search[2];
1133
1134       search[0] = digests_buf[final_hash_pos].digest_buf[DGST_R0];
1135       search[1] = digests_buf[final_hash_pos].digest_buf[DGST_R1];
1136
1137       u32 tmpResult = 0;
1138
1139       #pragma unroll
1140       for (int i = 0; i < 32; i++)
1141       {
1142         const u32 b0 = -((search[0] >> i) & 1);
1143         const u32 b1 = -((search[1] >> i) & 1);
1144
1145         tmpResult |= out[ 0 + i] ^ b0;
1146         tmpResult |= out[32 + i] ^ b1;
1147       }
1148
1149       if (tmpResult == 0xffffffff) continue;
1150
1151       const u32 slice = 31 - clz (~tmpResult);
1152
1153       const u32x r0 = search[0];
1154       const u32x r1 = search[1];
1155       const u32x r2 = 0;
1156       const u32x r3 = 0;
1157
1158       #include VECT_COMPARE_M
1159     }
1160   }
1161   else
1162   {
1163     u32 out0[32];
1164     u32 out1[32];
1165
1166     #pragma unroll
1167     for (int i = 0; i < 32; i++)
1168     {
1169       out0[i] = out[ 0 + 31 - i];
1170       out1[i] = out[32 + 31 - i];
1171     }
1172
1173     transpose32c (out0);
1174     transpose32c (out1);
1175
1176     #pragma unroll
1177     for (int slice = 0; slice < 32; slice++)
1178     {
1179       const u32x r0 = out0[31 - slice];
1180       const u32x r1 = out1[31 - slice];
1181       const u32x r2 = 0;
1182       const u32x r3 = 0;
1183
1184       #include VECT_COMPARE_M
1185     }
1186   }
1187 }
1188
1189 static void m01500s (__local u32 *s_S, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1190 {
1191   /**
1192    * base
1193    */
1194
1195   const u32 gid = get_global_id (0);
1196   const u32 lid = get_local_id (0);
1197
1198   /**
1199    * salt
1200    */
1201
1202   const u32 salt = salt_bufs[salt_pos].salt_buf[0];
1203
1204   /**
1205    * digest
1206    */
1207
1208   #define S00 s_S[ 0]
1209   #define S01 s_S[ 1]
1210   #define S02 s_S[ 2]
1211   #define S03 s_S[ 3]
1212   #define S04 s_S[ 4]
1213   #define S05 s_S[ 5]
1214   #define S06 s_S[ 6]
1215   #define S07 s_S[ 7]
1216   #define S08 s_S[ 8]
1217   #define S09 s_S[ 9]
1218   #define S10 s_S[10]
1219   #define S11 s_S[11]
1220   #define S12 s_S[12]
1221   #define S13 s_S[13]
1222   #define S14 s_S[14]
1223   #define S15 s_S[15]
1224   #define S16 s_S[16]
1225   #define S17 s_S[17]
1226   #define S18 s_S[18]
1227   #define S19 s_S[19]
1228   #define S20 s_S[20]
1229   #define S21 s_S[21]
1230   #define S22 s_S[22]
1231   #define S23 s_S[23]
1232   #define S24 s_S[24]
1233   #define S25 s_S[25]
1234   #define S26 s_S[26]
1235   #define S27 s_S[27]
1236   #define S28 s_S[28]
1237   #define S29 s_S[29]
1238   #define S30 s_S[30]
1239   #define S31 s_S[31]
1240   #define S32 s_S[32]
1241   #define S33 s_S[33]
1242   #define S34 s_S[34]
1243   #define S35 s_S[35]
1244   #define S36 s_S[36]
1245   #define S37 s_S[37]
1246   #define S38 s_S[38]
1247   #define S39 s_S[39]
1248   #define S40 s_S[40]
1249   #define S41 s_S[41]
1250   #define S42 s_S[42]
1251   #define S43 s_S[43]
1252   #define S44 s_S[44]
1253   #define S45 s_S[45]
1254   #define S46 s_S[46]
1255   #define S47 s_S[47]
1256   #define S48 s_S[48]
1257   #define S49 s_S[49]
1258   #define S50 s_S[50]
1259   #define S51 s_S[51]
1260   #define S52 s_S[52]
1261   #define S53 s_S[53]
1262   #define S54 s_S[54]
1263   #define S55 s_S[55]
1264   #define S56 s_S[56]
1265   #define S57 s_S[57]
1266   #define S58 s_S[58]
1267   #define S59 s_S[59]
1268   #define S60 s_S[60]
1269   #define S61 s_S[61]
1270   #define S62 s_S[62]
1271   #define S63 s_S[63]
1272
1273   /**
1274    * keys
1275    */
1276
1277   const u32 K00 = pws[gid].i[ 0];
1278   const u32 K01 = pws[gid].i[ 1];
1279   const u32 K02 = pws[gid].i[ 2];
1280   const u32 K03 = pws[gid].i[ 3];
1281   const u32 K04 = pws[gid].i[ 4];
1282   const u32 K05 = pws[gid].i[ 5];
1283   const u32 K06 = pws[gid].i[ 6];
1284   const u32 K07 = pws[gid].i[ 7];
1285   const u32 K08 = pws[gid].i[ 8];
1286   const u32 K09 = pws[gid].i[ 9];
1287   const u32 K10 = pws[gid].i[10];
1288   const u32 K11 = pws[gid].i[11];
1289   const u32 K12 = pws[gid].i[12];
1290   const u32 K13 = pws[gid].i[13];
1291   const u32 K14 = pws[gid].i[14];
1292   const u32 K15 = pws[gid].i[15];
1293   const u32 K16 = pws[gid].i[16];
1294   const u32 K17 = pws[gid].i[17];
1295   const u32 K18 = pws[gid].i[18];
1296   const u32 K19 = pws[gid].i[19];
1297   const u32 K20 = pws[gid].i[20];
1298   const u32 K21 = pws[gid].i[21];
1299   const u32 K22 = pws[gid].i[22];
1300   const u32 K23 = pws[gid].i[23];
1301   const u32 K24 = pws[gid].i[24];
1302   const u32 K25 = pws[gid].i[25];
1303   const u32 K26 = pws[gid].i[26];
1304   const u32 K27 = pws[gid].i[27];
1305   const u32 K28 = pws[gid].i[28];
1306   const u32 K29 = pws[gid].i[29];
1307   const u32 K30 = pws[gid].i[30];
1308   const u32 K31 = pws[gid].i[31];
1309   const u32 K32 = pws[gid].i[32];
1310   const u32 K33 = pws[gid].i[33];
1311   const u32 K34 = pws[gid].i[34];
1312   const u32 K35 = pws[gid].i[35];
1313   const u32 K36 = pws[gid].i[36];
1314   const u32 K37 = pws[gid].i[37];
1315   const u32 K38 = pws[gid].i[38];
1316   const u32 K39 = pws[gid].i[39];
1317   const u32 K40 = pws[gid].i[40];
1318   const u32 K41 = pws[gid].i[41];
1319   const u32 K42 = pws[gid].i[42];
1320   const u32 K43 = pws[gid].i[43];
1321   const u32 K44 = pws[gid].i[44];
1322   const u32 K45 = pws[gid].i[45];
1323   const u32 K46 = pws[gid].i[46];
1324   const u32 K47 = pws[gid].i[47];
1325   const u32 K48 = pws[gid].i[48];
1326   const u32 K49 = pws[gid].i[49];
1327   const u32 K50 = pws[gid].i[50];
1328   const u32 K51 = pws[gid].i[51];
1329   const u32 K52 = pws[gid].i[52];
1330   const u32 K53 = pws[gid].i[53];
1331   const u32 K54 = pws[gid].i[54];
1332   const u32 K55 = pws[gid].i[55];
1333
1334   /**
1335    * inner loop
1336    */
1337
1338   const u32 pc_pos = get_local_id (1);
1339
1340   const u32 il_pos = pc_pos * 32;
1341
1342   u32 k00 = K00;
1343   u32 k01 = K01;
1344   u32 k02 = K02;
1345   u32 k03 = K03;
1346   u32 k04 = K04;
1347   u32 k05 = K05;
1348   u32 k06 = K06;
1349   u32 k07 = K07;
1350   u32 k08 = K08;
1351   u32 k09 = K09;
1352   u32 k10 = K10;
1353   u32 k11 = K11;
1354   u32 k12 = K12;
1355   u32 k13 = K13;
1356   u32 k14 = K14;
1357   u32 k15 = K15;
1358   u32 k16 = K16;
1359   u32 k17 = K17;
1360   u32 k18 = K18;
1361   u32 k19 = K19;
1362   u32 k20 = K20;
1363   u32 k21 = K21;
1364   u32 k22 = K22;
1365   u32 k23 = K23;
1366   u32 k24 = K24;
1367   u32 k25 = K25;
1368   u32 k26 = K26;
1369   u32 k27 = K27;
1370
1371   k00 |= words_buf_r[pc_pos].b[ 0];
1372   k01 |= words_buf_r[pc_pos].b[ 1];
1373   k02 |= words_buf_r[pc_pos].b[ 2];
1374   k03 |= words_buf_r[pc_pos].b[ 3];
1375   k04 |= words_buf_r[pc_pos].b[ 4];
1376   k05 |= words_buf_r[pc_pos].b[ 5];
1377   k06 |= words_buf_r[pc_pos].b[ 6];
1378   k07 |= words_buf_r[pc_pos].b[ 7];
1379   k08 |= words_buf_r[pc_pos].b[ 8];
1380   k09 |= words_buf_r[pc_pos].b[ 9];
1381   k10 |= words_buf_r[pc_pos].b[10];
1382   k11 |= words_buf_r[pc_pos].b[11];
1383   k12 |= words_buf_r[pc_pos].b[12];
1384   k13 |= words_buf_r[pc_pos].b[13];
1385   k14 |= words_buf_r[pc_pos].b[14];
1386   k15 |= words_buf_r[pc_pos].b[15];
1387   k16 |= words_buf_r[pc_pos].b[16];
1388   k17 |= words_buf_r[pc_pos].b[17];
1389   k18 |= words_buf_r[pc_pos].b[18];
1390   k19 |= words_buf_r[pc_pos].b[19];
1391   k20 |= words_buf_r[pc_pos].b[20];
1392   k21 |= words_buf_r[pc_pos].b[21];
1393   k22 |= words_buf_r[pc_pos].b[22];
1394   k23 |= words_buf_r[pc_pos].b[23];
1395   k24 |= words_buf_r[pc_pos].b[24];
1396   k25 |= words_buf_r[pc_pos].b[25];
1397   k26 |= words_buf_r[pc_pos].b[26];
1398   k27 |= words_buf_r[pc_pos].b[27];
1399
1400   u32 D00 = 0;
1401   u32 D01 = 0;
1402   u32 D02 = 0;
1403   u32 D03 = 0;
1404   u32 D04 = 0;
1405   u32 D05 = 0;
1406   u32 D06 = 0;
1407   u32 D07 = 0;
1408   u32 D08 = 0;
1409   u32 D09 = 0;
1410   u32 D10 = 0;
1411   u32 D11 = 0;
1412   u32 D12 = 0;
1413   u32 D13 = 0;
1414   u32 D14 = 0;
1415   u32 D15 = 0;
1416   u32 D16 = 0;
1417   u32 D17 = 0;
1418   u32 D18 = 0;
1419   u32 D19 = 0;
1420   u32 D20 = 0;
1421   u32 D21 = 0;
1422   u32 D22 = 0;
1423   u32 D23 = 0;
1424   u32 D24 = 0;
1425   u32 D25 = 0;
1426   u32 D26 = 0;
1427   u32 D27 = 0;
1428   u32 D28 = 0;
1429   u32 D29 = 0;
1430   u32 D30 = 0;
1431   u32 D31 = 0;
1432   u32 D32 = 0;
1433   u32 D33 = 0;
1434   u32 D34 = 0;
1435   u32 D35 = 0;
1436   u32 D36 = 0;
1437   u32 D37 = 0;
1438   u32 D38 = 0;
1439   u32 D39 = 0;
1440   u32 D40 = 0;
1441   u32 D41 = 0;
1442   u32 D42 = 0;
1443   u32 D43 = 0;
1444   u32 D44 = 0;
1445   u32 D45 = 0;
1446   u32 D46 = 0;
1447   u32 D47 = 0;
1448   u32 D48 = 0;
1449   u32 D49 = 0;
1450   u32 D50 = 0;
1451   u32 D51 = 0;
1452   u32 D52 = 0;
1453   u32 D53 = 0;
1454   u32 D54 = 0;
1455   u32 D55 = 0;
1456   u32 D56 = 0;
1457   u32 D57 = 0;
1458   u32 D58 = 0;
1459   u32 D59 = 0;
1460   u32 D60 = 0;
1461   u32 D61 = 0;
1462   u32 D62 = 0;
1463   u32 D63 = 0;
1464
1465   DESCrypt
1466   (
1467     salt,
1468     k00, k01, k02, k03, k04, k05, k06,
1469     k07, k08, k09, k10, k11, k12, k13,
1470     k14, k15, k16, k17, k18, k19, k20,
1471     k21, k22, k23, k24, k25, k26, k27,
1472     K28, K29, K30, K31, K32, K33, K34,
1473     K35, K36, K37, K38, K39, K40, K41,
1474     K42, K43, K44, K45, K46, K47, K48,
1475     K49, K50, K51, K52, K53, K54, K55,
1476     D00, D01, D02, D03, D04, D05, D06, D07,
1477     D08, D09, D10, D11, D12, D13, D14, D15,
1478     D16, D17, D18, D19, D20, D21, D22, D23,
1479     D24, D25, D26, D27, D28, D29, D30, D31,
1480     D32, D33, D34, D35, D36, D37, D38, D39,
1481     D40, D41, D42, D43, D44, D45, D46, D47,
1482     D48, D49, D50, D51, D52, D53, D54, D55,
1483     D56, D57, D58, D59, D60, D61, D62, D63
1484   );
1485
1486   u32 tmpResult = 0;
1487
1488   tmpResult |= D00 ^ S00;
1489   tmpResult |= D01 ^ S01;
1490   tmpResult |= D02 ^ S02;
1491   tmpResult |= D03 ^ S03;
1492   tmpResult |= D04 ^ S04;
1493   tmpResult |= D05 ^ S05;
1494   tmpResult |= D06 ^ S06;
1495   tmpResult |= D07 ^ S07;
1496   tmpResult |= D08 ^ S08;
1497   tmpResult |= D09 ^ S09;
1498   tmpResult |= D10 ^ S10;
1499   tmpResult |= D11 ^ S11;
1500   tmpResult |= D12 ^ S12;
1501   tmpResult |= D13 ^ S13;
1502   tmpResult |= D14 ^ S14;
1503   tmpResult |= D15 ^ S15;
1504   tmpResult |= D16 ^ S16;
1505   tmpResult |= D17 ^ S17;
1506   tmpResult |= D18 ^ S18;
1507   tmpResult |= D19 ^ S19;
1508   tmpResult |= D20 ^ S20;
1509   tmpResult |= D21 ^ S21;
1510   tmpResult |= D22 ^ S22;
1511   tmpResult |= D23 ^ S23;
1512   tmpResult |= D24 ^ S24;
1513   tmpResult |= D25 ^ S25;
1514   tmpResult |= D26 ^ S26;
1515   tmpResult |= D27 ^ S27;
1516   tmpResult |= D28 ^ S28;
1517   tmpResult |= D29 ^ S29;
1518   tmpResult |= D30 ^ S30;
1519   tmpResult |= D31 ^ S31;
1520   tmpResult |= D32 ^ S32;
1521   tmpResult |= D33 ^ S33;
1522   tmpResult |= D34 ^ S34;
1523   tmpResult |= D35 ^ S35;
1524   tmpResult |= D36 ^ S36;
1525   tmpResult |= D37 ^ S37;
1526   tmpResult |= D38 ^ S38;
1527   tmpResult |= D39 ^ S39;
1528   tmpResult |= D40 ^ S40;
1529   tmpResult |= D41 ^ S41;
1530   tmpResult |= D42 ^ S42;
1531   tmpResult |= D43 ^ S43;
1532   tmpResult |= D44 ^ S44;
1533   tmpResult |= D45 ^ S45;
1534   tmpResult |= D46 ^ S46;
1535   tmpResult |= D47 ^ S47;
1536
1537   if (tmpResult == 0xffffffff) return;
1538
1539   tmpResult |= D48 ^ S48;
1540   tmpResult |= D49 ^ S49;
1541   tmpResult |= D50 ^ S50;
1542   tmpResult |= D51 ^ S51;
1543   tmpResult |= D52 ^ S52;
1544   tmpResult |= D53 ^ S53;
1545   tmpResult |= D54 ^ S54;
1546   tmpResult |= D55 ^ S55;
1547   tmpResult |= D56 ^ S56;
1548   tmpResult |= D57 ^ S57;
1549   tmpResult |= D58 ^ S58;
1550   tmpResult |= D59 ^ S59;
1551   tmpResult |= D60 ^ S60;
1552   tmpResult |= D61 ^ S61;
1553   tmpResult |= D62 ^ S62;
1554   tmpResult |= D63 ^ S63;
1555
1556   if (tmpResult == 0xffffffff) return;
1557
1558   const u32 slice = 31 - clz (~tmpResult);
1559
1560   #include VECT_COMPARE_S
1561 }
1562
1563 //
1564 // transpose bitslice base : easy because no overlapping buffers
1565 //                    mod  : attention race conditions, need different buffers for *in and *out
1566 //
1567
1568 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_tb (__global pw_t *pws)
1569 {
1570   const u32 gid = get_global_id (0);
1571
1572   const u32 w0 = pws[gid].i[0];
1573   const u32 w1 = pws[gid].i[1];
1574
1575   const u32 w0s = (w0 << 1) & 0xfefefefe;
1576   const u32 w1s = (w1 << 1) & 0xfefefefe;
1577
1578   #pragma unroll
1579   for (int i = 0, j = 0; i < 32; i += 8, j += 7)
1580   {
1581     pws[gid].i[j +  0 + 0] = -((w0s >> (i + 7)) & 1);
1582     pws[gid].i[j +  0 + 1] = -((w0s >> (i + 6)) & 1);
1583     pws[gid].i[j +  0 + 2] = -((w0s >> (i + 5)) & 1);
1584     pws[gid].i[j +  0 + 3] = -((w0s >> (i + 4)) & 1);
1585     pws[gid].i[j +  0 + 4] = -((w0s >> (i + 3)) & 1);
1586     pws[gid].i[j +  0 + 5] = -((w0s >> (i + 2)) & 1);
1587     pws[gid].i[j +  0 + 6] = -((w0s >> (i + 1)) & 1);
1588   }
1589
1590   #pragma unroll
1591   for (int i = 0, j = 0; i < 32; i += 8, j += 7)
1592   {
1593     pws[gid].i[j + 28 + 0] = -((w1s >> (i + 7)) & 1);
1594     pws[gid].i[j + 28 + 1] = -((w1s >> (i + 6)) & 1);
1595     pws[gid].i[j + 28 + 2] = -((w1s >> (i + 5)) & 1);
1596     pws[gid].i[j + 28 + 3] = -((w1s >> (i + 4)) & 1);
1597     pws[gid].i[j + 28 + 4] = -((w1s >> (i + 3)) & 1);
1598     pws[gid].i[j + 28 + 5] = -((w1s >> (i + 2)) & 1);
1599     pws[gid].i[j + 28 + 6] = -((w1s >> (i + 1)) & 1);
1600   }
1601 }
1602
1603 __kernel void __attribute__((reqd_work_group_size (32, 1, 1))) m01500_tm (__global u32 *mod, __global bs_word_t *words_buf_r)
1604 {
1605   const u32 gid = get_global_id (0);
1606   const u32 lid = get_local_id (0);
1607
1608   const u32 block = gid / 32;
1609   const u32 slice = gid % 32;
1610
1611   const u32 w0 = mod[gid];
1612
1613   const u32 w0s = (w0 << 1) & 0xfefefefe;
1614
1615   #pragma unroll
1616   for (int i = 0, j = 0; i < 32; i += 8, j += 7)
1617   {
1618     atomic_or (&words_buf_r[block].b[j + 0], (((w0s >> (i + 7)) & 1) << slice));
1619     atomic_or (&words_buf_r[block].b[j + 1], (((w0s >> (i + 6)) & 1) << slice));
1620     atomic_or (&words_buf_r[block].b[j + 2], (((w0s >> (i + 5)) & 1) << slice));
1621     atomic_or (&words_buf_r[block].b[j + 3], (((w0s >> (i + 4)) & 1) << slice));
1622     atomic_or (&words_buf_r[block].b[j + 4], (((w0s >> (i + 3)) & 1) << slice));
1623     atomic_or (&words_buf_r[block].b[j + 5], (((w0s >> (i + 2)) & 1) << slice));
1624     atomic_or (&words_buf_r[block].b[j + 6], (((w0s >> (i + 1)) & 1) << slice));
1625   }
1626 }
1627
1628 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1629 {
1630   /**
1631    * base
1632    */
1633
1634   const u32 gid = get_global_id (0);
1635   const u32 lid = get_local_id (0);
1636   const u32 vid = get_local_id (1);
1637
1638   const u32 s0 = digests_buf[digests_offset].digest_buf[0];
1639   const u32 s1 = digests_buf[digests_offset].digest_buf[1];
1640
1641   __local u32 s_S[64];
1642
1643   if (lid == 0)
1644   {
1645     s_S[ 0 + vid] = -((s0 >> vid) & 1);
1646   }
1647   else if (lid == 1)
1648   {
1649     s_S[32 + vid] = -((s1 >> vid) & 1);
1650   }
1651
1652   barrier (CLK_LOCAL_MEM_FENCE);
1653
1654   if (gid >= gid_max) return;
1655
1656   /**
1657    * main
1658    */
1659
1660   m01500m (s_S, pws, rules_buf, combs_buf, words_buf_r, 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);
1661 }
1662
1663 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1664 {
1665 }
1666
1667 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1668 {
1669 }
1670
1671 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1672 {
1673   /**
1674    * base
1675    */
1676
1677   const u32 gid = get_global_id (0);
1678   const u32 lid = get_local_id (0);
1679   const u32 vid = get_local_id (1);
1680
1681   const u32 s0 = digests_buf[digests_offset].digest_buf[0];
1682   const u32 s1 = digests_buf[digests_offset].digest_buf[1];
1683
1684   __local u32 s_S[64];
1685
1686   if (lid == 0)
1687   {
1688     s_S[ 0 + vid] = -((s0 >> vid) & 1);
1689   }
1690   else if (lid == 1)
1691   {
1692     s_S[32 + vid] = -((s1 >> vid) & 1);
1693   }
1694
1695   barrier (CLK_LOCAL_MEM_FENCE);
1696
1697   if (gid >= gid_max) return;
1698
1699   /**
1700    * main
1701    */
1702
1703   m01500s (s_S, pws, rules_buf, combs_buf, words_buf_r, 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);
1704 }
1705
1706 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1707 {
1708 }
1709
1710 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __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)
1711 {
1712 }