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