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