- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[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 #ifdef VECT_SIZE1
327 #define BOX(i,n,S) (u32x) ((S)[(n)][(i)])
328 #endif
329
330 #ifdef VECT_SIZE2
331 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
332 #endif
333
334 #ifdef VECT_SIZE4
335 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
336 #endif
337
338 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
339 {
340   u32 tt;
341
342   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
343   HPERM_OP (c,    tt, 2, 0xcccc0000);
344   HPERM_OP (d,    tt, 2, 0xcccc0000);
345   PERM_OP  (d, c, tt, 1, 0x55555555);
346   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
347   PERM_OP  (d, c, tt, 1, 0x55555555);
348
349   d = ((d & 0x000000ff) << 16)
350     | ((d & 0x0000ff00) <<  0)
351     | ((d & 0x00ff0000) >> 16)
352     | ((c & 0xf0000000) >>  4);
353
354   c = c & 0x0fffffff;
355
356   #pragma unroll
357   for (u32 i = 0; i < 16; i++)
358   {
359     c = c >> shifts3s0[i] | c << shifts3s1[i];
360     d = d >> shifts3s0[i] | d << shifts3s1[i];
361
362     c = c & 0x0fffffff;
363     d = d & 0x0fffffff;
364
365     const u32 c00 = (c >>  0) & 0x0000003f;
366     const u32 c06 = (c >>  6) & 0x00383003;
367     const u32 c07 = (c >>  7) & 0x0000003c;
368     const u32 c13 = (c >> 13) & 0x0000060f;
369     const u32 c20 = (c >> 20) & 0x00000001;
370
371     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
372             | BOX (((c06 >>  0) & 0xff)
373                   |((c07 >>  0) & 0xff), 1, s_skb)
374             | BOX (((c13 >>  0) & 0xff)
375                   |((c06 >>  8) & 0xff), 2, s_skb)
376             | BOX (((c20 >>  0) & 0xff)
377                   |((c13 >>  8) & 0xff)
378                   |((c06 >> 16) & 0xff), 3, s_skb);
379
380     const u32 d00 = (d >>  0) & 0x00003c3f;
381     const u32 d07 = (d >>  7) & 0x00003f03;
382     const u32 d21 = (d >> 21) & 0x0000000f;
383     const u32 d22 = (d >> 22) & 0x00000030;
384
385     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
386             | BOX (((d07 >>  0) & 0xff)
387                   |((d00 >>  8) & 0xff), 5, s_skb)
388             | BOX (((d07 >>  8) & 0xff), 6, s_skb)
389             | BOX (((d21 >>  0) & 0xff)
390                   |((d22 >>  0) & 0xff), 7, s_skb);
391
392     Kc[i] = ((t << 16) | (s & 0x0000ffff));
393     Kd[i] = ((s >> 16) | (t & 0xffff0000));
394   }
395 }
396
397 static void _des_crypt_encrypt (u32 iv[2], u32 mask, u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
398 {
399   const u32 E1 = (mask >> 2) & 0x3f0;
400   const u32 E0 = mask & 0x3f;
401
402   u32 r = 0;
403   u32 l = 0;
404
405   for (u32 i = 0; i < 25; i++)
406   {
407     for (u32 j = 0; j < 16; j += 2)
408     {
409       u32 t;
410       u32 u;
411
412       t = r ^ (r >> 16);
413       u = t & E0;
414       t = t & E1;
415       u = u ^ (u << 16);
416       u = u ^ r;
417       u = u ^ Kc[j + 0];
418       t = t ^ (t << 16);
419       t = t ^ r;
420       t = rotl32 (t, 28u);
421       t = t ^ Kd[j + 0];
422
423       l = l
424         ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
425         ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
426         ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
427         ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
428         ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
429         ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
430         ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
431         ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
432
433       t = l ^ (l >> 16);
434       u = t & E0;
435       t = t & E1;
436       u = u ^ (u << 16);
437       u = u ^ l;
438       u = u ^ Kc[j + 1];
439       t = t ^ (t << 16);
440       t = t ^ l;
441       t = rotl32 (t, 28u);
442       t = t ^ Kd[j + 1];
443
444       r = r
445         ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
446         ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
447         ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
448         ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
449         ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
450         ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
451         ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
452         ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
453     }
454
455     u32 tt;
456
457     tt = l;
458     l  = r;
459     r  = tt;
460   }
461
462   iv[0] = rotl32 (r, 31);
463   iv[1] = rotl32 (l, 31);
464 }
465
466 __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)
467 {
468   /**
469    * modifier
470    */
471
472   const u32 lid = get_local_id (0);
473
474   /**
475    * base
476    */
477
478   const u32 gid = get_global_id (0);
479
480   u32 wordl0[4];
481
482   wordl0[0] = pws[gid].i[ 0];
483   wordl0[1] = pws[gid].i[ 1];
484   wordl0[2] = 0;
485   wordl0[3] = 0;
486
487   u32 wordl1[4];
488
489   wordl1[0] = 0;
490   wordl1[1] = 0;
491   wordl1[2] = 0;
492   wordl1[3] = 0;
493
494   u32 wordl2[4];
495
496   wordl2[0] = 0;
497   wordl2[1] = 0;
498   wordl2[2] = 0;
499   wordl2[3] = 0;
500
501   u32 wordl3[4];
502
503   wordl3[0] = 0;
504   wordl3[1] = 0;
505   wordl3[2] = 0;
506   wordl3[3] = 0;
507
508   const u32 pw_l_len = pws[gid].pw_len;
509
510   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
511   {
512     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
513   }
514
515   /**
516    * modifier
517    */
518
519   __local u32 s_SPtrans[8][64];
520
521   __local u32 s_skb[8][64];
522
523   s_SPtrans[0][lid] = c_SPtrans[0][lid];
524   s_SPtrans[1][lid] = c_SPtrans[1][lid];
525   s_SPtrans[2][lid] = c_SPtrans[2][lid];
526   s_SPtrans[3][lid] = c_SPtrans[3][lid];
527   s_SPtrans[4][lid] = c_SPtrans[4][lid];
528   s_SPtrans[5][lid] = c_SPtrans[5][lid];
529   s_SPtrans[6][lid] = c_SPtrans[6][lid];
530   s_SPtrans[7][lid] = c_SPtrans[7][lid];
531
532   s_skb[0][lid] = c_skb[0][lid];
533   s_skb[1][lid] = c_skb[1][lid];
534   s_skb[2][lid] = c_skb[2][lid];
535   s_skb[3][lid] = c_skb[3][lid];
536   s_skb[4][lid] = c_skb[4][lid];
537   s_skb[5][lid] = c_skb[5][lid];
538   s_skb[6][lid] = c_skb[6][lid];
539   s_skb[7][lid] = c_skb[7][lid];
540
541   barrier (CLK_LOCAL_MEM_FENCE);
542
543   if (gid >= gid_max) return;
544
545   /**
546    * salt
547    */
548
549   const u32 mask = salt_bufs[salt_pos].salt_buf[0];
550
551   /**
552    * main
553    */
554
555   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
556   {
557     const u32 pw_r_len = combs_buf[il_pos].pw_len;
558
559     u32 pw_len = pw_l_len + pw_r_len;
560
561     pw_len = (pw_len >= 8) ? 8 : pw_len;
562
563     u32 wordr0[4];
564
565     wordr0[0] = combs_buf[il_pos].i[0];
566     wordr0[1] = combs_buf[il_pos].i[1];
567     wordr0[2] = 0;
568     wordr0[3] = 0;
569
570     u32 wordr1[4];
571
572     wordr1[0] = 0;
573     wordr1[1] = 0;
574     wordr1[2] = 0;
575     wordr1[3] = 0;
576
577     u32 wordr2[4];
578
579     wordr2[0] = 0;
580     wordr2[1] = 0;
581     wordr2[2] = 0;
582     wordr2[3] = 0;
583
584     u32 wordr3[4];
585
586     wordr3[0] = 0;
587     wordr3[1] = 0;
588     wordr3[2] = 0;
589     wordr3[3] = 0;
590
591     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
592     {
593       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
594     }
595
596     u32 w0[4];
597
598     w0[0] = wordl0[0] | wordr0[0];
599     w0[1] = wordl0[1] | wordr0[1];
600     w0[2] = 0;
601     w0[3] = 0;
602
603     u32 w1[4];
604
605     w1[0] = 0;
606     w1[1] = 0;
607     w1[2] = 0;
608     w1[3] = 0;
609
610     u32 w2[4];
611
612     w2[0] = 0;
613     w2[1] = 0;
614     w2[2] = 0;
615     w2[3] = 0;
616
617     u32 w3[4];
618
619     w3[0] = 0;
620     w3[1] = 0;
621     w3[2] = 0;
622     w3[3] = 0;
623
624     u32 data[2];
625
626     data[0] = (w0[0] << 1) & 0xfefefefe;
627     data[1] = (w0[1] << 1) & 0xfefefefe;
628
629     u32 Kc[16];
630     u32 Kd[16];
631
632     _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb);
633
634     u32 iv[2];
635
636     _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans);
637
638     const u32 r0 = iv[0];
639     const u32 r1 = iv[1];
640     const u32 r2 = 0;
641     const u32 r3 = 0;
642
643     #include COMPARE_M
644   }
645 }
646
647 __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)
648 {
649 }
650
651 __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)
652 {
653 }
654
655 __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)
656 {
657   /**
658    * modifier
659    */
660
661   const u32 lid = get_local_id (0);
662
663   /**
664    * base
665    */
666
667   const u32 gid = get_global_id (0);
668
669   u32 wordl0[4];
670
671   wordl0[0] = pws[gid].i[ 0];
672   wordl0[1] = pws[gid].i[ 1];
673   wordl0[2] = 0;
674   wordl0[3] = 0;
675
676   u32 wordl1[4];
677
678   wordl1[0] = 0;
679   wordl1[1] = 0;
680   wordl1[2] = 0;
681   wordl1[3] = 0;
682
683   u32 wordl2[4];
684
685   wordl2[0] = 0;
686   wordl2[1] = 0;
687   wordl2[2] = 0;
688   wordl2[3] = 0;
689
690   u32 wordl3[4];
691
692   wordl3[0] = 0;
693   wordl3[1] = 0;
694   wordl3[2] = 0;
695   wordl3[3] = 0;
696
697   const u32 pw_l_len = pws[gid].pw_len;
698
699   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
700   {
701     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
702   }
703
704   /**
705    * modifier
706    */
707
708   __local u32 s_SPtrans[8][64];
709
710   __local u32 s_skb[8][64];
711
712   s_SPtrans[0][lid] = c_SPtrans[0][lid];
713   s_SPtrans[1][lid] = c_SPtrans[1][lid];
714   s_SPtrans[2][lid] = c_SPtrans[2][lid];
715   s_SPtrans[3][lid] = c_SPtrans[3][lid];
716   s_SPtrans[4][lid] = c_SPtrans[4][lid];
717   s_SPtrans[5][lid] = c_SPtrans[5][lid];
718   s_SPtrans[6][lid] = c_SPtrans[6][lid];
719   s_SPtrans[7][lid] = c_SPtrans[7][lid];
720
721   s_skb[0][lid] = c_skb[0][lid];
722   s_skb[1][lid] = c_skb[1][lid];
723   s_skb[2][lid] = c_skb[2][lid];
724   s_skb[3][lid] = c_skb[3][lid];
725   s_skb[4][lid] = c_skb[4][lid];
726   s_skb[5][lid] = c_skb[5][lid];
727   s_skb[6][lid] = c_skb[6][lid];
728   s_skb[7][lid] = c_skb[7][lid];
729
730   barrier (CLK_LOCAL_MEM_FENCE);
731
732   if (gid >= gid_max) return;
733
734   /**
735    * salt
736    */
737
738   const u32 mask = salt_bufs[salt_pos].salt_buf[0];
739
740   /**
741    * digest
742    */
743
744   const u32 search[4] =
745   {
746     digests_buf[digests_offset].digest_buf[DGST_R0],
747     digests_buf[digests_offset].digest_buf[DGST_R1],
748     digests_buf[digests_offset].digest_buf[DGST_R2],
749     digests_buf[digests_offset].digest_buf[DGST_R3]
750   };
751
752   /**
753    * main
754    */
755
756   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
757   {
758     const u32 pw_r_len = combs_buf[il_pos].pw_len;
759
760     u32 pw_len = pw_l_len + pw_r_len;
761
762     pw_len = (pw_len >= 8) ? 8 : pw_len;
763
764     u32 wordr0[4];
765
766     wordr0[0] = combs_buf[il_pos].i[0];
767     wordr0[1] = combs_buf[il_pos].i[1];
768     wordr0[2] = 0;
769     wordr0[3] = 0;
770
771     u32 wordr1[4];
772
773     wordr1[0] = 0;
774     wordr1[1] = 0;
775     wordr1[2] = 0;
776     wordr1[3] = 0;
777
778     u32 wordr2[4];
779
780     wordr2[0] = 0;
781     wordr2[1] = 0;
782     wordr2[2] = 0;
783     wordr2[3] = 0;
784
785     u32 wordr3[4];
786
787     wordr3[0] = 0;
788     wordr3[1] = 0;
789     wordr3[2] = 0;
790     wordr3[3] = 0;
791
792     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
793     {
794       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
795     }
796
797     u32 w0[4];
798
799     w0[0] = wordl0[0] | wordr0[0];
800     w0[1] = wordl0[1] | wordr0[1];
801     w0[2] = 0;
802     w0[3] = 0;
803
804     u32 w1[4];
805
806     w1[0] = 0;
807     w1[1] = 0;
808     w1[2] = 0;
809     w1[3] = 0;
810
811     u32 w2[4];
812
813     w2[0] = 0;
814     w2[1] = 0;
815     w2[2] = 0;
816     w2[3] = 0;
817
818     u32 w3[4];
819
820     w3[0] = 0;
821     w3[1] = 0;
822     w3[2] = 0;
823     w3[3] = 0;
824
825     u32 data[2];
826
827     data[0] = (w0[0] << 1) & 0xfefefefe;
828     data[1] = (w0[1] << 1) & 0xfefefefe;
829
830     u32 Kc[16];
831     u32 Kd[16];
832
833     _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb);
834
835     u32 iv[2];
836
837     _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans);
838
839     const u32 r0 = iv[0];
840     const u32 r1 = iv[1];
841     const u32 r2 = 0;
842     const u32 r3 = 0;
843
844     #include COMPARE_S
845   }
846 }
847
848 __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)
849 {
850 }
851
852 __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)
853 {
854 }