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