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