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