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