Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m01500_a1.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *
5  * License.....: MIT
6  */
7
8 #define _DES_
9
10 #define NEW_SIMD_CODE
11
12 #include "inc_vendor.cl"
13 #include "inc_hash_constants.h"
14 #include "inc_hash_functions.cl"
15 #include "inc_types.cl"
16 #include "inc_common.cl"
17 #include "inc_simd.cl"
18
19 #define PERM_OP(a,b,tt,n,m) \
20 {                           \
21   tt = a >> n;              \
22   tt = tt ^ b;              \
23   tt = tt & m;              \
24   b = b ^ tt;               \
25   tt = tt << n;             \
26   a = a ^ tt;               \
27 }
28
29 #define HPERM_OP(a,tt,n,m)  \
30 {                           \
31   tt = a << (16 + n);       \
32   tt = tt ^ a;              \
33   tt = tt & m;              \
34   a  = a ^ tt;              \
35   tt = tt >> (16 + n);      \
36   a  = a ^ tt;              \
37 }
38
39 __constant u32 c_SPtrans[8][64] =
40 {
41   {
42     0x00820200, 0x00020000, 0x80800000, 0x80820200,
43     0x00800000, 0x80020200, 0x80020000, 0x80800000,
44     0x80020200, 0x00820200, 0x00820000, 0x80000200,
45     0x80800200, 0x00800000, 0x00000000, 0x80020000,
46     0x00020000, 0x80000000, 0x00800200, 0x00020200,
47     0x80820200, 0x00820000, 0x80000200, 0x00800200,
48     0x80000000, 0x00000200, 0x00020200, 0x80820000,
49     0x00000200, 0x80800200, 0x80820000, 0x00000000,
50     0x00000000, 0x80820200, 0x00800200, 0x80020000,
51     0x00820200, 0x00020000, 0x80000200, 0x00800200,
52     0x80820000, 0x00000200, 0x00020200, 0x80800000,
53     0x80020200, 0x80000000, 0x80800000, 0x00820000,
54     0x80820200, 0x00020200, 0x00820000, 0x80800200,
55     0x00800000, 0x80000200, 0x80020000, 0x00000000,
56     0x00020000, 0x00800000, 0x80800200, 0x00820200,
57     0x80000000, 0x80820000, 0x00000200, 0x80020200,
58   },
59   {
60     0x10042004, 0x00000000, 0x00042000, 0x10040000,
61     0x10000004, 0x00002004, 0x10002000, 0x00042000,
62     0x00002000, 0x10040004, 0x00000004, 0x10002000,
63     0x00040004, 0x10042000, 0x10040000, 0x00000004,
64     0x00040000, 0x10002004, 0x10040004, 0x00002000,
65     0x00042004, 0x10000000, 0x00000000, 0x00040004,
66     0x10002004, 0x00042004, 0x10042000, 0x10000004,
67     0x10000000, 0x00040000, 0x00002004, 0x10042004,
68     0x00040004, 0x10042000, 0x10002000, 0x00042004,
69     0x10042004, 0x00040004, 0x10000004, 0x00000000,
70     0x10000000, 0x00002004, 0x00040000, 0x10040004,
71     0x00002000, 0x10000000, 0x00042004, 0x10002004,
72     0x10042000, 0x00002000, 0x00000000, 0x10000004,
73     0x00000004, 0x10042004, 0x00042000, 0x10040000,
74     0x10040004, 0x00040000, 0x00002004, 0x10002000,
75     0x10002004, 0x00000004, 0x10040000, 0x00042000,
76   },
77   {
78     0x41000000, 0x01010040, 0x00000040, 0x41000040,
79     0x40010000, 0x01000000, 0x41000040, 0x00010040,
80     0x01000040, 0x00010000, 0x01010000, 0x40000000,
81     0x41010040, 0x40000040, 0x40000000, 0x41010000,
82     0x00000000, 0x40010000, 0x01010040, 0x00000040,
83     0x40000040, 0x41010040, 0x00010000, 0x41000000,
84     0x41010000, 0x01000040, 0x40010040, 0x01010000,
85     0x00010040, 0x00000000, 0x01000000, 0x40010040,
86     0x01010040, 0x00000040, 0x40000000, 0x00010000,
87     0x40000040, 0x40010000, 0x01010000, 0x41000040,
88     0x00000000, 0x01010040, 0x00010040, 0x41010000,
89     0x40010000, 0x01000000, 0x41010040, 0x40000000,
90     0x40010040, 0x41000000, 0x01000000, 0x41010040,
91     0x00010000, 0x01000040, 0x41000040, 0x00010040,
92     0x01000040, 0x00000000, 0x41010000, 0x40000040,
93     0x41000000, 0x40010040, 0x00000040, 0x01010000,
94   },
95   {
96     0x00100402, 0x04000400, 0x00000002, 0x04100402,
97     0x00000000, 0x04100000, 0x04000402, 0x00100002,
98     0x04100400, 0x04000002, 0x04000000, 0x00000402,
99     0x04000002, 0x00100402, 0x00100000, 0x04000000,
100     0x04100002, 0x00100400, 0x00000400, 0x00000002,
101     0x00100400, 0x04000402, 0x04100000, 0x00000400,
102     0x00000402, 0x00000000, 0x00100002, 0x04100400,
103     0x04000400, 0x04100002, 0x04100402, 0x00100000,
104     0x04100002, 0x00000402, 0x00100000, 0x04000002,
105     0x00100400, 0x04000400, 0x00000002, 0x04100000,
106     0x04000402, 0x00000000, 0x00000400, 0x00100002,
107     0x00000000, 0x04100002, 0x04100400, 0x00000400,
108     0x04000000, 0x04100402, 0x00100402, 0x00100000,
109     0x04100402, 0x00000002, 0x04000400, 0x00100402,
110     0x00100002, 0x00100400, 0x04100000, 0x04000402,
111     0x00000402, 0x04000000, 0x04000002, 0x04100400,
112   },
113   {
114     0x02000000, 0x00004000, 0x00000100, 0x02004108,
115     0x02004008, 0x02000100, 0x00004108, 0x02004000,
116     0x00004000, 0x00000008, 0x02000008, 0x00004100,
117     0x02000108, 0x02004008, 0x02004100, 0x00000000,
118     0x00004100, 0x02000000, 0x00004008, 0x00000108,
119     0x02000100, 0x00004108, 0x00000000, 0x02000008,
120     0x00000008, 0x02000108, 0x02004108, 0x00004008,
121     0x02004000, 0x00000100, 0x00000108, 0x02004100,
122     0x02004100, 0x02000108, 0x00004008, 0x02004000,
123     0x00004000, 0x00000008, 0x02000008, 0x02000100,
124     0x02000000, 0x00004100, 0x02004108, 0x00000000,
125     0x00004108, 0x02000000, 0x00000100, 0x00004008,
126     0x02000108, 0x00000100, 0x00000000, 0x02004108,
127     0x02004008, 0x02004100, 0x00000108, 0x00004000,
128     0x00004100, 0x02004008, 0x02000100, 0x00000108,
129     0x00000008, 0x00004108, 0x02004000, 0x02000008,
130   },
131   {
132     0x20000010, 0x00080010, 0x00000000, 0x20080800,
133     0x00080010, 0x00000800, 0x20000810, 0x00080000,
134     0x00000810, 0x20080810, 0x00080800, 0x20000000,
135     0x20000800, 0x20000010, 0x20080000, 0x00080810,
136     0x00080000, 0x20000810, 0x20080010, 0x00000000,
137     0x00000800, 0x00000010, 0x20080800, 0x20080010,
138     0x20080810, 0x20080000, 0x20000000, 0x00000810,
139     0x00000010, 0x00080800, 0x00080810, 0x20000800,
140     0x00000810, 0x20000000, 0x20000800, 0x00080810,
141     0x20080800, 0x00080010, 0x00000000, 0x20000800,
142     0x20000000, 0x00000800, 0x20080010, 0x00080000,
143     0x00080010, 0x20080810, 0x00080800, 0x00000010,
144     0x20080810, 0x00080800, 0x00080000, 0x20000810,
145     0x20000010, 0x20080000, 0x00080810, 0x00000000,
146     0x00000800, 0x20000010, 0x20000810, 0x20080800,
147     0x20080000, 0x00000810, 0x00000010, 0x20080010,
148   },
149   {
150     0x00001000, 0x00000080, 0x00400080, 0x00400001,
151     0x00401081, 0x00001001, 0x00001080, 0x00000000,
152     0x00400000, 0x00400081, 0x00000081, 0x00401000,
153     0x00000001, 0x00401080, 0x00401000, 0x00000081,
154     0x00400081, 0x00001000, 0x00001001, 0x00401081,
155     0x00000000, 0x00400080, 0x00400001, 0x00001080,
156     0x00401001, 0x00001081, 0x00401080, 0x00000001,
157     0x00001081, 0x00401001, 0x00000080, 0x00400000,
158     0x00001081, 0x00401000, 0x00401001, 0x00000081,
159     0x00001000, 0x00000080, 0x00400000, 0x00401001,
160     0x00400081, 0x00001081, 0x00001080, 0x00000000,
161     0x00000080, 0x00400001, 0x00000001, 0x00400080,
162     0x00000000, 0x00400081, 0x00400080, 0x00001080,
163     0x00000081, 0x00001000, 0x00401081, 0x00400000,
164     0x00401080, 0x00000001, 0x00001001, 0x00401081,
165     0x00400001, 0x00401080, 0x00401000, 0x00001001,
166   },
167   {
168     0x08200020, 0x08208000, 0x00008020, 0x00000000,
169     0x08008000, 0x00200020, 0x08200000, 0x08208020,
170     0x00000020, 0x08000000, 0x00208000, 0x00008020,
171     0x00208020, 0x08008020, 0x08000020, 0x08200000,
172     0x00008000, 0x00208020, 0x00200020, 0x08008000,
173     0x08208020, 0x08000020, 0x00000000, 0x00208000,
174     0x08000000, 0x00200000, 0x08008020, 0x08200020,
175     0x00200000, 0x00008000, 0x08208000, 0x00000020,
176     0x00200000, 0x00008000, 0x08000020, 0x08208020,
177     0x00008020, 0x08000000, 0x00000000, 0x00208000,
178     0x08200020, 0x08008020, 0x08008000, 0x00200020,
179     0x08208000, 0x00000020, 0x00200020, 0x08008000,
180     0x08208020, 0x00200000, 0x08200000, 0x08000020,
181     0x00208000, 0x00008020, 0x08008020, 0x08200000,
182     0x00000020, 0x08208000, 0x00208020, 0x00000000,
183     0x08000000, 0x08200020, 0x00008000, 0x00208020
184   },
185 };
186
187 __constant u32 c_skb[8][64] =
188 {
189   {
190     0x00000000, 0x00000010, 0x20000000, 0x20000010,
191     0x00010000, 0x00010010, 0x20010000, 0x20010010,
192     0x00000800, 0x00000810, 0x20000800, 0x20000810,
193     0x00010800, 0x00010810, 0x20010800, 0x20010810,
194     0x00000020, 0x00000030, 0x20000020, 0x20000030,
195     0x00010020, 0x00010030, 0x20010020, 0x20010030,
196     0x00000820, 0x00000830, 0x20000820, 0x20000830,
197     0x00010820, 0x00010830, 0x20010820, 0x20010830,
198     0x00080000, 0x00080010, 0x20080000, 0x20080010,
199     0x00090000, 0x00090010, 0x20090000, 0x20090010,
200     0x00080800, 0x00080810, 0x20080800, 0x20080810,
201     0x00090800, 0x00090810, 0x20090800, 0x20090810,
202     0x00080020, 0x00080030, 0x20080020, 0x20080030,
203     0x00090020, 0x00090030, 0x20090020, 0x20090030,
204     0x00080820, 0x00080830, 0x20080820, 0x20080830,
205     0x00090820, 0x00090830, 0x20090820, 0x20090830,
206   },
207   {
208     0x00000000, 0x02000000, 0x00002000, 0x02002000,
209     0x00200000, 0x02200000, 0x00202000, 0x02202000,
210     0x00000004, 0x02000004, 0x00002004, 0x02002004,
211     0x00200004, 0x02200004, 0x00202004, 0x02202004,
212     0x00000400, 0x02000400, 0x00002400, 0x02002400,
213     0x00200400, 0x02200400, 0x00202400, 0x02202400,
214     0x00000404, 0x02000404, 0x00002404, 0x02002404,
215     0x00200404, 0x02200404, 0x00202404, 0x02202404,
216     0x10000000, 0x12000000, 0x10002000, 0x12002000,
217     0x10200000, 0x12200000, 0x10202000, 0x12202000,
218     0x10000004, 0x12000004, 0x10002004, 0x12002004,
219     0x10200004, 0x12200004, 0x10202004, 0x12202004,
220     0x10000400, 0x12000400, 0x10002400, 0x12002400,
221     0x10200400, 0x12200400, 0x10202400, 0x12202400,
222     0x10000404, 0x12000404, 0x10002404, 0x12002404,
223     0x10200404, 0x12200404, 0x10202404, 0x12202404,
224   },
225   {
226     0x00000000, 0x00000001, 0x00040000, 0x00040001,
227     0x01000000, 0x01000001, 0x01040000, 0x01040001,
228     0x00000002, 0x00000003, 0x00040002, 0x00040003,
229     0x01000002, 0x01000003, 0x01040002, 0x01040003,
230     0x00000200, 0x00000201, 0x00040200, 0x00040201,
231     0x01000200, 0x01000201, 0x01040200, 0x01040201,
232     0x00000202, 0x00000203, 0x00040202, 0x00040203,
233     0x01000202, 0x01000203, 0x01040202, 0x01040203,
234     0x08000000, 0x08000001, 0x08040000, 0x08040001,
235     0x09000000, 0x09000001, 0x09040000, 0x09040001,
236     0x08000002, 0x08000003, 0x08040002, 0x08040003,
237     0x09000002, 0x09000003, 0x09040002, 0x09040003,
238     0x08000200, 0x08000201, 0x08040200, 0x08040201,
239     0x09000200, 0x09000201, 0x09040200, 0x09040201,
240     0x08000202, 0x08000203, 0x08040202, 0x08040203,
241     0x09000202, 0x09000203, 0x09040202, 0x09040203,
242   },
243   {
244     0x00000000, 0x00100000, 0x00000100, 0x00100100,
245     0x00000008, 0x00100008, 0x00000108, 0x00100108,
246     0x00001000, 0x00101000, 0x00001100, 0x00101100,
247     0x00001008, 0x00101008, 0x00001108, 0x00101108,
248     0x04000000, 0x04100000, 0x04000100, 0x04100100,
249     0x04000008, 0x04100008, 0x04000108, 0x04100108,
250     0x04001000, 0x04101000, 0x04001100, 0x04101100,
251     0x04001008, 0x04101008, 0x04001108, 0x04101108,
252     0x00020000, 0x00120000, 0x00020100, 0x00120100,
253     0x00020008, 0x00120008, 0x00020108, 0x00120108,
254     0x00021000, 0x00121000, 0x00021100, 0x00121100,
255     0x00021008, 0x00121008, 0x00021108, 0x00121108,
256     0x04020000, 0x04120000, 0x04020100, 0x04120100,
257     0x04020008, 0x04120008, 0x04020108, 0x04120108,
258     0x04021000, 0x04121000, 0x04021100, 0x04121100,
259     0x04021008, 0x04121008, 0x04021108, 0x04121108,
260   },
261   {
262     0x00000000, 0x10000000, 0x00010000, 0x10010000,
263     0x00000004, 0x10000004, 0x00010004, 0x10010004,
264     0x20000000, 0x30000000, 0x20010000, 0x30010000,
265     0x20000004, 0x30000004, 0x20010004, 0x30010004,
266     0x00100000, 0x10100000, 0x00110000, 0x10110000,
267     0x00100004, 0x10100004, 0x00110004, 0x10110004,
268     0x20100000, 0x30100000, 0x20110000, 0x30110000,
269     0x20100004, 0x30100004, 0x20110004, 0x30110004,
270     0x00001000, 0x10001000, 0x00011000, 0x10011000,
271     0x00001004, 0x10001004, 0x00011004, 0x10011004,
272     0x20001000, 0x30001000, 0x20011000, 0x30011000,
273     0x20001004, 0x30001004, 0x20011004, 0x30011004,
274     0x00101000, 0x10101000, 0x00111000, 0x10111000,
275     0x00101004, 0x10101004, 0x00111004, 0x10111004,
276     0x20101000, 0x30101000, 0x20111000, 0x30111000,
277     0x20101004, 0x30101004, 0x20111004, 0x30111004,
278   },
279   {
280     0x00000000, 0x08000000, 0x00000008, 0x08000008,
281     0x00000400, 0x08000400, 0x00000408, 0x08000408,
282     0x00020000, 0x08020000, 0x00020008, 0x08020008,
283     0x00020400, 0x08020400, 0x00020408, 0x08020408,
284     0x00000001, 0x08000001, 0x00000009, 0x08000009,
285     0x00000401, 0x08000401, 0x00000409, 0x08000409,
286     0x00020001, 0x08020001, 0x00020009, 0x08020009,
287     0x00020401, 0x08020401, 0x00020409, 0x08020409,
288     0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
289     0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
290     0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
291     0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
292     0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
293     0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
294     0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
295     0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
296   },
297   {
298     0x00000000, 0x00000100, 0x00080000, 0x00080100,
299     0x01000000, 0x01000100, 0x01080000, 0x01080100,
300     0x00000010, 0x00000110, 0x00080010, 0x00080110,
301     0x01000010, 0x01000110, 0x01080010, 0x01080110,
302     0x00200000, 0x00200100, 0x00280000, 0x00280100,
303     0x01200000, 0x01200100, 0x01280000, 0x01280100,
304     0x00200010, 0x00200110, 0x00280010, 0x00280110,
305     0x01200010, 0x01200110, 0x01280010, 0x01280110,
306     0x00000200, 0x00000300, 0x00080200, 0x00080300,
307     0x01000200, 0x01000300, 0x01080200, 0x01080300,
308     0x00000210, 0x00000310, 0x00080210, 0x00080310,
309     0x01000210, 0x01000310, 0x01080210, 0x01080310,
310     0x00200200, 0x00200300, 0x00280200, 0x00280300,
311     0x01200200, 0x01200300, 0x01280200, 0x01280300,
312     0x00200210, 0x00200310, 0x00280210, 0x00280310,
313     0x01200210, 0x01200310, 0x01280210, 0x01280310,
314   },
315   {
316     0x00000000, 0x04000000, 0x00040000, 0x04040000,
317     0x00000002, 0x04000002, 0x00040002, 0x04040002,
318     0x00002000, 0x04002000, 0x00042000, 0x04042000,
319     0x00002002, 0x04002002, 0x00042002, 0x04042002,
320     0x00000020, 0x04000020, 0x00040020, 0x04040020,
321     0x00000022, 0x04000022, 0x00040022, 0x04040022,
322     0x00002020, 0x04002020, 0x00042020, 0x04042020,
323     0x00002022, 0x04002022, 0x00042022, 0x04042022,
324     0x00000800, 0x04000800, 0x00040800, 0x04040800,
325     0x00000802, 0x04000802, 0x00040802, 0x04040802,
326     0x00002800, 0x04002800, 0x00042800, 0x04042800,
327     0x00002802, 0x04002802, 0x00042802, 0x04042802,
328     0x00000820, 0x04000820, 0x00040820, 0x04040820,
329     0x00000822, 0x04000822, 0x00040822, 0x04040822,
330     0x00002820, 0x04002820, 0x00042820, 0x04042820,
331     0x00002822, 0x04002822, 0x00042822, 0x04042822
332   },
333 };
334
335 #if   VECT_SIZE == 1
336 #define BOX(i,n,S) (S)[(n)][(i)]
337 #elif VECT_SIZE == 2
338 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
339 #elif VECT_SIZE == 4
340 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
341 #elif VECT_SIZE == 8
342 #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])
343 #elif VECT_SIZE == 16
344 #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])
345 #endif
346
347 void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64])
348 {
349   u32x tt;
350
351   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
352   HPERM_OP (c,    tt, 2, 0xcccc0000);
353   HPERM_OP (d,    tt, 2, 0xcccc0000);
354   PERM_OP  (d, c, tt, 1, 0x55555555);
355   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
356   PERM_OP  (d, c, tt, 1, 0x55555555);
357
358   d = ((d & 0x000000ff) << 16)
359     | ((d & 0x0000ff00) <<  0)
360     | ((d & 0x00ff0000) >> 16)
361     | ((c & 0xf0000000) >>  4);
362
363   c = c & 0x0fffffff;
364
365   #ifdef _unroll
366   #pragma unroll
367   #endif
368   for (u32 i = 0; i < 16; i++)
369   {
370     if ((i < 2) || (i == 8) || (i == 15))
371     {
372       c = ((c >> 1) | (c << 27));
373       d = ((d >> 1) | (d << 27));
374     }
375     else
376     {
377       c = ((c >> 2) | (c << 26));
378       d = ((d >> 2) | (d << 26));
379     }
380
381     c = c & 0x0fffffff;
382     d = d & 0x0fffffff;
383
384     const u32x c00 = (c >>  0) & 0x0000003f;
385     const u32x c06 = (c >>  6) & 0x00383003;
386     const u32x c07 = (c >>  7) & 0x0000003c;
387     const u32x c13 = (c >> 13) & 0x0000060f;
388     const u32x c20 = (c >> 20) & 0x00000001;
389
390     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
391            | BOX (((c06 >>  0) & 0xff)
392                  |((c07 >>  0) & 0xff), 1, s_skb)
393            | BOX (((c13 >>  0) & 0xff)
394                  |((c06 >>  8) & 0xff), 2, s_skb)
395            | BOX (((c20 >>  0) & 0xff)
396                  |((c13 >>  8) & 0xff)
397                  |((c06 >> 16) & 0xff), 3, s_skb);
398
399     const u32x d00 = (d >>  0) & 0x00003c3f;
400     const u32x d07 = (d >>  7) & 0x00003f03;
401     const u32x d21 = (d >> 21) & 0x0000000f;
402     const u32x d22 = (d >> 22) & 0x00000030;
403
404     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
405            | BOX (((d07 >>  0) & 0xff)
406                  |((d00 >>  8) & 0xff), 5, s_skb)
407            | BOX (((d07 >>  8) & 0xff), 6, s_skb)
408            | BOX (((d21 >>  0) & 0xff)
409                  |((d22 >>  0) & 0xff), 7, s_skb);
410
411     Kc[i] = ((t << 16) | (s & 0x0000ffff));
412     Kd[i] = ((s >> 16) | (t & 0xffff0000));
413   }
414 }
415
416 void _des_crypt_encrypt (u32x iv[2], u32 mask, u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64])
417 {
418   const u32 E1 = (mask >> 2) & 0x3f0;
419   const u32 E0 = mask & 0x3f;
420
421   u32x r = 0;
422   u32x l = 0;
423
424   for (u32 i = 0; i < 25; i++)
425   {
426     #ifdef _unroll
427     #pragma unroll
428     #endif
429     for (u32 j = 0; j < 16; j += 2)
430     {
431       u32x t;
432       u32x u;
433
434       t = r ^ (r >> 16);
435       u = t & E0;
436       t = t & E1;
437       u = u ^ (u << 16);
438       u = u ^ r;
439       u = u ^ Kc[j + 0];
440       t = t ^ (t << 16);
441       t = t ^ r;
442       t = rotl32 (t, 28u);
443       t = t ^ Kd[j + 0];
444
445       l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
446          | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
447          | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
448          | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
449          | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
450          | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
451          | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
452          | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
453
454       t = l ^ (l >> 16);
455       u = t & E0;
456       t = t & E1;
457       u = u ^ (u << 16);
458       u = u ^ l;
459       u = u ^ Kc[j + 1];
460       t = t ^ (t << 16);
461       t = t ^ l;
462       t = rotl32 (t, 28u);
463       t = t ^ Kd[j + 1];
464
465       r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
466          | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
467          | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
468          | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
469          | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
470          | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
471          | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
472          | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
473     }
474
475     u32x tt;
476
477     tt = l;
478     l  = r;
479     r  = tt;
480   }
481
482   iv[0] = rotl32 (r, 31);
483   iv[1] = rotl32 (l, 31);
484 }
485
486 __kernel void m01500_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_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)
487 {
488   /**
489    * modifier
490    */
491
492   const u32 gid = get_global_id (0);
493   const u32 lid = get_local_id (0);
494   const u32 lsz = get_local_size (0);
495
496   /**
497    * sbox, kbox
498    */
499
500   __local u32 s_SPtrans[8][64];
501   __local u32 s_skb[8][64];
502
503   for (u32 i = lid; i < 64; i += lsz)
504   {
505     s_SPtrans[0][i] = c_SPtrans[0][i];
506     s_SPtrans[1][i] = c_SPtrans[1][i];
507     s_SPtrans[2][i] = c_SPtrans[2][i];
508     s_SPtrans[3][i] = c_SPtrans[3][i];
509     s_SPtrans[4][i] = c_SPtrans[4][i];
510     s_SPtrans[5][i] = c_SPtrans[5][i];
511     s_SPtrans[6][i] = c_SPtrans[6][i];
512     s_SPtrans[7][i] = c_SPtrans[7][i];
513
514     s_skb[0][i] = c_skb[0][i];
515     s_skb[1][i] = c_skb[1][i];
516     s_skb[2][i] = c_skb[2][i];
517     s_skb[3][i] = c_skb[3][i];
518     s_skb[4][i] = c_skb[4][i];
519     s_skb[5][i] = c_skb[5][i];
520     s_skb[6][i] = c_skb[6][i];
521     s_skb[7][i] = c_skb[7][i];
522   }
523
524   barrier (CLK_LOCAL_MEM_FENCE);
525
526   if (gid >= gid_max) return;
527
528   /**
529    * base
530    */
531
532   u32 pw_buf0[4];
533   u32 pw_buf1[4];
534
535   pw_buf0[0] = pws[gid].i[0];
536   pw_buf0[1] = pws[gid].i[1];
537   pw_buf0[2] = pws[gid].i[2];
538   pw_buf0[3] = pws[gid].i[3];
539   pw_buf1[0] = pws[gid].i[4];
540   pw_buf1[1] = pws[gid].i[5];
541   pw_buf1[2] = pws[gid].i[6];
542   pw_buf1[3] = pws[gid].i[7];
543
544   const u32 pw_l_len = pws[gid].pw_len;
545
546   /**
547    * salt
548    */
549
550   const u32 mask = salt_bufs[salt_pos].salt_buf[0];
551
552   /**
553    * loop
554    */
555
556   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
557   {
558     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
559
560     const u32x pw_len = pw_l_len + pw_r_len;
561
562     /**
563      * concat password candidate
564      */
565
566     u32x wordl0[4] = { 0 };
567     u32x wordl1[4] = { 0 };
568     u32x wordl2[4] = { 0 };
569     u32x wordl3[4] = { 0 };
570
571     wordl0[0] = pw_buf0[0];
572     wordl0[1] = pw_buf0[1];
573     wordl0[2] = pw_buf0[2];
574     wordl0[3] = pw_buf0[3];
575     wordl1[0] = pw_buf1[0];
576     wordl1[1] = pw_buf1[1];
577     wordl1[2] = pw_buf1[2];
578     wordl1[3] = pw_buf1[3];
579
580     u32x wordr0[4] = { 0 };
581     u32x wordr1[4] = { 0 };
582     u32x wordr2[4] = { 0 };
583     u32x wordr3[4] = { 0 };
584
585     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
586     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
587     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
588     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
589     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
590     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
591     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
592     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
593
594     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
595     {
596       switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
597     }
598     else
599     {
600       switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
601     }
602
603     u32x w0[4];
604     u32x w1[4];
605     u32x w2[4];
606     u32x w3[4];
607
608     w0[0] = wordl0[0] | wordr0[0];
609     w0[1] = wordl0[1] | wordr0[1];
610     w0[2] = wordl0[2] | wordr0[2];
611     w0[3] = wordl0[3] | wordr0[3];
612     w1[0] = wordl1[0] | wordr1[0];
613     w1[1] = wordl1[1] | wordr1[1];
614     w1[2] = wordl1[2] | wordr1[2];
615     w1[3] = wordl1[3] | wordr1[3];
616     w2[0] = wordl2[0] | wordr2[0];
617     w2[1] = wordl2[1] | wordr2[1];
618     w2[2] = wordl2[2] | wordr2[2];
619     w2[3] = wordl2[3] | wordr2[3];
620     w3[0] = wordl3[0] | wordr3[0];
621     w3[1] = wordl3[1] | wordr3[1];
622     w3[2] = wordl3[2] | wordr3[2];
623     w3[3] = wordl3[3] | wordr3[3];
624
625     /**
626      * DES
627      */
628
629     u32x data[2];
630
631     data[0] = (w0[0] << 1) & 0xfefefefe;
632     data[1] = (w0[1] << 1) & 0xfefefefe;
633
634     u32x Kc[16];
635     u32x Kd[16];
636
637     _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb);
638
639     u32x iv[2];
640
641     _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans);
642
643     u32x z = 0;
644
645     COMPARE_M_SIMD (iv[0], iv[1], z, z);
646   }
647 }
648
649 __kernel void m01500_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_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)
650 {
651 }
652
653 __kernel void m01500_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_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)
654 {
655 }
656
657 __kernel void m01500_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_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)
658 {
659   /**
660    * modifier
661    */
662
663   const u32 gid = get_global_id (0);
664   const u32 lid = get_local_id (0);
665   const u32 lsz = get_local_size (0);
666
667   /**
668    * sbox, kbox
669    */
670
671   __local u32 s_SPtrans[8][64];
672   __local u32 s_skb[8][64];
673
674   for (u32 i = lid; i < 64; i += lsz)
675   {
676     s_SPtrans[0][i] = c_SPtrans[0][i];
677     s_SPtrans[1][i] = c_SPtrans[1][i];
678     s_SPtrans[2][i] = c_SPtrans[2][i];
679     s_SPtrans[3][i] = c_SPtrans[3][i];
680     s_SPtrans[4][i] = c_SPtrans[4][i];
681     s_SPtrans[5][i] = c_SPtrans[5][i];
682     s_SPtrans[6][i] = c_SPtrans[6][i];
683     s_SPtrans[7][i] = c_SPtrans[7][i];
684
685     s_skb[0][i] = c_skb[0][i];
686     s_skb[1][i] = c_skb[1][i];
687     s_skb[2][i] = c_skb[2][i];
688     s_skb[3][i] = c_skb[3][i];
689     s_skb[4][i] = c_skb[4][i];
690     s_skb[5][i] = c_skb[5][i];
691     s_skb[6][i] = c_skb[6][i];
692     s_skb[7][i] = c_skb[7][i];
693   }
694
695   barrier (CLK_LOCAL_MEM_FENCE);
696
697   if (gid >= gid_max) return;
698
699   /**
700    * base
701    */
702
703   u32 pw_buf0[4];
704   u32 pw_buf1[4];
705
706   pw_buf0[0] = pws[gid].i[0];
707   pw_buf0[1] = pws[gid].i[1];
708   pw_buf0[2] = pws[gid].i[2];
709   pw_buf0[3] = pws[gid].i[3];
710   pw_buf1[0] = pws[gid].i[4];
711   pw_buf1[1] = pws[gid].i[5];
712   pw_buf1[2] = pws[gid].i[6];
713   pw_buf1[3] = pws[gid].i[7];
714
715   const u32 pw_l_len = pws[gid].pw_len;
716
717   /**
718    * salt
719    */
720
721   const u32 mask = salt_bufs[salt_pos].salt_buf[0];
722
723   /**
724    * digest
725    */
726
727   const u32 search[4] =
728   {
729     digests_buf[digests_offset].digest_buf[DGST_R0],
730     digests_buf[digests_offset].digest_buf[DGST_R1],
731     0,
732     0
733   };
734
735   /**
736    * loop
737    */
738
739   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
740   {
741     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
742
743     const u32x pw_len = pw_l_len + pw_r_len;
744
745     /**
746      * concat password candidate
747      */
748
749     u32x wordl0[4] = { 0 };
750     u32x wordl1[4] = { 0 };
751     u32x wordl2[4] = { 0 };
752     u32x wordl3[4] = { 0 };
753
754     wordl0[0] = pw_buf0[0];
755     wordl0[1] = pw_buf0[1];
756     wordl0[2] = pw_buf0[2];
757     wordl0[3] = pw_buf0[3];
758     wordl1[0] = pw_buf1[0];
759     wordl1[1] = pw_buf1[1];
760     wordl1[2] = pw_buf1[2];
761     wordl1[3] = pw_buf1[3];
762
763     u32x wordr0[4] = { 0 };
764     u32x wordr1[4] = { 0 };
765     u32x wordr2[4] = { 0 };
766     u32x wordr3[4] = { 0 };
767
768     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
769     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
770     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
771     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
772     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
773     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
774     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
775     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
776
777     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
778     {
779       switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
780     }
781     else
782     {
783       switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
784     }
785
786     u32x w0[4];
787     u32x w1[4];
788     u32x w2[4];
789     u32x w3[4];
790
791     w0[0] = wordl0[0] | wordr0[0];
792     w0[1] = wordl0[1] | wordr0[1];
793     w0[2] = wordl0[2] | wordr0[2];
794     w0[3] = wordl0[3] | wordr0[3];
795     w1[0] = wordl1[0] | wordr1[0];
796     w1[1] = wordl1[1] | wordr1[1];
797     w1[2] = wordl1[2] | wordr1[2];
798     w1[3] = wordl1[3] | wordr1[3];
799     w2[0] = wordl2[0] | wordr2[0];
800     w2[1] = wordl2[1] | wordr2[1];
801     w2[2] = wordl2[2] | wordr2[2];
802     w2[3] = wordl2[3] | wordr2[3];
803     w3[0] = wordl3[0] | wordr3[0];
804     w3[1] = wordl3[1] | wordr3[1];
805     w3[2] = wordl3[2] | wordr3[2];
806     w3[3] = wordl3[3] | wordr3[3];
807
808     /**
809      * DES
810      */
811
812     u32x data[2];
813
814     data[0] = (w0[0] << 1) & 0xfefefefe;
815     data[1] = (w0[1] << 1) & 0xfefefefe;
816
817     u32x Kc[16];
818     u32x Kd[16];
819
820     _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb);
821
822     u32x iv[2];
823
824     _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans);
825
826     u32x z = 0;
827
828     COMPARE_S_SIMD (iv[0], iv[1], z, z);
829   }
830 }
831
832 __kernel void m01500_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_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)
833 {
834 }
835
836 __kernel void m01500_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_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)
837 {
838 }