Zero pws_buf before reuse
[hashcat.git] / OpenCL / m08500_a1.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *
5  * License.....: MIT
6  */
7
8 #define _DES_
9
10 #define NEW_SIMD_CODE
11
12 #include "include/constants.h"
13 #include "include/kernel_vendor.h"
14
15 #define DGST_R0 0
16 #define DGST_R1 1
17 #define DGST_R2 2
18 #define DGST_R3 3
19
20 #include "include/kernel_functions.c"
21 #include "OpenCL/types_ocl.c"
22 #include "OpenCL/common.c"
23 #include "OpenCL/simd.c"
24
25 #define PERM_OP(a,b,tt,n,m) \
26 {                           \
27   tt = a >> n;              \
28   tt = tt ^ b;              \
29   tt = tt & m;              \
30   b = b ^ tt;               \
31   tt = tt << n;             \
32   a = a ^ tt;               \
33 }
34
35 #define HPERM_OP(a,tt,n,m)  \
36 {                           \
37   tt = a << (16 + n);       \
38   tt = tt ^ a;              \
39   tt = tt & m;              \
40   a  = a ^ tt;              \
41   tt = tt >> (16 + n);      \
42   a  = a ^ tt;              \
43 }
44
45 #define IP(l,r,tt)                     \
46 {                                      \
47   PERM_OP (r, l, tt,  4, 0x0f0f0f0f);  \
48   PERM_OP (l, r, tt, 16, 0x0000ffff);  \
49   PERM_OP (r, l, tt,  2, 0x33333333);  \
50   PERM_OP (l, r, tt,  8, 0x00ff00ff);  \
51   PERM_OP (r, l, tt,  1, 0x55555555);  \
52 }
53
54 #define FP(l,r,tt)                     \
55 {                                      \
56   PERM_OP (l, r, tt,  1, 0x55555555);  \
57   PERM_OP (r, l, tt,  8, 0x00ff00ff);  \
58   PERM_OP (l, r, tt,  2, 0x33333333);  \
59   PERM_OP (r, l, tt, 16, 0x0000ffff);  \
60   PERM_OP (l, r, tt,  4, 0x0f0f0f0f);  \
61 }
62
63 __constant u8 ascii_to_ebcdic_pc[256] =
64 {
65   // little hack, can't crack 0-bytes in password, but who cares
66   //    0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5,
67   0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5,
68   0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94,
69   0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68,
70   0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75,
71   0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07,
72   0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70,
73   0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86,
74   0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4,
75   0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d,
76   0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68,
77   0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04,
78   0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40,
79   0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97,
80   0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4,
81   0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c,
82   0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54,
83 };
84
85 __constant u32 c_SPtrans[8][64] =
86 {
87   {
88     0x02080800, 0x00080000, 0x02000002, 0x02080802,
89     0x02000000, 0x00080802, 0x00080002, 0x02000002,
90     0x00080802, 0x02080800, 0x02080000, 0x00000802,
91     0x02000802, 0x02000000, 0x00000000, 0x00080002,
92     0x00080000, 0x00000002, 0x02000800, 0x00080800,
93     0x02080802, 0x02080000, 0x00000802, 0x02000800,
94     0x00000002, 0x00000800, 0x00080800, 0x02080002,
95     0x00000800, 0x02000802, 0x02080002, 0x00000000,
96     0x00000000, 0x02080802, 0x02000800, 0x00080002,
97     0x02080800, 0x00080000, 0x00000802, 0x02000800,
98     0x02080002, 0x00000800, 0x00080800, 0x02000002,
99     0x00080802, 0x00000002, 0x02000002, 0x02080000,
100     0x02080802, 0x00080800, 0x02080000, 0x02000802,
101     0x02000000, 0x00000802, 0x00080002, 0x00000000,
102     0x00080000, 0x02000000, 0x02000802, 0x02080800,
103     0x00000002, 0x02080002, 0x00000800, 0x00080802,
104   },
105   {
106     0x40108010, 0x00000000, 0x00108000, 0x40100000,
107     0x40000010, 0x00008010, 0x40008000, 0x00108000,
108     0x00008000, 0x40100010, 0x00000010, 0x40008000,
109     0x00100010, 0x40108000, 0x40100000, 0x00000010,
110     0x00100000, 0x40008010, 0x40100010, 0x00008000,
111     0x00108010, 0x40000000, 0x00000000, 0x00100010,
112     0x40008010, 0x00108010, 0x40108000, 0x40000010,
113     0x40000000, 0x00100000, 0x00008010, 0x40108010,
114     0x00100010, 0x40108000, 0x40008000, 0x00108010,
115     0x40108010, 0x00100010, 0x40000010, 0x00000000,
116     0x40000000, 0x00008010, 0x00100000, 0x40100010,
117     0x00008000, 0x40000000, 0x00108010, 0x40008010,
118     0x40108000, 0x00008000, 0x00000000, 0x40000010,
119     0x00000010, 0x40108010, 0x00108000, 0x40100000,
120     0x40100010, 0x00100000, 0x00008010, 0x40008000,
121     0x40008010, 0x00000010, 0x40100000, 0x00108000,
122   },
123   {
124     0x04000001, 0x04040100, 0x00000100, 0x04000101,
125     0x00040001, 0x04000000, 0x04000101, 0x00040100,
126     0x04000100, 0x00040000, 0x04040000, 0x00000001,
127     0x04040101, 0x00000101, 0x00000001, 0x04040001,
128     0x00000000, 0x00040001, 0x04040100, 0x00000100,
129     0x00000101, 0x04040101, 0x00040000, 0x04000001,
130     0x04040001, 0x04000100, 0x00040101, 0x04040000,
131     0x00040100, 0x00000000, 0x04000000, 0x00040101,
132     0x04040100, 0x00000100, 0x00000001, 0x00040000,
133     0x00000101, 0x00040001, 0x04040000, 0x04000101,
134     0x00000000, 0x04040100, 0x00040100, 0x04040001,
135     0x00040001, 0x04000000, 0x04040101, 0x00000001,
136     0x00040101, 0x04000001, 0x04000000, 0x04040101,
137     0x00040000, 0x04000100, 0x04000101, 0x00040100,
138     0x04000100, 0x00000000, 0x04040001, 0x00000101,
139     0x04000001, 0x00040101, 0x00000100, 0x04040000,
140   },
141   {
142     0x00401008, 0x10001000, 0x00000008, 0x10401008,
143     0x00000000, 0x10400000, 0x10001008, 0x00400008,
144     0x10401000, 0x10000008, 0x10000000, 0x00001008,
145     0x10000008, 0x00401008, 0x00400000, 0x10000000,
146     0x10400008, 0x00401000, 0x00001000, 0x00000008,
147     0x00401000, 0x10001008, 0x10400000, 0x00001000,
148     0x00001008, 0x00000000, 0x00400008, 0x10401000,
149     0x10001000, 0x10400008, 0x10401008, 0x00400000,
150     0x10400008, 0x00001008, 0x00400000, 0x10000008,
151     0x00401000, 0x10001000, 0x00000008, 0x10400000,
152     0x10001008, 0x00000000, 0x00001000, 0x00400008,
153     0x00000000, 0x10400008, 0x10401000, 0x00001000,
154     0x10000000, 0x10401008, 0x00401008, 0x00400000,
155     0x10401008, 0x00000008, 0x10001000, 0x00401008,
156     0x00400008, 0x00401000, 0x10400000, 0x10001008,
157     0x00001008, 0x10000000, 0x10000008, 0x10401000,
158   },
159   {
160     0x08000000, 0x00010000, 0x00000400, 0x08010420,
161     0x08010020, 0x08000400, 0x00010420, 0x08010000,
162     0x00010000, 0x00000020, 0x08000020, 0x00010400,
163     0x08000420, 0x08010020, 0x08010400, 0x00000000,
164     0x00010400, 0x08000000, 0x00010020, 0x00000420,
165     0x08000400, 0x00010420, 0x00000000, 0x08000020,
166     0x00000020, 0x08000420, 0x08010420, 0x00010020,
167     0x08010000, 0x00000400, 0x00000420, 0x08010400,
168     0x08010400, 0x08000420, 0x00010020, 0x08010000,
169     0x00010000, 0x00000020, 0x08000020, 0x08000400,
170     0x08000000, 0x00010400, 0x08010420, 0x00000000,
171     0x00010420, 0x08000000, 0x00000400, 0x00010020,
172     0x08000420, 0x00000400, 0x00000000, 0x08010420,
173     0x08010020, 0x08010400, 0x00000420, 0x00010000,
174     0x00010400, 0x08010020, 0x08000400, 0x00000420,
175     0x00000020, 0x00010420, 0x08010000, 0x08000020,
176   },
177   {
178     0x80000040, 0x00200040, 0x00000000, 0x80202000,
179     0x00200040, 0x00002000, 0x80002040, 0x00200000,
180     0x00002040, 0x80202040, 0x00202000, 0x80000000,
181     0x80002000, 0x80000040, 0x80200000, 0x00202040,
182     0x00200000, 0x80002040, 0x80200040, 0x00000000,
183     0x00002000, 0x00000040, 0x80202000, 0x80200040,
184     0x80202040, 0x80200000, 0x80000000, 0x00002040,
185     0x00000040, 0x00202000, 0x00202040, 0x80002000,
186     0x00002040, 0x80000000, 0x80002000, 0x00202040,
187     0x80202000, 0x00200040, 0x00000000, 0x80002000,
188     0x80000000, 0x00002000, 0x80200040, 0x00200000,
189     0x00200040, 0x80202040, 0x00202000, 0x00000040,
190     0x80202040, 0x00202000, 0x00200000, 0x80002040,
191     0x80000040, 0x80200000, 0x00202040, 0x00000000,
192     0x00002000, 0x80000040, 0x80002040, 0x80202000,
193     0x80200000, 0x00002040, 0x00000040, 0x80200040,
194   },
195   {
196     0x00004000, 0x00000200, 0x01000200, 0x01000004,
197     0x01004204, 0x00004004, 0x00004200, 0x00000000,
198     0x01000000, 0x01000204, 0x00000204, 0x01004000,
199     0x00000004, 0x01004200, 0x01004000, 0x00000204,
200     0x01000204, 0x00004000, 0x00004004, 0x01004204,
201     0x00000000, 0x01000200, 0x01000004, 0x00004200,
202     0x01004004, 0x00004204, 0x01004200, 0x00000004,
203     0x00004204, 0x01004004, 0x00000200, 0x01000000,
204     0x00004204, 0x01004000, 0x01004004, 0x00000204,
205     0x00004000, 0x00000200, 0x01000000, 0x01004004,
206     0x01000204, 0x00004204, 0x00004200, 0x00000000,
207     0x00000200, 0x01000004, 0x00000004, 0x01000200,
208     0x00000000, 0x01000204, 0x01000200, 0x00004200,
209     0x00000204, 0x00004000, 0x01004204, 0x01000000,
210     0x01004200, 0x00000004, 0x00004004, 0x01004204,
211     0x01000004, 0x01004200, 0x01004000, 0x00004004,
212   },
213   {
214     0x20800080, 0x20820000, 0x00020080, 0x00000000,
215     0x20020000, 0x00800080, 0x20800000, 0x20820080,
216     0x00000080, 0x20000000, 0x00820000, 0x00020080,
217     0x00820080, 0x20020080, 0x20000080, 0x20800000,
218     0x00020000, 0x00820080, 0x00800080, 0x20020000,
219     0x20820080, 0x20000080, 0x00000000, 0x00820000,
220     0x20000000, 0x00800000, 0x20020080, 0x20800080,
221     0x00800000, 0x00020000, 0x20820000, 0x00000080,
222     0x00800000, 0x00020000, 0x20000080, 0x20820080,
223     0x00020080, 0x20000000, 0x00000000, 0x00820000,
224     0x20800080, 0x20020080, 0x20020000, 0x00800080,
225     0x20820000, 0x00000080, 0x00800080, 0x20020000,
226     0x20820080, 0x00800000, 0x20800000, 0x20000080,
227     0x00820000, 0x00020080, 0x20020080, 0x20800000,
228     0x00000080, 0x20820000, 0x00820080, 0x00000000,
229     0x20000000, 0x20800080, 0x00020000, 0x00820080,
230   }
231 };
232
233 __constant u32 c_skb[8][64] =
234 {
235   {
236     0x00000000, 0x00000010, 0x20000000, 0x20000010,
237     0x00010000, 0x00010010, 0x20010000, 0x20010010,
238     0x00000800, 0x00000810, 0x20000800, 0x20000810,
239     0x00010800, 0x00010810, 0x20010800, 0x20010810,
240     0x00000020, 0x00000030, 0x20000020, 0x20000030,
241     0x00010020, 0x00010030, 0x20010020, 0x20010030,
242     0x00000820, 0x00000830, 0x20000820, 0x20000830,
243     0x00010820, 0x00010830, 0x20010820, 0x20010830,
244     0x00080000, 0x00080010, 0x20080000, 0x20080010,
245     0x00090000, 0x00090010, 0x20090000, 0x20090010,
246     0x00080800, 0x00080810, 0x20080800, 0x20080810,
247     0x00090800, 0x00090810, 0x20090800, 0x20090810,
248     0x00080020, 0x00080030, 0x20080020, 0x20080030,
249     0x00090020, 0x00090030, 0x20090020, 0x20090030,
250     0x00080820, 0x00080830, 0x20080820, 0x20080830,
251     0x00090820, 0x00090830, 0x20090820, 0x20090830,
252   },
253   {
254     0x00000000, 0x02000000, 0x00002000, 0x02002000,
255     0x00200000, 0x02200000, 0x00202000, 0x02202000,
256     0x00000004, 0x02000004, 0x00002004, 0x02002004,
257     0x00200004, 0x02200004, 0x00202004, 0x02202004,
258     0x00000400, 0x02000400, 0x00002400, 0x02002400,
259     0x00200400, 0x02200400, 0x00202400, 0x02202400,
260     0x00000404, 0x02000404, 0x00002404, 0x02002404,
261     0x00200404, 0x02200404, 0x00202404, 0x02202404,
262     0x10000000, 0x12000000, 0x10002000, 0x12002000,
263     0x10200000, 0x12200000, 0x10202000, 0x12202000,
264     0x10000004, 0x12000004, 0x10002004, 0x12002004,
265     0x10200004, 0x12200004, 0x10202004, 0x12202004,
266     0x10000400, 0x12000400, 0x10002400, 0x12002400,
267     0x10200400, 0x12200400, 0x10202400, 0x12202400,
268     0x10000404, 0x12000404, 0x10002404, 0x12002404,
269     0x10200404, 0x12200404, 0x10202404, 0x12202404,
270   },
271   {
272     0x00000000, 0x00000001, 0x00040000, 0x00040001,
273     0x01000000, 0x01000001, 0x01040000, 0x01040001,
274     0x00000002, 0x00000003, 0x00040002, 0x00040003,
275     0x01000002, 0x01000003, 0x01040002, 0x01040003,
276     0x00000200, 0x00000201, 0x00040200, 0x00040201,
277     0x01000200, 0x01000201, 0x01040200, 0x01040201,
278     0x00000202, 0x00000203, 0x00040202, 0x00040203,
279     0x01000202, 0x01000203, 0x01040202, 0x01040203,
280     0x08000000, 0x08000001, 0x08040000, 0x08040001,
281     0x09000000, 0x09000001, 0x09040000, 0x09040001,
282     0x08000002, 0x08000003, 0x08040002, 0x08040003,
283     0x09000002, 0x09000003, 0x09040002, 0x09040003,
284     0x08000200, 0x08000201, 0x08040200, 0x08040201,
285     0x09000200, 0x09000201, 0x09040200, 0x09040201,
286     0x08000202, 0x08000203, 0x08040202, 0x08040203,
287     0x09000202, 0x09000203, 0x09040202, 0x09040203,
288   },
289   {
290     0x00000000, 0x00100000, 0x00000100, 0x00100100,
291     0x00000008, 0x00100008, 0x00000108, 0x00100108,
292     0x00001000, 0x00101000, 0x00001100, 0x00101100,
293     0x00001008, 0x00101008, 0x00001108, 0x00101108,
294     0x04000000, 0x04100000, 0x04000100, 0x04100100,
295     0x04000008, 0x04100008, 0x04000108, 0x04100108,
296     0x04001000, 0x04101000, 0x04001100, 0x04101100,
297     0x04001008, 0x04101008, 0x04001108, 0x04101108,
298     0x00020000, 0x00120000, 0x00020100, 0x00120100,
299     0x00020008, 0x00120008, 0x00020108, 0x00120108,
300     0x00021000, 0x00121000, 0x00021100, 0x00121100,
301     0x00021008, 0x00121008, 0x00021108, 0x00121108,
302     0x04020000, 0x04120000, 0x04020100, 0x04120100,
303     0x04020008, 0x04120008, 0x04020108, 0x04120108,
304     0x04021000, 0x04121000, 0x04021100, 0x04121100,
305     0x04021008, 0x04121008, 0x04021108, 0x04121108,
306   },
307   {
308     0x00000000, 0x10000000, 0x00010000, 0x10010000,
309     0x00000004, 0x10000004, 0x00010004, 0x10010004,
310     0x20000000, 0x30000000, 0x20010000, 0x30010000,
311     0x20000004, 0x30000004, 0x20010004, 0x30010004,
312     0x00100000, 0x10100000, 0x00110000, 0x10110000,
313     0x00100004, 0x10100004, 0x00110004, 0x10110004,
314     0x20100000, 0x30100000, 0x20110000, 0x30110000,
315     0x20100004, 0x30100004, 0x20110004, 0x30110004,
316     0x00001000, 0x10001000, 0x00011000, 0x10011000,
317     0x00001004, 0x10001004, 0x00011004, 0x10011004,
318     0x20001000, 0x30001000, 0x20011000, 0x30011000,
319     0x20001004, 0x30001004, 0x20011004, 0x30011004,
320     0x00101000, 0x10101000, 0x00111000, 0x10111000,
321     0x00101004, 0x10101004, 0x00111004, 0x10111004,
322     0x20101000, 0x30101000, 0x20111000, 0x30111000,
323     0x20101004, 0x30101004, 0x20111004, 0x30111004,
324   },
325   {
326     0x00000000, 0x08000000, 0x00000008, 0x08000008,
327     0x00000400, 0x08000400, 0x00000408, 0x08000408,
328     0x00020000, 0x08020000, 0x00020008, 0x08020008,
329     0x00020400, 0x08020400, 0x00020408, 0x08020408,
330     0x00000001, 0x08000001, 0x00000009, 0x08000009,
331     0x00000401, 0x08000401, 0x00000409, 0x08000409,
332     0x00020001, 0x08020001, 0x00020009, 0x08020009,
333     0x00020401, 0x08020401, 0x00020409, 0x08020409,
334     0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
335     0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
336     0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
337     0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
338     0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
339     0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
340     0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
341     0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
342   },
343   {
344     0x00000000, 0x00000100, 0x00080000, 0x00080100,
345     0x01000000, 0x01000100, 0x01080000, 0x01080100,
346     0x00000010, 0x00000110, 0x00080010, 0x00080110,
347     0x01000010, 0x01000110, 0x01080010, 0x01080110,
348     0x00200000, 0x00200100, 0x00280000, 0x00280100,
349     0x01200000, 0x01200100, 0x01280000, 0x01280100,
350     0x00200010, 0x00200110, 0x00280010, 0x00280110,
351     0x01200010, 0x01200110, 0x01280010, 0x01280110,
352     0x00000200, 0x00000300, 0x00080200, 0x00080300,
353     0x01000200, 0x01000300, 0x01080200, 0x01080300,
354     0x00000210, 0x00000310, 0x00080210, 0x00080310,
355     0x01000210, 0x01000310, 0x01080210, 0x01080310,
356     0x00200200, 0x00200300, 0x00280200, 0x00280300,
357     0x01200200, 0x01200300, 0x01280200, 0x01280300,
358     0x00200210, 0x00200310, 0x00280210, 0x00280310,
359     0x01200210, 0x01200310, 0x01280210, 0x01280310,
360   },
361   {
362     0x00000000, 0x04000000, 0x00040000, 0x04040000,
363     0x00000002, 0x04000002, 0x00040002, 0x04040002,
364     0x00002000, 0x04002000, 0x00042000, 0x04042000,
365     0x00002002, 0x04002002, 0x00042002, 0x04042002,
366     0x00000020, 0x04000020, 0x00040020, 0x04040020,
367     0x00000022, 0x04000022, 0x00040022, 0x04040022,
368     0x00002020, 0x04002020, 0x00042020, 0x04042020,
369     0x00002022, 0x04002022, 0x00042022, 0x04042022,
370     0x00000800, 0x04000800, 0x00040800, 0x04040800,
371     0x00000802, 0x04000802, 0x00040802, 0x04040802,
372     0x00002800, 0x04002800, 0x00042800, 0x04042800,
373     0x00002802, 0x04002802, 0x00042802, 0x04042802,
374     0x00000820, 0x04000820, 0x00040820, 0x04040820,
375     0x00000822, 0x04000822, 0x00040822, 0x04040822,
376     0x00002820, 0x04002820, 0x00042820, 0x04042820,
377     0x00002822, 0x04002822, 0x00042822, 0x04042822
378   }
379 };
380
381 #define BOX(i,n,S) (S)[(n)][(i)]
382
383 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64])
384 {
385   u32 tt;
386
387   u32 r = data[0];
388   u32 l = data[1];
389
390   #pragma unroll 16
391   for (u32 i = 0; i < 16; i += 2)
392   {
393     u32 u;
394     u32 t;
395
396     u = Kc[i + 0] ^ r;
397     t = Kd[i + 0] ^ rotl32 (r, 28u);
398
399     l ^= BOX (((u >>  2) & 0x3f), 0, s_SPtrans)
400        | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
401        | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
402        | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
403        | BOX (((t >>  2) & 0x3f), 1, s_SPtrans)
404        | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
405        | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
406        | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
407
408     u = Kc[i + 1] ^ l;
409     t = Kd[i + 1] ^ rotl32 (l, 28u);
410
411     r ^= BOX (((u >>  2) & 0x3f), 0, s_SPtrans)
412        | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
413        | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
414        | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
415        | BOX (((t >>  2) & 0x3f), 1, s_SPtrans)
416        | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
417        | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
418        | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
419   }
420
421   iv[0] = l;
422   iv[1] = r;
423 }
424
425 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64])
426 {
427   u32 tt;
428
429   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
430   HPERM_OP (c,    tt, 2, 0xcccc0000);
431   HPERM_OP (d,    tt, 2, 0xcccc0000);
432   PERM_OP  (d, c, tt, 1, 0x55555555);
433   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
434   PERM_OP  (d, c, tt, 1, 0x55555555);
435
436   d = ((d & 0x000000ff) << 16)
437     | ((d & 0x0000ff00) <<  0)
438     | ((d & 0x00ff0000) >> 16)
439     | ((c & 0xf0000000) >>  4);
440
441   c = c & 0x0fffffff;
442
443   #pragma unroll 16
444   for (u32 i = 0; i < 16; i++)
445   {
446     if ((i < 2) || (i == 8) || (i == 15))
447     {
448       c = ((c >> 1) | (c << 27));
449       d = ((d >> 1) | (d << 27));
450     }
451     else
452     {
453       c = ((c >> 2) | (c << 26));
454       d = ((d >> 2) | (d << 26));
455     }
456
457     c = c & 0x0fffffff;
458     d = d & 0x0fffffff;
459
460     const u32 c00 = (c >>  0) & 0x0000003f;
461     const u32 c06 = (c >>  6) & 0x00383003;
462     const u32 c07 = (c >>  7) & 0x0000003c;
463     const u32 c13 = (c >> 13) & 0x0000060f;
464     const u32 c20 = (c >> 20) & 0x00000001;
465
466     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
467           | BOX (((c06 >>  0) & 0xff)
468                 |((c07 >>  0) & 0xff), 1, s_skb)
469           | BOX (((c13 >>  0) & 0xff)
470                 |((c06 >>  8) & 0xff), 2, s_skb)
471           | BOX (((c20 >>  0) & 0xff)
472                 |((c13 >>  8) & 0xff)
473                 |((c06 >> 16) & 0xff), 3, s_skb);
474
475     const u32 d00 = (d >>  0) & 0x00003c3f;
476     const u32 d07 = (d >>  7) & 0x00003f03;
477     const u32 d21 = (d >> 21) & 0x0000000f;
478     const u32 d22 = (d >> 22) & 0x00000030;
479
480     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
481           | BOX (((d07 >>  0) & 0xff)
482                 |((d00 >>  8) & 0xff), 5, s_skb)
483           | BOX (((d07 >>  8) & 0xff), 6, s_skb)
484           | BOX (((d21 >>  0) & 0xff)
485                 |((d22 >>  0) & 0xff), 7, s_skb);
486
487     Kc[i] = ((t << 16) | (s & 0x0000ffff));
488     Kd[i] = ((s >> 16) | (t & 0xffff0000));
489
490     Kc[i] = rotl32 (Kc[i], 2u);
491     Kd[i] = rotl32 (Kd[i], 2u);
492   }
493 }
494
495 static void transform_racf_key (const u32 w0, const u32 w1, u32 key[2])
496 {
497   key[0] = (ascii_to_ebcdic_pc[(w0 >>  0) & 0xff]) <<  0
498          | (ascii_to_ebcdic_pc[(w0 >>  8) & 0xff]) <<  8
499          | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16
500          | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24;
501
502   key[1] = (ascii_to_ebcdic_pc[(w1 >>  0) & 0xff]) <<  0
503          | (ascii_to_ebcdic_pc[(w1 >>  8) & 0xff]) <<  8
504          | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16
505          | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24;
506 }
507
508 __kernel void m08500_m04 (__global pw_t *pws, __global kernel_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)
509 {
510   /**
511    * base
512    */
513
514   const u32 gid = get_global_id (0);
515   const u32 lid = get_local_id (0);
516   const u32 lsz = get_local_size (0);
517
518   /**
519    * shared
520    */
521
522   __local u32 s_SPtrans[8][64];
523   __local u32 s_skb[8][64];
524
525   for (u32 i = lid; i < 64; i += lsz)
526   {
527     s_SPtrans[0][i] = c_SPtrans[0][i];
528     s_SPtrans[1][i] = c_SPtrans[1][i];
529     s_SPtrans[2][i] = c_SPtrans[2][i];
530     s_SPtrans[3][i] = c_SPtrans[3][i];
531     s_SPtrans[4][i] = c_SPtrans[4][i];
532     s_SPtrans[5][i] = c_SPtrans[5][i];
533     s_SPtrans[6][i] = c_SPtrans[6][i];
534     s_SPtrans[7][i] = c_SPtrans[7][i];
535
536     s_skb[0][i] = c_skb[0][i];
537     s_skb[1][i] = c_skb[1][i];
538     s_skb[2][i] = c_skb[2][i];
539     s_skb[3][i] = c_skb[3][i];
540     s_skb[4][i] = c_skb[4][i];
541     s_skb[5][i] = c_skb[5][i];
542     s_skb[6][i] = c_skb[6][i];
543     s_skb[7][i] = c_skb[7][i];
544   }
545
546   barrier (CLK_LOCAL_MEM_FENCE);
547
548   if (gid >= gid_max) return;
549
550   /**
551    * base
552    */
553
554   u32 wordl0[4];
555
556   wordl0[0] = pws[gid].i[ 0];
557   wordl0[1] = pws[gid].i[ 1];
558   wordl0[2] = 0;
559   wordl0[3] = 0;
560
561   u32 wordl1[4];
562
563   wordl1[0] = 0;
564   wordl1[1] = 0;
565   wordl1[2] = 0;
566   wordl1[3] = 0;
567
568   u32 wordl2[4];
569
570   wordl2[0] = 0;
571   wordl2[1] = 0;
572   wordl2[2] = 0;
573   wordl2[3] = 0;
574
575   u32 wordl3[4];
576
577   wordl3[0] = 0;
578   wordl3[1] = 0;
579   wordl3[2] = 0;
580   wordl3[3] = 0;
581
582   const u32 pw_l_len = pws[gid].pw_len;
583
584   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
585   {
586     switch_buffer_by_offset_le_S (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
587   }
588
589   /**
590    * salt
591    */
592
593   u32 salt_buf0[2];
594
595   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
596   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
597
598   /**
599    * main
600    */
601
602   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
603   {
604     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
605
606     u32x pw_len = pw_l_len + pw_r_len;
607
608     pw_len = (pw_len >= 8) ? 8 : pw_len;
609
610     u32x wordr0[4] = { 0 };
611     u32x wordr1[4] = { 0 };
612     u32x wordr2[4] = { 0 };
613     u32x wordr3[4] = { 0 };
614
615     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
616     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
617
618     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
619     {
620       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
621     }
622
623     u32x w0[4];
624
625     w0[0] = wordl0[0] | wordr0[0];
626     w0[1] = wordl0[1] | wordr0[1];
627     w0[2] = 0;
628     w0[3] = 0;
629
630     u32x w1[4];
631
632     w1[0] = 0;
633     w1[1] = 0;
634     w1[2] = 0;
635     w1[3] = 0;
636
637     u32x w2[4];
638
639     w2[0] = 0;
640     w2[1] = 0;
641     w2[2] = 0;
642     w2[3] = 0;
643
644     u32x w3[4];
645
646     w3[0] = 0;
647     w3[1] = 0;
648     w3[2] = 0;
649     w3[3] = 0;
650
651     u32 key[2];
652
653     transform_racf_key (w0[0], w0[1], key);
654
655     const u32 c = key[0];
656     const u32 d = key[1];
657
658     u32 Kc[16];
659     u32 Kd[16];
660
661     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
662
663     u32 data[2];
664
665     data[0] = salt_buf0[0];
666     data[1] = salt_buf0[1];
667
668     volatile u32 iv[2];
669
670     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
671
672     u32x c = 0;
673     u32x d = 0;
674
675     COMPARE_M_SIMD (iv[0], iv[1], c, d);
676   }
677 }
678
679 __kernel void m08500_m08 (__global pw_t *pws, __global kernel_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
683 __kernel void m08500_m16 (__global pw_t *pws, __global kernel_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)
684 {
685 }
686
687 __kernel void m08500_s04 (__global pw_t *pws, __global kernel_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)
688 {
689   /**
690    * base
691    */
692
693   const u32 gid = get_global_id (0);
694   const u32 lid = get_local_id (0);
695   const u32 lsz = get_local_size (0);
696
697   /**
698    * shared
699    */
700
701   __local u32 s_SPtrans[8][64];
702   __local u32 s_skb[8][64];
703
704   for (u32 i = lid; i < 64; i += lsz)
705   {
706     s_SPtrans[0][i] = c_SPtrans[0][i];
707     s_SPtrans[1][i] = c_SPtrans[1][i];
708     s_SPtrans[2][i] = c_SPtrans[2][i];
709     s_SPtrans[3][i] = c_SPtrans[3][i];
710     s_SPtrans[4][i] = c_SPtrans[4][i];
711     s_SPtrans[5][i] = c_SPtrans[5][i];
712     s_SPtrans[6][i] = c_SPtrans[6][i];
713     s_SPtrans[7][i] = c_SPtrans[7][i];
714
715     s_skb[0][i] = c_skb[0][i];
716     s_skb[1][i] = c_skb[1][i];
717     s_skb[2][i] = c_skb[2][i];
718     s_skb[3][i] = c_skb[3][i];
719     s_skb[4][i] = c_skb[4][i];
720     s_skb[5][i] = c_skb[5][i];
721     s_skb[6][i] = c_skb[6][i];
722     s_skb[7][i] = c_skb[7][i];
723   }
724
725   barrier (CLK_LOCAL_MEM_FENCE);
726
727   if (gid >= gid_max) return;
728
729   /**
730    * base
731    */
732
733   u32 wordl0[4];
734
735   wordl0[0] = pws[gid].i[ 0];
736   wordl0[1] = pws[gid].i[ 1];
737   wordl0[2] = 0;
738   wordl0[3] = 0;
739
740   u32 wordl1[4];
741
742   wordl1[0] = 0;
743   wordl1[1] = 0;
744   wordl1[2] = 0;
745   wordl1[3] = 0;
746
747   u32 wordl2[4];
748
749   wordl2[0] = 0;
750   wordl2[1] = 0;
751   wordl2[2] = 0;
752   wordl2[3] = 0;
753
754   u32 wordl3[4];
755
756   wordl3[0] = 0;
757   wordl3[1] = 0;
758   wordl3[2] = 0;
759   wordl3[3] = 0;
760
761   const u32 pw_l_len = pws[gid].pw_len;
762
763   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
764   {
765     switch_buffer_by_offset_le_S (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
766   }
767
768   /**
769    * salt
770    */
771
772   u32 salt_buf0[2];
773
774   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
775   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
776
777   /**
778    * digest
779    */
780
781   const u32 search[4] =
782   {
783     digests_buf[digests_offset].digest_buf[DGST_R0],
784     digests_buf[digests_offset].digest_buf[DGST_R1],
785     digests_buf[digests_offset].digest_buf[DGST_R2],
786     digests_buf[digests_offset].digest_buf[DGST_R3]
787   };
788
789   /**
790    * main
791    */
792
793   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
794   {
795     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
796
797     u32x pw_len = pw_l_len + pw_r_len;
798
799     pw_len = (pw_len >= 8) ? 8 : pw_len;
800
801     u32x wordr0[4] = { 0 };
802     u32x wordr1[4] = { 0 };
803     u32x wordr2[4] = { 0 };
804     u32x wordr3[4] = { 0 };
805
806     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
807     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
808
809     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
810     {
811       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
812     }
813
814     u32x w0[4];
815
816     w0[0] = wordl0[0] | wordr0[0];
817     w0[1] = wordl0[1] | wordr0[1];
818     w0[2] = 0;
819     w0[3] = 0;
820
821     u32x w1[4];
822
823     w1[0] = 0;
824     w1[1] = 0;
825     w1[2] = 0;
826     w1[3] = 0;
827
828     u32x w2[4];
829
830     w2[0] = 0;
831     w2[1] = 0;
832     w2[2] = 0;
833     w2[3] = 0;
834
835     u32x w3[4];
836
837     w3[0] = 0;
838     w3[1] = 0;
839     w3[2] = 0;
840     w3[3] = 0;
841
842     u32 key[2];
843
844     transform_racf_key (w0[0], w0[1], key);
845
846     const u32 c = key[0];
847     const u32 d = key[1];
848
849     u32 Kc[16];
850     u32 Kd[16];
851
852     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
853
854     u32 data[2];
855
856     data[0] = salt_buf0[0];
857     data[1] = salt_buf0[1];
858
859     volatile u32 iv[2];
860
861     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
862
863     u32x c = 0;
864     u32x d = 0;
865
866     COMPARE_S_SIMD (iv[0], iv[1], c, d);
867   }
868 }
869
870 __kernel void m08500_s08 (__global pw_t *pws, __global kernel_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)
871 {
872 }
873
874 __kernel void m08500_s16 (__global pw_t *pws, __global kernel_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)
875 {
876 }