Replace the substring GPU to a more appropriate "device" or "kernel" substring depend...
[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 __attribute__((reqd_work_group_size (64, 1, 1))) 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    * modifier
512    */
513
514   const u32 lid = get_local_id (0);
515
516   /**
517    * base
518    */
519
520   const u32 gid = get_global_id (0);
521
522   u32 pw_buf[4];
523
524   pw_buf[0] = pws[gid].i[ 0];
525   pw_buf[1] = pws[gid].i[ 1];
526   pw_buf[2] = 0;
527   pw_buf[3] = 0;
528
529   const u32 pw_len = pws[gid].pw_len;
530
531   /**
532    * salt
533    */
534
535   u32 salt_buf0[2];
536
537   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
538   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
539
540   /**
541    * sbox, kbox
542    */
543
544   __local u32 s_SPtrans[8][64];
545   __local u32 s_skb[8][64];
546
547   s_SPtrans[0][lid] = c_SPtrans[0][lid];
548   s_SPtrans[1][lid] = c_SPtrans[1][lid];
549   s_SPtrans[2][lid] = c_SPtrans[2][lid];
550   s_SPtrans[3][lid] = c_SPtrans[3][lid];
551   s_SPtrans[4][lid] = c_SPtrans[4][lid];
552   s_SPtrans[5][lid] = c_SPtrans[5][lid];
553   s_SPtrans[6][lid] = c_SPtrans[6][lid];
554   s_SPtrans[7][lid] = c_SPtrans[7][lid];
555
556   s_skb[0][lid] = c_skb[0][lid];
557   s_skb[1][lid] = c_skb[1][lid];
558   s_skb[2][lid] = c_skb[2][lid];
559   s_skb[3][lid] = c_skb[3][lid];
560   s_skb[4][lid] = c_skb[4][lid];
561   s_skb[5][lid] = c_skb[5][lid];
562   s_skb[6][lid] = c_skb[6][lid];
563   s_skb[7][lid] = c_skb[7][lid];
564
565   barrier (CLK_LOCAL_MEM_FENCE);
566
567   if (gid >= gid_max) return;
568
569   /**
570    * main
571    */
572
573   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
574   {
575     u32 w0[4];
576
577     w0[0] = pw_buf[0];
578     w0[1] = pw_buf[1];
579     w0[2] = pw_buf[2];
580     w0[3] = pw_buf[3];
581
582     u32 w1[4];
583
584     w1[0] = 0;
585     w1[1] = 0;
586     w1[2] = 0;
587     w1[3] = 0;
588
589     u32 w2[4];
590
591     w2[0] = 0;
592     w2[1] = 0;
593     w2[2] = 0;
594     w2[3] = 0;
595
596     u32 w3[4];
597
598     w3[0] = 0;
599     w3[1] = 0;
600     w3[2] = 0;
601     w3[3] = 0;
602
603     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
604
605     out_len = (out_len >= 8) ? 8 : out_len;
606
607     u32 key[2];
608
609     transform_racf_key (w0[0], w0[1], key);
610
611     const u32 c = key[0];
612     const u32 d = key[1];
613
614     u32 Kc[16];
615     u32 Kd[16];
616
617     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
618
619     u32 data[2];
620
621     data[0] = salt_buf0[0];
622     data[1] = salt_buf0[1];
623
624     u32 iv[2];
625
626     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
627
628     const u32 r0 = iv[0];
629     const u32 r1 = iv[1];
630     const u32 r2 = 0;
631     const u32 r3 = 0;
632
633     #include COMPARE_M
634   }
635 }
636
637 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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)
638 {
639 }
640
641 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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)
642 {
643 }
644
645 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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)
646 {
647   /**
648    * modifier
649    */
650
651   const u32 lid = get_local_id (0);
652
653   /**
654    * base
655    */
656
657   const u32 gid = get_global_id (0);
658
659   u32 pw_buf[4];
660
661   pw_buf[0] = pws[gid].i[ 0];
662   pw_buf[1] = pws[gid].i[ 1];
663   pw_buf[2] = 0;
664   pw_buf[3] = 0;
665
666   const u32 pw_len = pws[gid].pw_len;
667
668   /**
669    * salt
670    */
671
672   u32 salt_buf0[2];
673
674   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
675   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
676
677   /**
678    * sbox, kbox
679    */
680
681   __local u32 s_SPtrans[8][64];
682   __local u32 s_skb[8][64];
683
684   s_SPtrans[0][lid] = c_SPtrans[0][lid];
685   s_SPtrans[1][lid] = c_SPtrans[1][lid];
686   s_SPtrans[2][lid] = c_SPtrans[2][lid];
687   s_SPtrans[3][lid] = c_SPtrans[3][lid];
688   s_SPtrans[4][lid] = c_SPtrans[4][lid];
689   s_SPtrans[5][lid] = c_SPtrans[5][lid];
690   s_SPtrans[6][lid] = c_SPtrans[6][lid];
691   s_SPtrans[7][lid] = c_SPtrans[7][lid];
692
693   s_skb[0][lid] = c_skb[0][lid];
694   s_skb[1][lid] = c_skb[1][lid];
695   s_skb[2][lid] = c_skb[2][lid];
696   s_skb[3][lid] = c_skb[3][lid];
697   s_skb[4][lid] = c_skb[4][lid];
698   s_skb[5][lid] = c_skb[5][lid];
699   s_skb[6][lid] = c_skb[6][lid];
700   s_skb[7][lid] = c_skb[7][lid];
701
702   barrier (CLK_LOCAL_MEM_FENCE);
703
704   if (gid >= gid_max) return;
705
706   /**
707    * digest
708    */
709
710   const u32 search[4] =
711   {
712     digests_buf[digests_offset].digest_buf[DGST_R0],
713     digests_buf[digests_offset].digest_buf[DGST_R1],
714     digests_buf[digests_offset].digest_buf[DGST_R2],
715     digests_buf[digests_offset].digest_buf[DGST_R3]
716   };
717
718   /**
719    * main
720    */
721
722   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
723   {
724     u32 w0[4];
725
726     w0[0] = pw_buf[0];
727     w0[1] = pw_buf[1];
728     w0[2] = pw_buf[2];
729     w0[3] = pw_buf[3];
730
731     u32 w1[4];
732
733     w1[0] = 0;
734     w1[1] = 0;
735     w1[2] = 0;
736     w1[3] = 0;
737
738     u32 w2[4];
739
740     w2[0] = 0;
741     w2[1] = 0;
742     w2[2] = 0;
743     w2[3] = 0;
744
745     u32 w3[4];
746
747     w3[0] = 0;
748     w3[1] = 0;
749     w3[2] = 0;
750     w3[3] = 0;
751
752     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
753
754     out_len = (out_len >= 8) ? 8 : out_len;
755
756     u32 key[2];
757
758     transform_racf_key (w0[0], w0[1], key);
759
760     const u32 c = key[0];
761     const u32 d = key[1];
762
763     u32 Kc[16];
764     u32 Kd[16];
765
766     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
767
768     u32 data[2];
769
770     data[0] = salt_buf0[0];
771     data[1] = salt_buf0[1];
772
773     u32 iv[2];
774
775     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
776
777     const u32 r0 = iv[0];
778     const u32 r1 = iv[1];
779     const u32 r2 = 0;
780     const u32 r3 = 0;
781
782     #include COMPARE_S
783   }
784 }
785
786 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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)
787 {
788 }
789
790 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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)
791 {
792 }