d32f9b08c9b659b428da6dae1ba77b297ac188b2
[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_hash_constants.h"
11 #include "inc_vendor.cl"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "inc_hash_functions.cl"
19 #include "inc_types.cl"
20 #include "inc_common.cl"
21
22 #define COMPARE_S "inc_comp_single.cl"
23 #define COMPARE_M "inc_comp_multi.cl"
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   #ifdef _unroll
380   #pragma unroll
381   #endif
382   for (u32 i = 0; i < 16; i++)
383   {
384     if ((i < 2) || (i == 8) || (i == 15))
385     {
386       c = ((c >> 1) | (c << 27));
387       d = ((d >> 1) | (d << 27));
388     }
389     else
390     {
391       c = ((c >> 2) | (c << 26));
392       d = ((d >> 2) | (d << 26));
393     }
394
395     c = c & 0x0fffffff;
396     d = d & 0x0fffffff;
397
398     const u32 c00 = (c >>  0) & 0x0000003f;
399     const u32 c06 = (c >>  6) & 0x00383003;
400     const u32 c07 = (c >>  7) & 0x0000003c;
401     const u32 c13 = (c >> 13) & 0x0000060f;
402     const u32 c20 = (c >> 20) & 0x00000001;
403
404     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
405           | BOX (((c06 >>  0) & 0xff)
406                 |((c07 >>  0) & 0xff), 1, s_skb)
407           | BOX (((c13 >>  0) & 0xff)
408                 |((c06 >>  8) & 0xff), 2, s_skb)
409           | BOX (((c20 >>  0) & 0xff)
410                 |((c13 >>  8) & 0xff)
411                 |((c06 >> 16) & 0xff), 3, s_skb);
412
413     const u32 d00 = (d >>  0) & 0x00003c3f;
414     const u32 d07 = (d >>  7) & 0x00003f03;
415     const u32 d21 = (d >> 21) & 0x0000000f;
416     const u32 d22 = (d >> 22) & 0x00000030;
417
418     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
419           | BOX (((d07 >>  0) & 0xff)
420                 |((d00 >>  8) & 0xff), 5, s_skb)
421           | BOX (((d07 >>  8) & 0xff), 6, s_skb)
422           | BOX (((d21 >>  0) & 0xff)
423                 |((d22 >>  0) & 0xff), 7, s_skb);
424
425     Kc[i] = ((t << 16) | (s & 0x0000ffff));
426     Kd[i] = ((s >> 16) | (t & 0xffff0000));
427   }
428 }
429
430 void _des_crypt_encrypt (u32 iv[2], u32 mask, u32 rounds, u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64])
431 {
432   u32 tt;
433
434   const u32 E0 = ((mask >>  0) & 0x003f)
435                | ((mask >>  4) & 0x3f00);
436   const u32 E1 = ((mask >>  2) & 0x03f0)
437                | ((mask >>  6) & 0xf000)
438                | ((mask >> 22) & 0x0003);
439
440   u32 r = iv[0];
441   u32 l = iv[1];
442
443   for (u32 i = 0; i < rounds; i++)
444   {
445     for (u32 j = 0; j < 16; j += 2)
446     {
447       u32 t;
448       u32 u;
449
450       t = r ^ (r >> 16);
451       u = t & E0;
452       t = t & E1;
453       u = u ^ (u << 16);
454       u = u ^ r;
455       u = u ^ Kc[j + 0];
456       t = t ^ (t << 16);
457       t = t ^ r;
458       t = rotl32 (t, 28u);
459       t = t ^ Kd[j + 0];
460
461       l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
462          | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
463          | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
464          | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
465          | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
466          | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
467          | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
468          | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
469
470       t = l ^ (l >> 16);
471       u = t & E0;
472       t = t & E1;
473       u = u ^ (u << 16);
474       u = u ^ l;
475       u = u ^ Kc[j + 1];
476       t = t ^ (t << 16);
477       t = t ^ l;
478       t = rotl32 (t, 28u);
479       t = t ^ Kd[j + 1];
480
481       r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
482          | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
483          | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
484          | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
485          | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
486          | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
487          | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
488          | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
489     }
490
491     u32 tt;
492
493     tt = l;
494     l  = r;
495     r  = tt;
496   }
497
498   iv[0] = r;
499   iv[1] = l;
500 }
501
502 __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)
503 {
504   /**
505    * base
506    */
507
508   const u32 gid = get_global_id (0);
509   const u32 lid = get_local_id (0);
510   const u32 lsz = get_local_size (0);
511
512   /**
513    * sbox
514    */
515
516   __local u32 s_SPtrans[8][64];
517   __local u32 s_skb[8][64];
518
519   for (u32 i = lid; i < 64; i += lsz)
520   {
521     s_SPtrans[0][i] = c_SPtrans[0][i];
522     s_SPtrans[1][i] = c_SPtrans[1][i];
523     s_SPtrans[2][i] = c_SPtrans[2][i];
524     s_SPtrans[3][i] = c_SPtrans[3][i];
525     s_SPtrans[4][i] = c_SPtrans[4][i];
526     s_SPtrans[5][i] = c_SPtrans[5][i];
527     s_SPtrans[6][i] = c_SPtrans[6][i];
528     s_SPtrans[7][i] = c_SPtrans[7][i];
529
530     s_skb[0][i] = c_skb[0][i];
531     s_skb[1][i] = c_skb[1][i];
532     s_skb[2][i] = c_skb[2][i];
533     s_skb[3][i] = c_skb[3][i];
534     s_skb[4][i] = c_skb[4][i];
535     s_skb[5][i] = c_skb[5][i];
536     s_skb[6][i] = c_skb[6][i];
537     s_skb[7][i] = c_skb[7][i];
538   }
539
540   barrier (CLK_LOCAL_MEM_FENCE);
541
542   if (gid >= gid_max) return;
543
544   /**
545    * word
546    */
547
548   u32 w[16];
549
550   w[ 0] = pws[gid].i[ 0];
551   w[ 1] = pws[gid].i[ 1];
552   w[ 2] = pws[gid].i[ 2];
553   w[ 3] = pws[gid].i[ 3];
554   w[ 4] = pws[gid].i[ 4];
555   w[ 5] = pws[gid].i[ 5];
556   w[ 6] = pws[gid].i[ 6];
557   w[ 7] = pws[gid].i[ 7];
558   w[ 8] = pws[gid].i[ 8];
559   w[ 9] = pws[gid].i[ 9];
560   w[10] = pws[gid].i[10];
561   w[11] = pws[gid].i[11];
562   w[12] = pws[gid].i[12];
563   w[13] = pws[gid].i[13];
564   w[14] = pws[gid].i[14];
565   w[15] = pws[gid].i[15];
566
567   u32 pw_len = pws[gid].pw_len;
568
569   u32 tt;
570
571   u32 Kc[16];
572   u32 Kd[16];
573
574   u32 out[2];
575
576   out[0] = (w[0] << 1) & 0xfefefefe;
577   out[1] = (w[1] << 1) & 0xfefefefe;
578
579   for (u32 i = 8, j = 2; i < pw_len; i += 8, j += 2)
580   {
581     _des_crypt_keysetup (out[0], out[1], Kc, Kd, s_skb);
582
583     IP (out[0], out[1], tt);
584
585     out[0] = rotr32 (out[0], 31);
586     out[1] = rotr32 (out[1], 31);
587
588     _des_crypt_encrypt (out, 0, 1, Kc, Kd, s_SPtrans);
589
590     out[0] = rotl32 (out[0], 31);
591     out[1] = rotl32 (out[1], 31);
592
593     FP (out[1], out[0], tt);
594
595     const u32 R = (w[j + 0] << 1) & 0xfefefefe;
596     const u32 L = (w[j + 1] << 1) & 0xfefefefe;
597
598     out[0] ^= R;
599     out[1] ^= L;
600   }
601
602   /*
603   out[0] = (out[0] & 0xfefefefe) >> 1;
604   out[1] = (out[1] & 0xfefefefe) >> 1;
605
606   out[0] = (out[0] << 1) & 0xfefefefe;
607   out[1] = (out[1] << 1) & 0xfefefefe;
608   */
609
610   _des_crypt_keysetup (out[0], out[1], Kc, Kd, s_skb);
611
612   tmps[gid].Kc[ 0] = Kc[ 0];
613   tmps[gid].Kc[ 1] = Kc[ 1];
614   tmps[gid].Kc[ 2] = Kc[ 2];
615   tmps[gid].Kc[ 3] = Kc[ 3];
616   tmps[gid].Kc[ 4] = Kc[ 4];
617   tmps[gid].Kc[ 5] = Kc[ 5];
618   tmps[gid].Kc[ 6] = Kc[ 6];
619   tmps[gid].Kc[ 7] = Kc[ 7];
620   tmps[gid].Kc[ 8] = Kc[ 8];
621   tmps[gid].Kc[ 9] = Kc[ 9];
622   tmps[gid].Kc[10] = Kc[10];
623   tmps[gid].Kc[11] = Kc[11];
624   tmps[gid].Kc[12] = Kc[12];
625   tmps[gid].Kc[13] = Kc[13];
626   tmps[gid].Kc[14] = Kc[14];
627   tmps[gid].Kc[15] = Kc[15];
628
629   tmps[gid].Kd[ 0] = Kd[ 0];
630   tmps[gid].Kd[ 1] = Kd[ 1];
631   tmps[gid].Kd[ 2] = Kd[ 2];
632   tmps[gid].Kd[ 3] = Kd[ 3];
633   tmps[gid].Kd[ 4] = Kd[ 4];
634   tmps[gid].Kd[ 5] = Kd[ 5];
635   tmps[gid].Kd[ 6] = Kd[ 6];
636   tmps[gid].Kd[ 7] = Kd[ 7];
637   tmps[gid].Kd[ 8] = Kd[ 8];
638   tmps[gid].Kd[ 9] = Kd[ 9];
639   tmps[gid].Kd[10] = Kd[10];
640   tmps[gid].Kd[11] = Kd[11];
641   tmps[gid].Kd[12] = Kd[12];
642   tmps[gid].Kd[13] = Kd[13];
643   tmps[gid].Kd[14] = Kd[14];
644   tmps[gid].Kd[15] = Kd[15];
645
646   tmps[gid].iv[0] = 0;
647   tmps[gid].iv[1] = 0;
648 }
649
650 __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)
651 {
652   /**
653    * base
654    */
655
656   const u32 gid = get_global_id (0);
657   const u32 lid = get_local_id (0);
658   const u32 lsz = get_local_size (0);
659
660   /**
661    * sbox
662    */
663
664   __local u32 s_SPtrans[8][64];
665   __local u32 s_skb[8][64];
666
667   for (u32 i = lid; i < 64; i += lsz)
668   {
669     s_SPtrans[0][i] = c_SPtrans[0][i];
670     s_SPtrans[1][i] = c_SPtrans[1][i];
671     s_SPtrans[2][i] = c_SPtrans[2][i];
672     s_SPtrans[3][i] = c_SPtrans[3][i];
673     s_SPtrans[4][i] = c_SPtrans[4][i];
674     s_SPtrans[5][i] = c_SPtrans[5][i];
675     s_SPtrans[6][i] = c_SPtrans[6][i];
676     s_SPtrans[7][i] = c_SPtrans[7][i];
677
678     s_skb[0][i] = c_skb[0][i];
679     s_skb[1][i] = c_skb[1][i];
680     s_skb[2][i] = c_skb[2][i];
681     s_skb[3][i] = c_skb[3][i];
682     s_skb[4][i] = c_skb[4][i];
683     s_skb[5][i] = c_skb[5][i];
684     s_skb[6][i] = c_skb[6][i];
685     s_skb[7][i] = c_skb[7][i];
686   }
687
688   barrier (CLK_LOCAL_MEM_FENCE);
689
690   if (gid >= gid_max) return;
691
692   /**
693    * main
694    */
695
696   u32 Kc[16];
697
698   Kc[ 0] = tmps[gid].Kc[ 0];
699   Kc[ 1] = tmps[gid].Kc[ 1];
700   Kc[ 2] = tmps[gid].Kc[ 2];
701   Kc[ 3] = tmps[gid].Kc[ 3];
702   Kc[ 4] = tmps[gid].Kc[ 4];
703   Kc[ 5] = tmps[gid].Kc[ 5];
704   Kc[ 6] = tmps[gid].Kc[ 6];
705   Kc[ 7] = tmps[gid].Kc[ 7];
706   Kc[ 8] = tmps[gid].Kc[ 8];
707   Kc[ 9] = tmps[gid].Kc[ 9];
708   Kc[10] = tmps[gid].Kc[10];
709   Kc[11] = tmps[gid].Kc[11];
710   Kc[12] = tmps[gid].Kc[12];
711   Kc[13] = tmps[gid].Kc[13];
712   Kc[14] = tmps[gid].Kc[14];
713   Kc[15] = tmps[gid].Kc[15];
714
715   u32 Kd[16];
716
717   Kd[ 0] = tmps[gid].Kd[ 0];
718   Kd[ 1] = tmps[gid].Kd[ 1];
719   Kd[ 2] = tmps[gid].Kd[ 2];
720   Kd[ 3] = tmps[gid].Kd[ 3];
721   Kd[ 4] = tmps[gid].Kd[ 4];
722   Kd[ 5] = tmps[gid].Kd[ 5];
723   Kd[ 6] = tmps[gid].Kd[ 6];
724   Kd[ 7] = tmps[gid].Kd[ 7];
725   Kd[ 8] = tmps[gid].Kd[ 8];
726   Kd[ 9] = tmps[gid].Kd[ 9];
727   Kd[10] = tmps[gid].Kd[10];
728   Kd[11] = tmps[gid].Kd[11];
729   Kd[12] = tmps[gid].Kd[12];
730   Kd[13] = tmps[gid].Kd[13];
731   Kd[14] = tmps[gid].Kd[14];
732   Kd[15] = tmps[gid].Kd[15];
733
734   u32 iv[2];
735
736   iv[0] = tmps[gid].iv[0];
737   iv[1] = tmps[gid].iv[1];
738
739   const u32 mask = salt_bufs[salt_pos].salt_buf[0];
740
741   _des_crypt_encrypt (iv, mask, loop_cnt, Kc, Kd, s_SPtrans);
742
743   tmps[gid].Kc[ 0] = Kc[ 0];
744   tmps[gid].Kc[ 1] = Kc[ 1];
745   tmps[gid].Kc[ 2] = Kc[ 2];
746   tmps[gid].Kc[ 3] = Kc[ 3];
747   tmps[gid].Kc[ 4] = Kc[ 4];
748   tmps[gid].Kc[ 5] = Kc[ 5];
749   tmps[gid].Kc[ 6] = Kc[ 6];
750   tmps[gid].Kc[ 7] = Kc[ 7];
751   tmps[gid].Kc[ 8] = Kc[ 8];
752   tmps[gid].Kc[ 9] = Kc[ 9];
753   tmps[gid].Kc[10] = Kc[10];
754   tmps[gid].Kc[11] = Kc[11];
755   tmps[gid].Kc[12] = Kc[12];
756   tmps[gid].Kc[13] = Kc[13];
757   tmps[gid].Kc[14] = Kc[14];
758   tmps[gid].Kc[15] = Kc[15];
759
760   tmps[gid].Kd[ 0] = Kd[ 0];
761   tmps[gid].Kd[ 1] = Kd[ 1];
762   tmps[gid].Kd[ 2] = Kd[ 2];
763   tmps[gid].Kd[ 3] = Kd[ 3];
764   tmps[gid].Kd[ 4] = Kd[ 4];
765   tmps[gid].Kd[ 5] = Kd[ 5];
766   tmps[gid].Kd[ 6] = Kd[ 6];
767   tmps[gid].Kd[ 7] = Kd[ 7];
768   tmps[gid].Kd[ 8] = Kd[ 8];
769   tmps[gid].Kd[ 9] = Kd[ 9];
770   tmps[gid].Kd[10] = Kd[10];
771   tmps[gid].Kd[11] = Kd[11];
772   tmps[gid].Kd[12] = Kd[12];
773   tmps[gid].Kd[13] = Kd[13];
774   tmps[gid].Kd[14] = Kd[14];
775   tmps[gid].Kd[15] = Kd[15];
776
777   tmps[gid].iv[0] = iv[0];
778   tmps[gid].iv[1] = iv[1];
779 }
780
781 __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)
782 {
783   /**
784    * base
785    */
786
787   const u32 gid = get_global_id (0);
788
789   if (gid >= gid_max) return;
790
791   const u32 lid = get_local_id (0);
792
793   const u32 r0 = tmps[gid].iv[0];
794   const u32 r1 = tmps[gid].iv[1];
795   const u32 r2 = 0;
796   const u32 r3 = 0;
797
798   #define il_pos 0
799
800   #include COMPARE_M
801 }