d77bb3b653008d8fab0877e046a912eb1db79395
[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 "inc_hash_constants.h"
14 #include "inc_vendor.cl"
15
16 #define DGST_R0 0
17 #define DGST_R1 1
18 #define DGST_R2 2
19 #define DGST_R3 3
20
21 #include "inc_hash_functions.cl"
22 #include "inc_types.cl"
23 #include "inc_common.cl"
24 #include "inc_simd.cl"
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 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   #ifdef _unroll
360   #pragma unroll
361   #endif
362   for (u32 i = 0; i < 16; i += 2)
363   {
364     u32x u;
365     u32x t;
366
367     u = Kc[i + 0] ^ rotl32 (r, 30u);
368     t = Kd[i + 0] ^ rotl32 (r, 26u);
369
370     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
371        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
372        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
373        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
374        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
375        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
376        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
377        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
378
379     u = Kc[i + 1] ^ rotl32 (l, 30u);
380     t = Kd[i + 1] ^ rotl32 (l, 26u);
381
382     r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
383        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
384        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
385        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
386        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
387        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
388        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
389        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
390   }
391
392   iv[0] = l;
393   iv[1] = r;
394 }
395
396 void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64])
397 {
398   u32x tt;
399
400   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
401   HPERM_OP (c,    tt, 2, 0xcccc0000);
402   HPERM_OP (d,    tt, 2, 0xcccc0000);
403   PERM_OP  (d, c, tt, 1, 0x55555555);
404   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
405   PERM_OP  (d, c, tt, 1, 0x55555555);
406
407   d = ((d & 0x000000ff) << 16)
408     | ((d & 0x0000ff00) <<  0)
409     | ((d & 0x00ff0000) >> 16)
410     | ((c & 0xf0000000) >>  4);
411
412   c = c & 0x0fffffff;
413
414   #ifdef _unroll
415   #pragma unroll
416   #endif
417   for (u32 i = 0; i < 16; i++)
418   {
419     if ((i < 2) || (i == 8) || (i == 15))
420     {
421       c = ((c >> 1) | (c << 27));
422       d = ((d >> 1) | (d << 27));
423     }
424     else
425     {
426       c = ((c >> 2) | (c << 26));
427       d = ((d >> 2) | (d << 26));
428     }
429
430     c = c & 0x0fffffff;
431     d = d & 0x0fffffff;
432
433     const u32x c00 = (c >>  0) & 0x0000003f;
434     const u32x c06 = (c >>  6) & 0x00383003;
435     const u32x c07 = (c >>  7) & 0x0000003c;
436     const u32x c13 = (c >> 13) & 0x0000060f;
437     const u32x c20 = (c >> 20) & 0x00000001;
438
439     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
440            | BOX (((c06 >>  0) & 0xff)
441                  |((c07 >>  0) & 0xff), 1, s_skb)
442            | BOX (((c13 >>  0) & 0xff)
443                  |((c06 >>  8) & 0xff), 2, s_skb)
444            | BOX (((c20 >>  0) & 0xff)
445                  |((c13 >>  8) & 0xff)
446                  |((c06 >> 16) & 0xff), 3, s_skb);
447
448     const u32x d00 = (d >>  0) & 0x00003c3f;
449     const u32x d07 = (d >>  7) & 0x00003f03;
450     const u32x d21 = (d >> 21) & 0x0000000f;
451     const u32x d22 = (d >> 22) & 0x00000030;
452
453     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
454            | BOX (((d07 >>  0) & 0xff)
455                  |((d00 >>  8) & 0xff), 5, s_skb)
456            | BOX (((d07 >>  8) & 0xff), 6, s_skb)
457            | BOX (((d21 >>  0) & 0xff)
458                  |((d22 >>  0) & 0xff), 7, s_skb);
459
460     Kc[i] = ((t << 16) | (s & 0x0000ffff));
461     Kd[i] = ((s >> 16) | (t & 0xffff0000));
462   }
463 }
464
465 void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2])
466 {
467   u32x t[8];
468
469   t[0] = (w0 >>  0) & 0xff;
470   t[1] = (w0 >>  8) & 0xff;
471   t[2] = (w0 >> 16) & 0xff;
472   t[3] = (w0 >> 24) & 0xff;
473   t[4] = (w1 >>  0) & 0xff;
474   t[5] = (w1 >>  8) & 0xff;
475   t[6] = (w1 >> 16) & 0xff;
476   t[7] = (w1 >> 24) & 0xff;
477
478   u32x k[8];
479
480   k[0] =               (t[0] >> 0);
481   k[1] = (t[0] << 7) | (t[1] >> 1);
482   k[2] = (t[1] << 6) | (t[2] >> 2);
483   k[3] = (t[2] << 5) | (t[3] >> 3);
484   k[4] = (t[3] << 4) | (t[4] >> 4);
485   k[5] = (t[4] << 3) | (t[5] >> 5);
486   k[6] = (t[5] << 2) | (t[6] >> 6);
487   k[7] = (t[6] << 1);
488
489   out[0] = ((k[0] & 0xff) <<  0)
490          | ((k[1] & 0xff) <<  8)
491          | ((k[2] & 0xff) << 16)
492          | ((k[3] & 0xff) << 24);
493
494   out[1] = ((k[4] & 0xff) <<  0)
495          | ((k[5] & 0xff) <<  8)
496          | ((k[6] & 0xff) << 16)
497          | ((k[7] & 0xff) << 24);
498 }
499
500 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 il_cnt, const u32 digests_cnt, const u32 digests_offset)
501 {
502   /**
503    * modifier
504    */
505
506   const u32 gid = get_global_id (0);
507   const u32 lid = get_local_id (0);
508
509   /**
510    * salt
511    */
512
513   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
514   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
515   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
516
517   /**
518    * loop
519    */
520
521   u32 w0l = w[0];
522
523   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
524   {
525     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
526
527     const u32x w0 = w0l | w0r;
528
529     u32x w0_t[4];
530     u32x w1_t[4];
531     u32x w2_t[4];
532     u32x w3_t[4];
533
534     w0_t[0] = w0;
535     w0_t[1] = w[ 1];
536     w0_t[2] = w[ 2];
537     w0_t[3] = w[ 3];
538     w1_t[0] = w[ 4];
539     w1_t[1] = w[ 5];
540     w1_t[2] = w[ 6];
541     w1_t[3] = w[ 7];
542     w2_t[0] = w[ 8];
543     w2_t[1] = w[ 9];
544     w2_t[2] = w[10];
545     w2_t[3] = w[11];
546     w3_t[0] = w[12];
547     w3_t[1] = w[13];
548     w3_t[2] = w[14];
549     w3_t[3] = w[15];
550
551     u32x a = MD4M_A;
552     u32x b = MD4M_B;
553     u32x c = MD4M_C;
554     u32x d = MD4M_D;
555
556     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
557     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
558     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
559     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
560     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
561     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
562     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
563     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
564     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
565     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
566     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
567     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
568     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
569     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
570     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
571     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
572
573     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
574     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
575     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
576     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
577     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
578     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
579     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
580     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
581     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
582     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
583     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
584     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
585     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
586     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
587     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
588     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
589
590     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
591     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
592     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
593     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
594     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
595     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
596     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
597     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
598     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
599     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
600     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
601     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
602     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
603     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
604
605     if (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) continue;
606
607     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
608     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
609
610     a += MD4M_A;
611     b += MD4M_B;
612     c += MD4M_C;
613     d += MD4M_D;
614
615     /**
616      * DES1
617      */
618
619     u32x key[2];
620
621     transform_netntlmv1_key (a, b, key);
622
623     u32x Kc[16];
624     u32x Kd[16];
625
626     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
627
628     u32x data[2];
629
630     data[0] = s0;
631     data[1] = s1;
632
633     u32x iv1[2];
634
635     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
636
637     /**
638      * DES2
639      */
640
641     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
642
643     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
644
645     u32x iv2[2];
646
647     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
648
649     /**
650      * compare
651      */
652
653     COMPARE_M_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]);
654   }
655 }
656
657 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 il_cnt, const u32 digests_cnt, const u32 digests_offset)
658 {
659   /**
660    * modifier
661    */
662
663   const u32 gid = get_global_id (0);
664   const u32 lid = get_local_id (0);
665
666   /**
667    * salt
668    */
669
670   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
671   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
672   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
673
674   /**
675    * digest
676    */
677
678   const u32 search[4] =
679   {
680     digests_buf[digests_offset].digest_buf[DGST_R0],
681     digests_buf[digests_offset].digest_buf[DGST_R1],
682     digests_buf[digests_offset].digest_buf[DGST_R2],
683     digests_buf[digests_offset].digest_buf[DGST_R3]
684   };
685
686   /**
687    * loop
688    */
689
690   u32 w0l = w[0];
691
692   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
693   {
694     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
695
696     const u32x w0 = w0l | w0r;
697
698     u32x w0_t[4];
699     u32x w1_t[4];
700     u32x w2_t[4];
701     u32x w3_t[4];
702
703     w0_t[0] = w0;
704     w0_t[1] = w[ 1];
705     w0_t[2] = w[ 2];
706     w0_t[3] = w[ 3];
707     w1_t[0] = w[ 4];
708     w1_t[1] = w[ 5];
709     w1_t[2] = w[ 6];
710     w1_t[3] = w[ 7];
711     w2_t[0] = w[ 8];
712     w2_t[1] = w[ 9];
713     w2_t[2] = w[10];
714     w2_t[3] = w[11];
715     w3_t[0] = w[12];
716     w3_t[1] = w[13];
717     w3_t[2] = w[14];
718     w3_t[3] = w[15];
719
720     u32x a = MD4M_A;
721     u32x b = MD4M_B;
722     u32x c = MD4M_C;
723     u32x d = MD4M_D;
724
725     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
726     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
727     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
728     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
729     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
730     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
731     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
732     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
733     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
734     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
735     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
736     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
737     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
738     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
739     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
740     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
741
742     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
743     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
744     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
745     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
746     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
747     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
748     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
749     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
750     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
751     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
752     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
753     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
754     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
755     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
756     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
757     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
758
759     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
760     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
761     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
762     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
763     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
764     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
765     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
766     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
767     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
768     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
769     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
770     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
771     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
772     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
773
774     if (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) continue;
775
776     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
777     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
778
779     a += MD4M_A;
780     b += MD4M_B;
781     c += MD4M_C;
782     d += MD4M_D;
783
784     /**
785      * DES1
786      */
787
788     u32x key[2];
789
790     transform_netntlmv1_key (a, b, key);
791
792     u32x Kc[16];
793     u32x Kd[16];
794
795     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
796
797     u32x data[2];
798
799     data[0] = s0;
800     data[1] = s1;
801
802     u32x iv1[2];
803
804     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
805
806     /**
807      * DES2
808      */
809
810     /*
811     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
812
813     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
814
815     u32x iv2[2];
816
817     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
818     */
819
820     u32x iv2[2];
821
822     iv2[0] = search[2];
823     iv2[1] = search[3];
824
825     /**
826      * compare
827      */
828
829     COMPARE_S_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]);
830   }
831 }
832
833 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
834 {
835   /**
836    * modifier
837    */
838
839   const u32 gid = get_global_id (0);
840   const u32 lid = get_local_id (0);
841   const u32 lsz = get_local_size (0);
842
843   /**
844    * sbox, kbox
845    */
846
847   __local u32 s_SPtrans[8][64];
848   __local u32 s_skb[8][64];
849
850   for (u32 i = lid; i < 64; i += lsz)
851   {
852     s_SPtrans[0][i] = c_SPtrans[0][i];
853     s_SPtrans[1][i] = c_SPtrans[1][i];
854     s_SPtrans[2][i] = c_SPtrans[2][i];
855     s_SPtrans[3][i] = c_SPtrans[3][i];
856     s_SPtrans[4][i] = c_SPtrans[4][i];
857     s_SPtrans[5][i] = c_SPtrans[5][i];
858     s_SPtrans[6][i] = c_SPtrans[6][i];
859     s_SPtrans[7][i] = c_SPtrans[7][i];
860
861     s_skb[0][i] = c_skb[0][i];
862     s_skb[1][i] = c_skb[1][i];
863     s_skb[2][i] = c_skb[2][i];
864     s_skb[3][i] = c_skb[3][i];
865     s_skb[4][i] = c_skb[4][i];
866     s_skb[5][i] = c_skb[5][i];
867     s_skb[6][i] = c_skb[6][i];
868     s_skb[7][i] = c_skb[7][i];
869   }
870
871   barrier (CLK_LOCAL_MEM_FENCE);
872
873   if (gid >= gid_max) return;
874
875   /**
876    * base
877    */
878
879   u32 w[16];
880
881   w[ 0] = pws[gid].i[ 0];
882   w[ 1] = pws[gid].i[ 1];
883   w[ 2] = pws[gid].i[ 2];
884   w[ 3] = pws[gid].i[ 3];
885   w[ 4] = 0;
886   w[ 5] = 0;
887   w[ 6] = 0;
888   w[ 7] = 0;
889   w[ 8] = 0;
890   w[ 9] = 0;
891   w[10] = 0;
892   w[11] = 0;
893   w[12] = 0;
894   w[13] = 0;
895   w[14] = pws[gid].i[14];
896   w[15] = 0;
897
898   const u32 pw_len = pws[gid].pw_len;
899
900   /**
901    * main
902    */
903
904   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, il_cnt, digests_cnt, digests_offset);
905 }
906
907 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
908 {
909   /**
910    * modifier
911    */
912
913   const u32 gid = get_global_id (0);
914   const u32 lid = get_local_id (0);
915   const u32 lsz = get_local_size (0);
916
917   /**
918    * sbox, kbox
919    */
920
921   __local u32 s_SPtrans[8][64];
922   __local u32 s_skb[8][64];
923
924   for (u32 i = lid; i < 64; i += lsz)
925   {
926     s_SPtrans[0][i] = c_SPtrans[0][i];
927     s_SPtrans[1][i] = c_SPtrans[1][i];
928     s_SPtrans[2][i] = c_SPtrans[2][i];
929     s_SPtrans[3][i] = c_SPtrans[3][i];
930     s_SPtrans[4][i] = c_SPtrans[4][i];
931     s_SPtrans[5][i] = c_SPtrans[5][i];
932     s_SPtrans[6][i] = c_SPtrans[6][i];
933     s_SPtrans[7][i] = c_SPtrans[7][i];
934
935     s_skb[0][i] = c_skb[0][i];
936     s_skb[1][i] = c_skb[1][i];
937     s_skb[2][i] = c_skb[2][i];
938     s_skb[3][i] = c_skb[3][i];
939     s_skb[4][i] = c_skb[4][i];
940     s_skb[5][i] = c_skb[5][i];
941     s_skb[6][i] = c_skb[6][i];
942     s_skb[7][i] = c_skb[7][i];
943   }
944
945   barrier (CLK_LOCAL_MEM_FENCE);
946
947   if (gid >= gid_max) return;
948
949   /**
950    * base
951    */
952
953   u32 w[16];
954
955   w[ 0] = pws[gid].i[ 0];
956   w[ 1] = pws[gid].i[ 1];
957   w[ 2] = pws[gid].i[ 2];
958   w[ 3] = pws[gid].i[ 3];
959   w[ 4] = pws[gid].i[ 4];
960   w[ 5] = pws[gid].i[ 5];
961   w[ 6] = pws[gid].i[ 6];
962   w[ 7] = pws[gid].i[ 7];
963   w[ 8] = 0;
964   w[ 9] = 0;
965   w[10] = 0;
966   w[11] = 0;
967   w[12] = 0;
968   w[13] = 0;
969   w[14] = pws[gid].i[14];
970   w[15] = 0;
971
972   const u32 pw_len = pws[gid].pw_len;
973
974   /**
975    * main
976    */
977
978   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, il_cnt, digests_cnt, digests_offset);
979 }
980
981 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
982 {
983 }
984
985 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
986 {
987   /**
988    * modifier
989    */
990
991   const u32 gid = get_global_id (0);
992   const u32 lid = get_local_id (0);
993   const u32 lsz = get_local_size (0);
994
995   /**
996    * sbox, kbox
997    */
998
999   __local u32 s_SPtrans[8][64];
1000   __local u32 s_skb[8][64];
1001
1002   for (u32 i = lid; i < 64; i += lsz)
1003   {
1004     s_SPtrans[0][i] = c_SPtrans[0][i];
1005     s_SPtrans[1][i] = c_SPtrans[1][i];
1006     s_SPtrans[2][i] = c_SPtrans[2][i];
1007     s_SPtrans[3][i] = c_SPtrans[3][i];
1008     s_SPtrans[4][i] = c_SPtrans[4][i];
1009     s_SPtrans[5][i] = c_SPtrans[5][i];
1010     s_SPtrans[6][i] = c_SPtrans[6][i];
1011     s_SPtrans[7][i] = c_SPtrans[7][i];
1012
1013     s_skb[0][i] = c_skb[0][i];
1014     s_skb[1][i] = c_skb[1][i];
1015     s_skb[2][i] = c_skb[2][i];
1016     s_skb[3][i] = c_skb[3][i];
1017     s_skb[4][i] = c_skb[4][i];
1018     s_skb[5][i] = c_skb[5][i];
1019     s_skb[6][i] = c_skb[6][i];
1020     s_skb[7][i] = c_skb[7][i];
1021   }
1022
1023   barrier (CLK_LOCAL_MEM_FENCE);
1024
1025   if (gid >= gid_max) return;
1026
1027   /**
1028    * base
1029    */
1030
1031   u32 w[16];
1032
1033   w[ 0] = pws[gid].i[ 0];
1034   w[ 1] = pws[gid].i[ 1];
1035   w[ 2] = pws[gid].i[ 2];
1036   w[ 3] = pws[gid].i[ 3];
1037   w[ 4] = 0;
1038   w[ 5] = 0;
1039   w[ 6] = 0;
1040   w[ 7] = 0;
1041   w[ 8] = 0;
1042   w[ 9] = 0;
1043   w[10] = 0;
1044   w[11] = 0;
1045   w[12] = 0;
1046   w[13] = 0;
1047   w[14] = pws[gid].i[14];
1048   w[15] = 0;
1049
1050   const u32 pw_len = pws[gid].pw_len;
1051
1052   /**
1053    * main
1054    */
1055
1056   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, il_cnt, digests_cnt, digests_offset);
1057 }
1058
1059 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1060 {
1061   /**
1062    * modifier
1063    */
1064
1065   const u32 gid = get_global_id (0);
1066   const u32 lid = get_local_id (0);
1067   const u32 lsz = get_local_size (0);
1068
1069   /**
1070    * sbox, kbox
1071    */
1072
1073   __local u32 s_SPtrans[8][64];
1074   __local u32 s_skb[8][64];
1075
1076   for (u32 i = lid; i < 64; i += lsz)
1077   {
1078     s_SPtrans[0][i] = c_SPtrans[0][i];
1079     s_SPtrans[1][i] = c_SPtrans[1][i];
1080     s_SPtrans[2][i] = c_SPtrans[2][i];
1081     s_SPtrans[3][i] = c_SPtrans[3][i];
1082     s_SPtrans[4][i] = c_SPtrans[4][i];
1083     s_SPtrans[5][i] = c_SPtrans[5][i];
1084     s_SPtrans[6][i] = c_SPtrans[6][i];
1085     s_SPtrans[7][i] = c_SPtrans[7][i];
1086
1087     s_skb[0][i] = c_skb[0][i];
1088     s_skb[1][i] = c_skb[1][i];
1089     s_skb[2][i] = c_skb[2][i];
1090     s_skb[3][i] = c_skb[3][i];
1091     s_skb[4][i] = c_skb[4][i];
1092     s_skb[5][i] = c_skb[5][i];
1093     s_skb[6][i] = c_skb[6][i];
1094     s_skb[7][i] = c_skb[7][i];
1095   }
1096
1097   barrier (CLK_LOCAL_MEM_FENCE);
1098
1099   if (gid >= gid_max) return;
1100
1101   /**
1102    * base
1103    */
1104
1105   u32 w[16];
1106
1107   w[ 0] = pws[gid].i[ 0];
1108   w[ 1] = pws[gid].i[ 1];
1109   w[ 2] = pws[gid].i[ 2];
1110   w[ 3] = pws[gid].i[ 3];
1111   w[ 4] = pws[gid].i[ 4];
1112   w[ 5] = pws[gid].i[ 5];
1113   w[ 6] = pws[gid].i[ 6];
1114   w[ 7] = pws[gid].i[ 7];
1115   w[ 8] = 0;
1116   w[ 9] = 0;
1117   w[10] = 0;
1118   w[11] = 0;
1119   w[12] = 0;
1120   w[13] = 0;
1121   w[14] = pws[gid].i[14];
1122   w[15] = 0;
1123
1124   const u32 pw_len = pws[gid].pw_len;
1125
1126   /**
1127    * main
1128    */
1129
1130   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, il_cnt, digests_cnt, digests_offset);
1131 }
1132
1133 __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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1134 {
1135 }