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