Upgrade kernel to support dynamic local work sizes
[hashcat.git] / OpenCL / m08500_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _DES_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 0
12 #define DGST_R1 1
13 #define DGST_R2 2
14 #define DGST_R3 3
15
16 #include "include/kernel_functions.c"
17 #include "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19 #include "include/rp_kernel.h"
20 #include "OpenCL/rp.c"
21
22 #define COMPARE_S "OpenCL/check_single_comp4.c"
23 #define COMPARE_M "OpenCL/check_multi_comp4.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[8][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[8][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 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   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 pw_buf[4];
555
556   pw_buf[0] = pws[gid].i[ 0];
557   pw_buf[1] = pws[gid].i[ 1];
558   pw_buf[2] = 0;
559   pw_buf[3] = 0;
560
561   const u32 pw_len = pws[gid].pw_len;
562
563   /**
564    * salt
565    */
566
567   u32 salt_buf0[2];
568
569   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
570   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
571
572   /**
573    * main
574    */
575
576   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
577   {
578     u32 w0[4];
579
580     w0[0] = pw_buf[0];
581     w0[1] = pw_buf[1];
582     w0[2] = pw_buf[2];
583     w0[3] = pw_buf[3];
584
585     u32 w1[4];
586
587     w1[0] = 0;
588     w1[1] = 0;
589     w1[2] = 0;
590     w1[3] = 0;
591
592     u32 w2[4];
593
594     w2[0] = 0;
595     w2[1] = 0;
596     w2[2] = 0;
597     w2[3] = 0;
598
599     u32 w3[4];
600
601     w3[0] = 0;
602     w3[1] = 0;
603     w3[2] = 0;
604     w3[3] = 0;
605
606     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
607
608     out_len = (out_len >= 8) ? 8 : out_len;
609
610     u32 key[2];
611
612     transform_racf_key (w0[0], w0[1], key);
613
614     const u32 c = key[0];
615     const u32 d = key[1];
616
617     u32 Kc[16];
618     u32 Kd[16];
619
620     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
621
622     u32 data[2];
623
624     data[0] = salt_buf0[0];
625     data[1] = salt_buf0[1];
626
627     u32 iv[2];
628
629     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
630
631     const u32 r0 = iv[0];
632     const u32 r1 = iv[1];
633     const u32 r2 = 0;
634     const u32 r3 = 0;
635
636     #include COMPARE_M
637   }
638 }
639
640 __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)
641 {
642 }
643
644 __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)
645 {
646 }
647
648 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
649 {
650   /**
651    * base
652    */
653
654   const u32 gid = get_global_id (0);
655   const u32 lid = get_local_id (0);
656   const u32 lsz = get_local_size (0);
657
658   /**
659    * shared
660    */
661
662   __local u32 s_SPtrans[8][64];
663   __local u32 s_skb[8][64];
664
665   for (u32 i = lid; i < 64; i += lsz)
666   {
667     s_SPtrans[0][i] = c_SPtrans[0][i];
668     s_SPtrans[1][i] = c_SPtrans[1][i];
669     s_SPtrans[2][i] = c_SPtrans[2][i];
670     s_SPtrans[3][i] = c_SPtrans[3][i];
671     s_SPtrans[4][i] = c_SPtrans[4][i];
672     s_SPtrans[5][i] = c_SPtrans[5][i];
673     s_SPtrans[6][i] = c_SPtrans[6][i];
674     s_SPtrans[7][i] = c_SPtrans[7][i];
675
676     s_skb[0][i] = c_skb[0][i];
677     s_skb[1][i] = c_skb[1][i];
678     s_skb[2][i] = c_skb[2][i];
679     s_skb[3][i] = c_skb[3][i];
680     s_skb[4][i] = c_skb[4][i];
681     s_skb[5][i] = c_skb[5][i];
682     s_skb[6][i] = c_skb[6][i];
683     s_skb[7][i] = c_skb[7][i];
684   }
685
686   barrier (CLK_LOCAL_MEM_FENCE);
687
688   if (gid >= gid_max) return;
689
690   /**
691    * base
692    */
693
694   u32 pw_buf[4];
695
696   pw_buf[0] = pws[gid].i[ 0];
697   pw_buf[1] = pws[gid].i[ 1];
698   pw_buf[2] = 0;
699   pw_buf[3] = 0;
700
701   const u32 pw_len = pws[gid].pw_len;
702
703   /**
704    * salt
705    */
706
707   u32 salt_buf0[2];
708
709   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
710   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
711
712   /**
713    * digest
714    */
715
716   const u32 search[4] =
717   {
718     digests_buf[digests_offset].digest_buf[DGST_R0],
719     digests_buf[digests_offset].digest_buf[DGST_R1],
720     digests_buf[digests_offset].digest_buf[DGST_R2],
721     digests_buf[digests_offset].digest_buf[DGST_R3]
722   };
723
724   /**
725    * main
726    */
727
728   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
729   {
730     u32 w0[4];
731
732     w0[0] = pw_buf[0];
733     w0[1] = pw_buf[1];
734     w0[2] = pw_buf[2];
735     w0[3] = pw_buf[3];
736
737     u32 w1[4];
738
739     w1[0] = 0;
740     w1[1] = 0;
741     w1[2] = 0;
742     w1[3] = 0;
743
744     u32 w2[4];
745
746     w2[0] = 0;
747     w2[1] = 0;
748     w2[2] = 0;
749     w2[3] = 0;
750
751     u32 w3[4];
752
753     w3[0] = 0;
754     w3[1] = 0;
755     w3[2] = 0;
756     w3[3] = 0;
757
758     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
759
760     out_len = (out_len >= 8) ? 8 : out_len;
761
762     u32 key[2];
763
764     transform_racf_key (w0[0], w0[1], key);
765
766     const u32 c = key[0];
767     const u32 d = key[1];
768
769     u32 Kc[16];
770     u32 Kd[16];
771
772     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
773
774     u32 data[2];
775
776     data[0] = salt_buf0[0];
777     data[1] = salt_buf0[1];
778
779     u32 iv[2];
780
781     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
782
783     const u32 r0 = iv[0];
784     const u32 r1 = iv[1];
785     const u32 r2 = 0;
786     const u32 r3 = 0;
787
788     #include COMPARE_S
789   }
790 }
791
792 __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)
793 {
794 }
795
796 __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)
797 {
798 }