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