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