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