Allow and support vector-width 16, which is current maximum for
[hashcat.git] / OpenCL / m05500_a3.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *               magnum <john.magnum@hushmail.com>
5  *
6  * License.....: MIT
7  */
8
9 #define _MD4_
10
11 #define NEW_SIMD_CODE
12
13 #include "include/constants.h"
14 #include "include/kernel_vendor.h"
15
16 #define DGST_R0 0
17 #define DGST_R1 1
18 #define DGST_R2 2
19 #define DGST_R3 3
20
21 #include "include/kernel_functions.c"
22 #include "OpenCL/types_ocl.c"
23 #include "OpenCL/common.c"
24 #include "OpenCL/simd.c"
25
26 #define PERM_OP(a,b,tt,n,m) \
27 {                           \
28   tt = a >> n;              \
29   tt = tt ^ b;              \
30   tt = tt & m;              \
31   b = b ^ tt;               \
32   tt = tt << n;             \
33   a = a ^ tt;               \
34 }
35
36 #define HPERM_OP(a,tt,n,m)  \
37 {                           \
38   tt = a << (16 + n);       \
39   tt = tt ^ a;              \
40   tt = tt & m;              \
41   a  = a ^ tt;              \
42   tt = tt >> (16 + n);      \
43   a  = a ^ tt;              \
44 }
45
46 __constant u32 c_SPtrans[8][64] =
47 {
48   {
49     0x02080800, 0x00080000, 0x02000002, 0x02080802,
50     0x02000000, 0x00080802, 0x00080002, 0x02000002,
51     0x00080802, 0x02080800, 0x02080000, 0x00000802,
52     0x02000802, 0x02000000, 0x00000000, 0x00080002,
53     0x00080000, 0x00000002, 0x02000800, 0x00080800,
54     0x02080802, 0x02080000, 0x00000802, 0x02000800,
55     0x00000002, 0x00000800, 0x00080800, 0x02080002,
56     0x00000800, 0x02000802, 0x02080002, 0x00000000,
57     0x00000000, 0x02080802, 0x02000800, 0x00080002,
58     0x02080800, 0x00080000, 0x00000802, 0x02000800,
59     0x02080002, 0x00000800, 0x00080800, 0x02000002,
60     0x00080802, 0x00000002, 0x02000002, 0x02080000,
61     0x02080802, 0x00080800, 0x02080000, 0x02000802,
62     0x02000000, 0x00000802, 0x00080002, 0x00000000,
63     0x00080000, 0x02000000, 0x02000802, 0x02080800,
64     0x00000002, 0x02080002, 0x00000800, 0x00080802,
65   },
66   {
67     0x40108010, 0x00000000, 0x00108000, 0x40100000,
68     0x40000010, 0x00008010, 0x40008000, 0x00108000,
69     0x00008000, 0x40100010, 0x00000010, 0x40008000,
70     0x00100010, 0x40108000, 0x40100000, 0x00000010,
71     0x00100000, 0x40008010, 0x40100010, 0x00008000,
72     0x00108010, 0x40000000, 0x00000000, 0x00100010,
73     0x40008010, 0x00108010, 0x40108000, 0x40000010,
74     0x40000000, 0x00100000, 0x00008010, 0x40108010,
75     0x00100010, 0x40108000, 0x40008000, 0x00108010,
76     0x40108010, 0x00100010, 0x40000010, 0x00000000,
77     0x40000000, 0x00008010, 0x00100000, 0x40100010,
78     0x00008000, 0x40000000, 0x00108010, 0x40008010,
79     0x40108000, 0x00008000, 0x00000000, 0x40000010,
80     0x00000010, 0x40108010, 0x00108000, 0x40100000,
81     0x40100010, 0x00100000, 0x00008010, 0x40008000,
82     0x40008010, 0x00000010, 0x40100000, 0x00108000,
83   },
84   {
85     0x04000001, 0x04040100, 0x00000100, 0x04000101,
86     0x00040001, 0x04000000, 0x04000101, 0x00040100,
87     0x04000100, 0x00040000, 0x04040000, 0x00000001,
88     0x04040101, 0x00000101, 0x00000001, 0x04040001,
89     0x00000000, 0x00040001, 0x04040100, 0x00000100,
90     0x00000101, 0x04040101, 0x00040000, 0x04000001,
91     0x04040001, 0x04000100, 0x00040101, 0x04040000,
92     0x00040100, 0x00000000, 0x04000000, 0x00040101,
93     0x04040100, 0x00000100, 0x00000001, 0x00040000,
94     0x00000101, 0x00040001, 0x04040000, 0x04000101,
95     0x00000000, 0x04040100, 0x00040100, 0x04040001,
96     0x00040001, 0x04000000, 0x04040101, 0x00000001,
97     0x00040101, 0x04000001, 0x04000000, 0x04040101,
98     0x00040000, 0x04000100, 0x04000101, 0x00040100,
99     0x04000100, 0x00000000, 0x04040001, 0x00000101,
100     0x04000001, 0x00040101, 0x00000100, 0x04040000,
101   },
102   {
103     0x00401008, 0x10001000, 0x00000008, 0x10401008,
104     0x00000000, 0x10400000, 0x10001008, 0x00400008,
105     0x10401000, 0x10000008, 0x10000000, 0x00001008,
106     0x10000008, 0x00401008, 0x00400000, 0x10000000,
107     0x10400008, 0x00401000, 0x00001000, 0x00000008,
108     0x00401000, 0x10001008, 0x10400000, 0x00001000,
109     0x00001008, 0x00000000, 0x00400008, 0x10401000,
110     0x10001000, 0x10400008, 0x10401008, 0x00400000,
111     0x10400008, 0x00001008, 0x00400000, 0x10000008,
112     0x00401000, 0x10001000, 0x00000008, 0x10400000,
113     0x10001008, 0x00000000, 0x00001000, 0x00400008,
114     0x00000000, 0x10400008, 0x10401000, 0x00001000,
115     0x10000000, 0x10401008, 0x00401008, 0x00400000,
116     0x10401008, 0x00000008, 0x10001000, 0x00401008,
117     0x00400008, 0x00401000, 0x10400000, 0x10001008,
118     0x00001008, 0x10000000, 0x10000008, 0x10401000,
119   },
120   {
121     0x08000000, 0x00010000, 0x00000400, 0x08010420,
122     0x08010020, 0x08000400, 0x00010420, 0x08010000,
123     0x00010000, 0x00000020, 0x08000020, 0x00010400,
124     0x08000420, 0x08010020, 0x08010400, 0x00000000,
125     0x00010400, 0x08000000, 0x00010020, 0x00000420,
126     0x08000400, 0x00010420, 0x00000000, 0x08000020,
127     0x00000020, 0x08000420, 0x08010420, 0x00010020,
128     0x08010000, 0x00000400, 0x00000420, 0x08010400,
129     0x08010400, 0x08000420, 0x00010020, 0x08010000,
130     0x00010000, 0x00000020, 0x08000020, 0x08000400,
131     0x08000000, 0x00010400, 0x08010420, 0x00000000,
132     0x00010420, 0x08000000, 0x00000400, 0x00010020,
133     0x08000420, 0x00000400, 0x00000000, 0x08010420,
134     0x08010020, 0x08010400, 0x00000420, 0x00010000,
135     0x00010400, 0x08010020, 0x08000400, 0x00000420,
136     0x00000020, 0x00010420, 0x08010000, 0x08000020,
137   },
138   {
139     0x80000040, 0x00200040, 0x00000000, 0x80202000,
140     0x00200040, 0x00002000, 0x80002040, 0x00200000,
141     0x00002040, 0x80202040, 0x00202000, 0x80000000,
142     0x80002000, 0x80000040, 0x80200000, 0x00202040,
143     0x00200000, 0x80002040, 0x80200040, 0x00000000,
144     0x00002000, 0x00000040, 0x80202000, 0x80200040,
145     0x80202040, 0x80200000, 0x80000000, 0x00002040,
146     0x00000040, 0x00202000, 0x00202040, 0x80002000,
147     0x00002040, 0x80000000, 0x80002000, 0x00202040,
148     0x80202000, 0x00200040, 0x00000000, 0x80002000,
149     0x80000000, 0x00002000, 0x80200040, 0x00200000,
150     0x00200040, 0x80202040, 0x00202000, 0x00000040,
151     0x80202040, 0x00202000, 0x00200000, 0x80002040,
152     0x80000040, 0x80200000, 0x00202040, 0x00000000,
153     0x00002000, 0x80000040, 0x80002040, 0x80202000,
154     0x80200000, 0x00002040, 0x00000040, 0x80200040,
155   },
156   {
157     0x00004000, 0x00000200, 0x01000200, 0x01000004,
158     0x01004204, 0x00004004, 0x00004200, 0x00000000,
159     0x01000000, 0x01000204, 0x00000204, 0x01004000,
160     0x00000004, 0x01004200, 0x01004000, 0x00000204,
161     0x01000204, 0x00004000, 0x00004004, 0x01004204,
162     0x00000000, 0x01000200, 0x01000004, 0x00004200,
163     0x01004004, 0x00004204, 0x01004200, 0x00000004,
164     0x00004204, 0x01004004, 0x00000200, 0x01000000,
165     0x00004204, 0x01004000, 0x01004004, 0x00000204,
166     0x00004000, 0x00000200, 0x01000000, 0x01004004,
167     0x01000204, 0x00004204, 0x00004200, 0x00000000,
168     0x00000200, 0x01000004, 0x00000004, 0x01000200,
169     0x00000000, 0x01000204, 0x01000200, 0x00004200,
170     0x00000204, 0x00004000, 0x01004204, 0x01000000,
171     0x01004200, 0x00000004, 0x00004004, 0x01004204,
172     0x01000004, 0x01004200, 0x01004000, 0x00004004,
173   },
174   {
175     0x20800080, 0x20820000, 0x00020080, 0x00000000,
176     0x20020000, 0x00800080, 0x20800000, 0x20820080,
177     0x00000080, 0x20000000, 0x00820000, 0x00020080,
178     0x00820080, 0x20020080, 0x20000080, 0x20800000,
179     0x00020000, 0x00820080, 0x00800080, 0x20020000,
180     0x20820080, 0x20000080, 0x00000000, 0x00820000,
181     0x20000000, 0x00800000, 0x20020080, 0x20800080,
182     0x00800000, 0x00020000, 0x20820000, 0x00000080,
183     0x00800000, 0x00020000, 0x20000080, 0x20820080,
184     0x00020080, 0x20000000, 0x00000000, 0x00820000,
185     0x20800080, 0x20020080, 0x20020000, 0x00800080,
186     0x20820000, 0x00000080, 0x00800080, 0x20020000,
187     0x20820080, 0x00800000, 0x20800000, 0x20000080,
188     0x00820000, 0x00020080, 0x20020080, 0x20800000,
189     0x00000080, 0x20820000, 0x00820080, 0x00000000,
190     0x20000000, 0x20800080, 0x00020000, 0x00820080,
191   }
192 };
193
194 __constant u32 c_skb[8][64] =
195 {
196   {
197     0x00000000, 0x00000010, 0x20000000, 0x20000010,
198     0x00010000, 0x00010010, 0x20010000, 0x20010010,
199     0x00000800, 0x00000810, 0x20000800, 0x20000810,
200     0x00010800, 0x00010810, 0x20010800, 0x20010810,
201     0x00000020, 0x00000030, 0x20000020, 0x20000030,
202     0x00010020, 0x00010030, 0x20010020, 0x20010030,
203     0x00000820, 0x00000830, 0x20000820, 0x20000830,
204     0x00010820, 0x00010830, 0x20010820, 0x20010830,
205     0x00080000, 0x00080010, 0x20080000, 0x20080010,
206     0x00090000, 0x00090010, 0x20090000, 0x20090010,
207     0x00080800, 0x00080810, 0x20080800, 0x20080810,
208     0x00090800, 0x00090810, 0x20090800, 0x20090810,
209     0x00080020, 0x00080030, 0x20080020, 0x20080030,
210     0x00090020, 0x00090030, 0x20090020, 0x20090030,
211     0x00080820, 0x00080830, 0x20080820, 0x20080830,
212     0x00090820, 0x00090830, 0x20090820, 0x20090830,
213   },
214   {
215     0x00000000, 0x02000000, 0x00002000, 0x02002000,
216     0x00200000, 0x02200000, 0x00202000, 0x02202000,
217     0x00000004, 0x02000004, 0x00002004, 0x02002004,
218     0x00200004, 0x02200004, 0x00202004, 0x02202004,
219     0x00000400, 0x02000400, 0x00002400, 0x02002400,
220     0x00200400, 0x02200400, 0x00202400, 0x02202400,
221     0x00000404, 0x02000404, 0x00002404, 0x02002404,
222     0x00200404, 0x02200404, 0x00202404, 0x02202404,
223     0x10000000, 0x12000000, 0x10002000, 0x12002000,
224     0x10200000, 0x12200000, 0x10202000, 0x12202000,
225     0x10000004, 0x12000004, 0x10002004, 0x12002004,
226     0x10200004, 0x12200004, 0x10202004, 0x12202004,
227     0x10000400, 0x12000400, 0x10002400, 0x12002400,
228     0x10200400, 0x12200400, 0x10202400, 0x12202400,
229     0x10000404, 0x12000404, 0x10002404, 0x12002404,
230     0x10200404, 0x12200404, 0x10202404, 0x12202404,
231   },
232   {
233     0x00000000, 0x00000001, 0x00040000, 0x00040001,
234     0x01000000, 0x01000001, 0x01040000, 0x01040001,
235     0x00000002, 0x00000003, 0x00040002, 0x00040003,
236     0x01000002, 0x01000003, 0x01040002, 0x01040003,
237     0x00000200, 0x00000201, 0x00040200, 0x00040201,
238     0x01000200, 0x01000201, 0x01040200, 0x01040201,
239     0x00000202, 0x00000203, 0x00040202, 0x00040203,
240     0x01000202, 0x01000203, 0x01040202, 0x01040203,
241     0x08000000, 0x08000001, 0x08040000, 0x08040001,
242     0x09000000, 0x09000001, 0x09040000, 0x09040001,
243     0x08000002, 0x08000003, 0x08040002, 0x08040003,
244     0x09000002, 0x09000003, 0x09040002, 0x09040003,
245     0x08000200, 0x08000201, 0x08040200, 0x08040201,
246     0x09000200, 0x09000201, 0x09040200, 0x09040201,
247     0x08000202, 0x08000203, 0x08040202, 0x08040203,
248     0x09000202, 0x09000203, 0x09040202, 0x09040203,
249   },
250   {
251     0x00000000, 0x00100000, 0x00000100, 0x00100100,
252     0x00000008, 0x00100008, 0x00000108, 0x00100108,
253     0x00001000, 0x00101000, 0x00001100, 0x00101100,
254     0x00001008, 0x00101008, 0x00001108, 0x00101108,
255     0x04000000, 0x04100000, 0x04000100, 0x04100100,
256     0x04000008, 0x04100008, 0x04000108, 0x04100108,
257     0x04001000, 0x04101000, 0x04001100, 0x04101100,
258     0x04001008, 0x04101008, 0x04001108, 0x04101108,
259     0x00020000, 0x00120000, 0x00020100, 0x00120100,
260     0x00020008, 0x00120008, 0x00020108, 0x00120108,
261     0x00021000, 0x00121000, 0x00021100, 0x00121100,
262     0x00021008, 0x00121008, 0x00021108, 0x00121108,
263     0x04020000, 0x04120000, 0x04020100, 0x04120100,
264     0x04020008, 0x04120008, 0x04020108, 0x04120108,
265     0x04021000, 0x04121000, 0x04021100, 0x04121100,
266     0x04021008, 0x04121008, 0x04021108, 0x04121108,
267   },
268   {
269     0x00000000, 0x10000000, 0x00010000, 0x10010000,
270     0x00000004, 0x10000004, 0x00010004, 0x10010004,
271     0x20000000, 0x30000000, 0x20010000, 0x30010000,
272     0x20000004, 0x30000004, 0x20010004, 0x30010004,
273     0x00100000, 0x10100000, 0x00110000, 0x10110000,
274     0x00100004, 0x10100004, 0x00110004, 0x10110004,
275     0x20100000, 0x30100000, 0x20110000, 0x30110000,
276     0x20100004, 0x30100004, 0x20110004, 0x30110004,
277     0x00001000, 0x10001000, 0x00011000, 0x10011000,
278     0x00001004, 0x10001004, 0x00011004, 0x10011004,
279     0x20001000, 0x30001000, 0x20011000, 0x30011000,
280     0x20001004, 0x30001004, 0x20011004, 0x30011004,
281     0x00101000, 0x10101000, 0x00111000, 0x10111000,
282     0x00101004, 0x10101004, 0x00111004, 0x10111004,
283     0x20101000, 0x30101000, 0x20111000, 0x30111000,
284     0x20101004, 0x30101004, 0x20111004, 0x30111004,
285   },
286   {
287     0x00000000, 0x08000000, 0x00000008, 0x08000008,
288     0x00000400, 0x08000400, 0x00000408, 0x08000408,
289     0x00020000, 0x08020000, 0x00020008, 0x08020008,
290     0x00020400, 0x08020400, 0x00020408, 0x08020408,
291     0x00000001, 0x08000001, 0x00000009, 0x08000009,
292     0x00000401, 0x08000401, 0x00000409, 0x08000409,
293     0x00020001, 0x08020001, 0x00020009, 0x08020009,
294     0x00020401, 0x08020401, 0x00020409, 0x08020409,
295     0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
296     0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
297     0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
298     0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
299     0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
300     0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
301     0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
302     0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
303   },
304   {
305     0x00000000, 0x00000100, 0x00080000, 0x00080100,
306     0x01000000, 0x01000100, 0x01080000, 0x01080100,
307     0x00000010, 0x00000110, 0x00080010, 0x00080110,
308     0x01000010, 0x01000110, 0x01080010, 0x01080110,
309     0x00200000, 0x00200100, 0x00280000, 0x00280100,
310     0x01200000, 0x01200100, 0x01280000, 0x01280100,
311     0x00200010, 0x00200110, 0x00280010, 0x00280110,
312     0x01200010, 0x01200110, 0x01280010, 0x01280110,
313     0x00000200, 0x00000300, 0x00080200, 0x00080300,
314     0x01000200, 0x01000300, 0x01080200, 0x01080300,
315     0x00000210, 0x00000310, 0x00080210, 0x00080310,
316     0x01000210, 0x01000310, 0x01080210, 0x01080310,
317     0x00200200, 0x00200300, 0x00280200, 0x00280300,
318     0x01200200, 0x01200300, 0x01280200, 0x01280300,
319     0x00200210, 0x00200310, 0x00280210, 0x00280310,
320     0x01200210, 0x01200310, 0x01280210, 0x01280310,
321   },
322   {
323     0x00000000, 0x04000000, 0x00040000, 0x04040000,
324     0x00000002, 0x04000002, 0x00040002, 0x04040002,
325     0x00002000, 0x04002000, 0x00042000, 0x04042000,
326     0x00002002, 0x04002002, 0x00042002, 0x04042002,
327     0x00000020, 0x04000020, 0x00040020, 0x04040020,
328     0x00000022, 0x04000022, 0x00040022, 0x04040022,
329     0x00002020, 0x04002020, 0x00042020, 0x04042020,
330     0x00002022, 0x04002022, 0x00042022, 0x04042022,
331     0x00000800, 0x04000800, 0x00040800, 0x04040800,
332     0x00000802, 0x04000802, 0x00040802, 0x04040802,
333     0x00002800, 0x04002800, 0x00042800, 0x04042800,
334     0x00002802, 0x04002802, 0x00042802, 0x04042802,
335     0x00000820, 0x04000820, 0x00040820, 0x04040820,
336     0x00000822, 0x04000822, 0x00040822, 0x04040822,
337     0x00002820, 0x04002820, 0x00042820, 0x04042820,
338     0x00002822, 0x04002822, 0x00042822, 0x04042822
339   }
340 };
341
342 #if   VECT_SIZE == 1
343 #define BOX(i,n,S) (S)[(n)][(i)]
344 #elif VECT_SIZE == 2
345 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
346 #elif VECT_SIZE == 4
347 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
348 #elif VECT_SIZE == 8
349 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7])
350 #elif VECT_SIZE == 16
351 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3], (S)[(n)][(i).s4], (S)[(n)][(i).s5], (S)[(n)][(i).s6], (S)[(n)][(i).s7], (S)[(n)][(i).s8], (S)[(n)][(i).s9], (S)[(n)][(i).sa], (S)[(n)][(i).sb], (S)[(n)][(i).sc], (S)[(n)][(i).sd], (S)[(n)][(i).se], (S)[(n)][(i).sf])
352 #endif
353
354 static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64])
355 {
356   u32x r = data[0];
357   u32x l = data[1];
358
359   #pragma unroll 16
360   for (u32 i = 0; i < 16; i += 2)
361   {
362     u32x u;
363     u32x t;
364
365     u = Kc[i + 0] ^ rotl32 (r, 30u);
366     t = Kd[i + 0] ^ rotl32 (r, 26u);
367
368     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
369        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
370        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
371        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
372        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
373        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
374        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
375        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
376
377     u = Kc[i + 1] ^ rotl32 (l, 30u);
378     t = Kd[i + 1] ^ rotl32 (l, 26u);
379
380     r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
381        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
382        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
383        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
384        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
385        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
386        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
387        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
388   }
389
390   iv[0] = l;
391   iv[1] = r;
392 }
393
394 static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64])
395 {
396   u32x tt;
397
398   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
399   HPERM_OP (c,    tt, 2, 0xcccc0000);
400   HPERM_OP (d,    tt, 2, 0xcccc0000);
401   PERM_OP  (d, c, tt, 1, 0x55555555);
402   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
403   PERM_OP  (d, c, tt, 1, 0x55555555);
404
405   d = ((d & 0x000000ff) << 16)
406     | ((d & 0x0000ff00) <<  0)
407     | ((d & 0x00ff0000) >> 16)
408     | ((c & 0xf0000000) >>  4);
409
410   c = c & 0x0fffffff;
411
412   #pragma unroll 16
413   for (u32 i = 0; i < 16; i++)
414   {
415     if ((i < 2) || (i == 8) || (i == 15))
416     {
417       c = ((c >> 1) | (c << 27));
418       d = ((d >> 1) | (d << 27));
419     }
420     else
421     {
422       c = ((c >> 2) | (c << 26));
423       d = ((d >> 2) | (d << 26));
424     }
425
426     c = c & 0x0fffffff;
427     d = d & 0x0fffffff;
428
429     const u32x c00 = (c >>  0) & 0x0000003f;
430     const u32x c06 = (c >>  6) & 0x00383003;
431     const u32x c07 = (c >>  7) & 0x0000003c;
432     const u32x c13 = (c >> 13) & 0x0000060f;
433     const u32x c20 = (c >> 20) & 0x00000001;
434
435     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
436            | BOX (((c06 >>  0) & 0xff)
437                  |((c07 >>  0) & 0xff), 1, s_skb)
438            | BOX (((c13 >>  0) & 0xff)
439                  |((c06 >>  8) & 0xff), 2, s_skb)
440            | BOX (((c20 >>  0) & 0xff)
441                  |((c13 >>  8) & 0xff)
442                  |((c06 >> 16) & 0xff), 3, s_skb);
443
444     const u32x d00 = (d >>  0) & 0x00003c3f;
445     const u32x d07 = (d >>  7) & 0x00003f03;
446     const u32x d21 = (d >> 21) & 0x0000000f;
447     const u32x d22 = (d >> 22) & 0x00000030;
448
449     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
450            | BOX (((d07 >>  0) & 0xff)
451                  |((d00 >>  8) & 0xff), 5, s_skb)
452            | BOX (((d07 >>  8) & 0xff), 6, s_skb)
453            | BOX (((d21 >>  0) & 0xff)
454                  |((d22 >>  0) & 0xff), 7, s_skb);
455
456     Kc[i] = ((t << 16) | (s & 0x0000ffff));
457     Kd[i] = ((s >> 16) | (t & 0xffff0000));
458   }
459 }
460
461 static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2])
462 {
463   u32x t[8];
464
465   t[0] = (w0 >>  0) & 0xff;
466   t[1] = (w0 >>  8) & 0xff;
467   t[2] = (w0 >> 16) & 0xff;
468   t[3] = (w0 >> 24) & 0xff;
469   t[4] = (w1 >>  0) & 0xff;
470   t[5] = (w1 >>  8) & 0xff;
471   t[6] = (w1 >> 16) & 0xff;
472   t[7] = (w1 >> 24) & 0xff;
473
474   u32x k[8];
475
476   k[0] =               (t[0] >> 0);
477   k[1] = (t[0] << 7) | (t[1] >> 1);
478   k[2] = (t[1] << 6) | (t[2] >> 2);
479   k[3] = (t[2] << 5) | (t[3] >> 3);
480   k[4] = (t[3] << 4) | (t[4] >> 4);
481   k[5] = (t[4] << 3) | (t[5] >> 5);
482   k[6] = (t[5] << 2) | (t[6] >> 6);
483   k[7] = (t[6] << 1);
484
485   out[0] = ((k[0] & 0xff) <<  0)
486          | ((k[1] & 0xff) <<  8)
487          | ((k[2] & 0xff) << 16)
488          | ((k[3] & 0xff) << 24);
489
490   out[1] = ((k[4] & 0xff) <<  0)
491          | ((k[5] & 0xff) <<  8)
492          | ((k[6] & 0xff) << 16)
493          | ((k[7] & 0xff) << 24);
494 }
495
496 static void m05500m (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
497 {
498   /**
499    * modifier
500    */
501
502   const u32 gid = get_global_id (0);
503   const u32 lid = get_local_id (0);
504
505   /**
506    * salt
507    */
508
509   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
510   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
511   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
512
513   /**
514    * loop
515    */
516
517   u32 w0l = w[0];
518
519   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
520   {
521     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
522
523     const u32x w0 = w0l | w0r;
524
525     u32x a = MD4M_A;
526     u32x b = MD4M_B;
527     u32x c = MD4M_C;
528     u32x d = MD4M_D;
529
530     #define w0_t w0
531     #define w1_t w[ 1]
532     #define w2_t w[ 2]
533     #define w3_t w[ 3]
534     #define w4_t w[ 4]
535     #define w5_t w[ 5]
536     #define w6_t w[ 6]
537     #define w7_t w[ 7]
538     #define w8_t w[ 8]
539     #define w9_t w[ 9]
540     #define wa_t w[10]
541     #define wb_t w[11]
542     #define wc_t w[12]
543     #define wd_t w[13]
544     #define we_t w[14]
545     #define wf_t w[15]
546
547     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
548     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
549     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
550     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
551     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
552     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
553     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
554     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
555     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
556     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
557     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
558     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
559     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
560     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
561     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
562     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
563
564     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
565     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
566     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
567     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
568     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
569     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
570     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
571     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
572     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
573     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
574     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
575     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
576     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
577     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
578     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
579     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
580
581     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
582     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
583     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
584     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
585     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
586     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
587     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
588     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
589     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
590     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
591     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
592     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
593     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
594     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
595
596     if (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) continue;
597
598     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
599     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
600
601     a += MD4M_A;
602     b += MD4M_B;
603     c += MD4M_C;
604     d += MD4M_D;
605
606     /**
607      * DES1
608      */
609
610     u32x key[2];
611
612     transform_netntlmv1_key (a, b, key);
613
614     u32x Kc[16];
615     u32x Kd[16];
616
617     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
618
619     u32x data[2];
620
621     data[0] = s0;
622     data[1] = s1;
623
624     u32x iv1[2];
625
626     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
627
628     /**
629      * DES2
630      */
631
632     const u32x bc = (b >> 24) | (c << 8);
633     const u32x cd = (c >> 24) | (d << 8);
634
635     transform_netntlmv1_key (bc, cd, key);
636
637     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
638
639     u32x iv2[2];
640
641     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
642
643     /**
644      * compare
645      */
646
647     COMPARE_M_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]);
648   }
649 }
650
651 static void m05500s (__local u32 (*s_SPtrans)[64], __local u32 (*s_skb)[64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
652 {
653   /**
654    * modifier
655    */
656
657   const u32 gid = get_global_id (0);
658   const u32 lid = get_local_id (0);
659
660   /**
661    * salt
662    */
663
664   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
665   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
666   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
667
668   /**
669    * digest
670    */
671
672   const u32 search[4] =
673   {
674     digests_buf[digests_offset].digest_buf[DGST_R0],
675     digests_buf[digests_offset].digest_buf[DGST_R1],
676     digests_buf[digests_offset].digest_buf[DGST_R2],
677     digests_buf[digests_offset].digest_buf[DGST_R3]
678   };
679
680   /**
681    * loop
682    */
683
684   u32 w0l = w[0];
685
686   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
687   {
688     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
689
690     const u32x w0 = w0l | w0r;
691
692     u32x a = MD4M_A;
693     u32x b = MD4M_B;
694     u32x c = MD4M_C;
695     u32x d = MD4M_D;
696
697     #define w0_t w0
698     #define w1_t w[ 1]
699     #define w2_t w[ 2]
700     #define w3_t w[ 3]
701     #define w4_t w[ 4]
702     #define w5_t w[ 5]
703     #define w6_t w[ 6]
704     #define w7_t w[ 7]
705     #define w8_t w[ 8]
706     #define w9_t w[ 9]
707     #define wa_t w[10]
708     #define wb_t w[11]
709     #define wc_t w[12]
710     #define wd_t w[13]
711     #define we_t w[14]
712     #define wf_t w[15]
713
714     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
715     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
716     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
717     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
718     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
719     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
720     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
721     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
722     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
723     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
724     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
725     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
726     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
727     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
728     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
729     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
730
731     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
732     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
733     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
734     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
735     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
736     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
737     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
738     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
739     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
740     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
741     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
742     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
743     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
744     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
745     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
746     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
747
748     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
749     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
750     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
751     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
752     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
753     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
754     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
755     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
756     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
757     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
758     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
759     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
760     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
761     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
762
763     if (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) continue;
764
765     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
766     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
767
768     a += MD4M_A;
769     b += MD4M_B;
770     c += MD4M_C;
771     d += MD4M_D;
772
773     /**
774      * DES1
775      */
776
777     u32x key[2];
778
779     transform_netntlmv1_key (a, b, key);
780
781     u32x Kc[16];
782     u32x Kd[16];
783
784     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
785
786     u32x data[2];
787
788     data[0] = s0;
789     data[1] = s1;
790
791     u32x iv1[2];
792
793     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
794
795     /**
796      * DES2
797      */
798
799     /*
800     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
801
802     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
803
804     u32x iv2[2];
805
806     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
807     */
808
809     u32x iv2[2];
810
811     iv2[0] = search[2];
812     iv2[1] = search[3];
813
814     /**
815      * compare
816      */
817
818     COMPARE_S_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]);
819   }
820 }
821
822 __kernel void m05500_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
823 {
824   /**
825    * modifier
826    */
827
828   const u32 gid = get_global_id (0);
829   const u32 lid = get_local_id (0);
830   const u32 lsz = get_local_size (0);
831
832   /**
833    * sbox, kbox
834    */
835
836   __local u32 s_SPtrans[8][64];
837   __local u32 s_skb[8][64];
838
839   for (u32 i = lid; i < 64; i += lsz)
840   {
841     s_SPtrans[0][i] = c_SPtrans[0][i];
842     s_SPtrans[1][i] = c_SPtrans[1][i];
843     s_SPtrans[2][i] = c_SPtrans[2][i];
844     s_SPtrans[3][i] = c_SPtrans[3][i];
845     s_SPtrans[4][i] = c_SPtrans[4][i];
846     s_SPtrans[5][i] = c_SPtrans[5][i];
847     s_SPtrans[6][i] = c_SPtrans[6][i];
848     s_SPtrans[7][i] = c_SPtrans[7][i];
849
850     s_skb[0][i] = c_skb[0][i];
851     s_skb[1][i] = c_skb[1][i];
852     s_skb[2][i] = c_skb[2][i];
853     s_skb[3][i] = c_skb[3][i];
854     s_skb[4][i] = c_skb[4][i];
855     s_skb[5][i] = c_skb[5][i];
856     s_skb[6][i] = c_skb[6][i];
857     s_skb[7][i] = c_skb[7][i];
858   }
859
860   barrier (CLK_LOCAL_MEM_FENCE);
861
862   if (gid >= gid_max) return;
863
864   /**
865    * base
866    */
867
868   u32 w[16];
869
870   w[ 0] = pws[gid].i[ 0];
871   w[ 1] = pws[gid].i[ 1];
872   w[ 2] = pws[gid].i[ 2];
873   w[ 3] = pws[gid].i[ 3];
874   w[ 4] = 0;
875   w[ 5] = 0;
876   w[ 6] = 0;
877   w[ 7] = 0;
878   w[ 8] = 0;
879   w[ 9] = 0;
880   w[10] = 0;
881   w[11] = 0;
882   w[12] = 0;
883   w[13] = 0;
884   w[14] = pws[gid].i[14];
885   w[15] = 0;
886
887   const u32 pw_len = pws[gid].pw_len;
888
889   /**
890    * main
891    */
892
893   m05500m (s_SPtrans, s_skb, w, pw_len, 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);
894 }
895
896 __kernel void m05500_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
897 {
898   /**
899    * modifier
900    */
901
902   const u32 gid = get_global_id (0);
903   const u32 lid = get_local_id (0);
904   const u32 lsz = get_local_size (0);
905
906   /**
907    * sbox, kbox
908    */
909
910   __local u32 s_SPtrans[8][64];
911   __local u32 s_skb[8][64];
912
913   for (u32 i = lid; i < 64; i += lsz)
914   {
915     s_SPtrans[0][i] = c_SPtrans[0][i];
916     s_SPtrans[1][i] = c_SPtrans[1][i];
917     s_SPtrans[2][i] = c_SPtrans[2][i];
918     s_SPtrans[3][i] = c_SPtrans[3][i];
919     s_SPtrans[4][i] = c_SPtrans[4][i];
920     s_SPtrans[5][i] = c_SPtrans[5][i];
921     s_SPtrans[6][i] = c_SPtrans[6][i];
922     s_SPtrans[7][i] = c_SPtrans[7][i];
923
924     s_skb[0][i] = c_skb[0][i];
925     s_skb[1][i] = c_skb[1][i];
926     s_skb[2][i] = c_skb[2][i];
927     s_skb[3][i] = c_skb[3][i];
928     s_skb[4][i] = c_skb[4][i];
929     s_skb[5][i] = c_skb[5][i];
930     s_skb[6][i] = c_skb[6][i];
931     s_skb[7][i] = c_skb[7][i];
932   }
933
934   barrier (CLK_LOCAL_MEM_FENCE);
935
936   if (gid >= gid_max) return;
937
938   /**
939    * base
940    */
941
942   u32 w[16];
943
944   w[ 0] = pws[gid].i[ 0];
945   w[ 1] = pws[gid].i[ 1];
946   w[ 2] = pws[gid].i[ 2];
947   w[ 3] = pws[gid].i[ 3];
948   w[ 4] = pws[gid].i[ 4];
949   w[ 5] = pws[gid].i[ 5];
950   w[ 6] = pws[gid].i[ 6];
951   w[ 7] = pws[gid].i[ 7];
952   w[ 8] = 0;
953   w[ 9] = 0;
954   w[10] = 0;
955   w[11] = 0;
956   w[12] = 0;
957   w[13] = 0;
958   w[14] = pws[gid].i[14];
959   w[15] = 0;
960
961   const u32 pw_len = pws[gid].pw_len;
962
963   /**
964    * main
965    */
966
967   m05500m (s_SPtrans, s_skb, w, pw_len, 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);
968 }
969
970 __kernel void m05500_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
971 {
972 }
973
974 __kernel void m05500_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
975 {
976   /**
977    * modifier
978    */
979
980   const u32 gid = get_global_id (0);
981   const u32 lid = get_local_id (0);
982   const u32 lsz = get_local_size (0);
983
984   /**
985    * sbox, kbox
986    */
987
988   __local u32 s_SPtrans[8][64];
989   __local u32 s_skb[8][64];
990
991   for (u32 i = lid; i < 64; i += lsz)
992   {
993     s_SPtrans[0][i] = c_SPtrans[0][i];
994     s_SPtrans[1][i] = c_SPtrans[1][i];
995     s_SPtrans[2][i] = c_SPtrans[2][i];
996     s_SPtrans[3][i] = c_SPtrans[3][i];
997     s_SPtrans[4][i] = c_SPtrans[4][i];
998     s_SPtrans[5][i] = c_SPtrans[5][i];
999     s_SPtrans[6][i] = c_SPtrans[6][i];
1000     s_SPtrans[7][i] = c_SPtrans[7][i];
1001
1002     s_skb[0][i] = c_skb[0][i];
1003     s_skb[1][i] = c_skb[1][i];
1004     s_skb[2][i] = c_skb[2][i];
1005     s_skb[3][i] = c_skb[3][i];
1006     s_skb[4][i] = c_skb[4][i];
1007     s_skb[5][i] = c_skb[5][i];
1008     s_skb[6][i] = c_skb[6][i];
1009     s_skb[7][i] = c_skb[7][i];
1010   }
1011
1012   barrier (CLK_LOCAL_MEM_FENCE);
1013
1014   if (gid >= gid_max) return;
1015
1016   /**
1017    * base
1018    */
1019
1020   u32 w[16];
1021
1022   w[ 0] = pws[gid].i[ 0];
1023   w[ 1] = pws[gid].i[ 1];
1024   w[ 2] = pws[gid].i[ 2];
1025   w[ 3] = pws[gid].i[ 3];
1026   w[ 4] = 0;
1027   w[ 5] = 0;
1028   w[ 6] = 0;
1029   w[ 7] = 0;
1030   w[ 8] = 0;
1031   w[ 9] = 0;
1032   w[10] = 0;
1033   w[11] = 0;
1034   w[12] = 0;
1035   w[13] = 0;
1036   w[14] = pws[gid].i[14];
1037   w[15] = 0;
1038
1039   const u32 pw_len = pws[gid].pw_len;
1040
1041   /**
1042    * main
1043    */
1044
1045   m05500s (s_SPtrans, s_skb, w, pw_len, 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);
1046 }
1047
1048 __kernel void m05500_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
1049 {
1050   /**
1051    * modifier
1052    */
1053
1054   const u32 gid = get_global_id (0);
1055   const u32 lid = get_local_id (0);
1056   const u32 lsz = get_local_size (0);
1057
1058   /**
1059    * sbox, kbox
1060    */
1061
1062   __local u32 s_SPtrans[8][64];
1063   __local u32 s_skb[8][64];
1064
1065   for (u32 i = lid; i < 64; i += lsz)
1066   {
1067     s_SPtrans[0][i] = c_SPtrans[0][i];
1068     s_SPtrans[1][i] = c_SPtrans[1][i];
1069     s_SPtrans[2][i] = c_SPtrans[2][i];
1070     s_SPtrans[3][i] = c_SPtrans[3][i];
1071     s_SPtrans[4][i] = c_SPtrans[4][i];
1072     s_SPtrans[5][i] = c_SPtrans[5][i];
1073     s_SPtrans[6][i] = c_SPtrans[6][i];
1074     s_SPtrans[7][i] = c_SPtrans[7][i];
1075
1076     s_skb[0][i] = c_skb[0][i];
1077     s_skb[1][i] = c_skb[1][i];
1078     s_skb[2][i] = c_skb[2][i];
1079     s_skb[3][i] = c_skb[3][i];
1080     s_skb[4][i] = c_skb[4][i];
1081     s_skb[5][i] = c_skb[5][i];
1082     s_skb[6][i] = c_skb[6][i];
1083     s_skb[7][i] = c_skb[7][i];
1084   }
1085
1086   barrier (CLK_LOCAL_MEM_FENCE);
1087
1088   if (gid >= gid_max) return;
1089
1090   /**
1091    * base
1092    */
1093
1094   u32 w[16];
1095
1096   w[ 0] = pws[gid].i[ 0];
1097   w[ 1] = pws[gid].i[ 1];
1098   w[ 2] = pws[gid].i[ 2];
1099   w[ 3] = pws[gid].i[ 3];
1100   w[ 4] = pws[gid].i[ 4];
1101   w[ 5] = pws[gid].i[ 5];
1102   w[ 6] = pws[gid].i[ 6];
1103   w[ 7] = pws[gid].i[ 7];
1104   w[ 8] = 0;
1105   w[ 9] = 0;
1106   w[10] = 0;
1107   w[11] = 0;
1108   w[12] = 0;
1109   w[13] = 0;
1110   w[14] = pws[gid].i[14];
1111   w[15] = 0;
1112
1113   const u32 pw_len = pws[gid].pw_len;
1114
1115   /**
1116    * main
1117    */
1118
1119   m05500s (s_SPtrans, s_skb, w, pw_len, 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);
1120 }
1121
1122 __kernel void m05500_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
1123 {
1124 }