- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[hashcat.git] / OpenCL / m08500_a1.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     #ifdef VECT_SIZE1
379     l    ^= NBOX (((u    >>  2) & 0x3f), 0, s_SPtrans)
380           | NBOX (((u    >> 10) & 0x3f), 2, s_SPtrans)
381           | NBOX (((u    >> 18) & 0x3f), 4, s_SPtrans)
382           | NBOX (((u    >> 26) & 0x3f), 6, s_SPtrans)
383           | NBOX (((t    >>  2) & 0x3f), 1, s_SPtrans)
384           | NBOX (((t    >> 10) & 0x3f), 3, s_SPtrans)
385           | NBOX (((t    >> 18) & 0x3f), 5, s_SPtrans)
386           | NBOX (((t    >> 26) & 0x3f), 7, s_SPtrans);
387     #endif
388
389     #ifdef VECT_SIZE2
390     l.s0 ^= NBOX (((u.s0 >>  2) & 0x3f), 0, s_SPtrans)
391           | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans)
392           | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans)
393           | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans)
394           | NBOX (((t.s0 >>  2) & 0x3f), 1, s_SPtrans)
395           | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans)
396           | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans)
397           | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans);
398
399     l.s1 ^= NBOX (((u.s1 >>  2) & 0x3f), 0, s_SPtrans)
400           | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans)
401           | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans)
402           | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans)
403           | NBOX (((t.s1 >>  2) & 0x3f), 1, s_SPtrans)
404           | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans)
405           | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans)
406           | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans);
407     #endif
408
409     #ifdef VECT_SIZE4
410     l.s0 ^= NBOX (((u.s0 >>  2) & 0x3f), 0, s_SPtrans)
411           | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans)
412           | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans)
413           | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans)
414           | NBOX (((t.s0 >>  2) & 0x3f), 1, s_SPtrans)
415           | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans)
416           | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans)
417           | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans);
418
419     l.s1 ^= NBOX (((u.s1 >>  2) & 0x3f), 0, s_SPtrans)
420           | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans)
421           | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans)
422           | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans)
423           | NBOX (((t.s1 >>  2) & 0x3f), 1, s_SPtrans)
424           | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans)
425           | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans)
426           | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans);
427
428     l.s2 ^= NBOX (((u.s2 >>  2) & 0x3f), 0, s_SPtrans)
429           | NBOX (((u.s2 >> 10) & 0x3f), 2, s_SPtrans)
430           | NBOX (((u.s2 >> 18) & 0x3f), 4, s_SPtrans)
431           | NBOX (((u.s2 >> 26) & 0x3f), 6, s_SPtrans)
432           | NBOX (((t.s2 >>  2) & 0x3f), 1, s_SPtrans)
433           | NBOX (((t.s2 >> 10) & 0x3f), 3, s_SPtrans)
434           | NBOX (((t.s2 >> 18) & 0x3f), 5, s_SPtrans)
435           | NBOX (((t.s2 >> 26) & 0x3f), 7, s_SPtrans);
436
437     l.s3 ^= NBOX (((u.s3 >>  2) & 0x3f), 0, s_SPtrans)
438           | NBOX (((u.s3 >> 10) & 0x3f), 2, s_SPtrans)
439           | NBOX (((u.s3 >> 18) & 0x3f), 4, s_SPtrans)
440           | NBOX (((u.s3 >> 26) & 0x3f), 6, s_SPtrans)
441           | NBOX (((t.s3 >>  2) & 0x3f), 1, s_SPtrans)
442           | NBOX (((t.s3 >> 10) & 0x3f), 3, s_SPtrans)
443           | NBOX (((t.s3 >> 18) & 0x3f), 5, s_SPtrans)
444           | NBOX (((t.s3 >> 26) & 0x3f), 7, s_SPtrans);
445     #endif
446
447     tt = l;
448     l  = r;
449     r  = tt;
450   }
451
452   iv[0] = l;
453   iv[1] = r;
454 }
455
456 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
457 {
458   u32 tt;
459
460   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
461   HPERM_OP (c,    tt, 2, 0xcccc0000);
462   HPERM_OP (d,    tt, 2, 0xcccc0000);
463   PERM_OP  (d, c, tt, 1, 0x55555555);
464   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
465   PERM_OP  (d, c, tt, 1, 0x55555555);
466
467   d = ((d & 0x000000ff) << 16)
468     | ((d & 0x0000ff00) <<  0)
469     | ((d & 0x00ff0000) >> 16)
470     | ((c & 0xf0000000) >>  4);
471
472   c = c & 0x0fffffff;
473
474   #pragma unroll 16
475   for (u32 i = 0; i < 16; i++)
476   {
477     const u32 shifts3s0[16] = {  1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1 };
478     const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 };
479
480     c = c >> shifts3s0[i] | c << shifts3s1[i];
481     d = d >> shifts3s0[i] | d << shifts3s1[i];
482
483     c = c & 0x0fffffff;
484     d = d & 0x0fffffff;
485
486     u32 s;
487     u32 t;
488
489     #ifdef VECT_SIZE1
490     s     = NBOX ((( c    >>  0) & 0x3f),  0, s_skb)
491           | NBOX ((((c    >>  6) & 0x03)
492                  | ((c    >>  7) & 0x3c)), 1, s_skb)
493           | NBOX ((((c    >> 13) & 0x0f)
494                  | ((c    >> 14) & 0x30)), 2, s_skb)
495           | NBOX ((((c    >> 20) & 0x01)
496                  | ((c    >> 21) & 0x06)
497                  | ((c    >> 22) & 0x38)), 3, s_skb);
498
499     t     = NBOX ((( d    >>  0) & 0x3f),  4, s_skb)
500           | NBOX ((((d    >>  7) & 0x03)
501                  | ((d    >>  8) & 0x3c)), 5, s_skb)
502           | NBOX ((((d    >> 15) & 0x3f)), 6, s_skb)
503           | NBOX ((((d    >> 21) & 0x0f)
504                  | ((d    >> 22) & 0x30)), 7, s_skb);
505     #endif
506
507     #ifdef VECT_SIZE2
508     s.s0  = NBOX ((( c.s0 >>  0) & 0x3f),  0, s_skb)
509           | NBOX ((((c.s0 >>  6) & 0x03)
510                  | ((c.s0 >>  7) & 0x3c)), 1, s_skb)
511           | NBOX ((((c.s0 >> 13) & 0x0f)
512                  | ((c.s0 >> 14) & 0x30)), 2, s_skb)
513           | NBOX ((((c.s0 >> 20) & 0x01)
514                  | ((c.s0 >> 21) & 0x06)
515                  | ((c.s0 >> 22) & 0x38)), 3, s_skb);
516
517     t.s0  = NBOX ((( d.s0 >>  0) & 0x3f),  4, s_skb)
518           | NBOX ((((d.s0 >>  7) & 0x03)
519                  | ((d.s0 >>  8) & 0x3c)), 5, s_skb)
520           | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb)
521           | NBOX ((((d.s0 >> 21) & 0x0f)
522                  | ((d.s0 >> 22) & 0x30)), 7, s_skb);
523
524     s.s1  = NBOX ((( c.s1 >>  0) & 0x3f),  0, s_skb)
525           | NBOX ((((c.s1 >>  6) & 0x03)
526                  | ((c.s1 >>  7) & 0x3c)), 1, s_skb)
527           | NBOX ((((c.s1 >> 13) & 0x0f)
528                  | ((c.s1 >> 14) & 0x30)), 2, s_skb)
529           | NBOX ((((c.s1 >> 20) & 0x01)
530                  | ((c.s1 >> 21) & 0x06)
531                  | ((c.s1 >> 22) & 0x38)), 3, s_skb);
532
533     t.s1  = NBOX ((( d.s1 >>  0) & 0x3f),  4, s_skb)
534           | NBOX ((((d.s1 >>  7) & 0x03)
535                  | ((d.s1 >>  8) & 0x3c)), 5, s_skb)
536           | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb)
537           | NBOX ((((d.s1 >> 21) & 0x0f)
538                  | ((d.s1 >> 22) & 0x30)), 7, s_skb);
539     #endif
540
541     #ifdef VECT_SIZE4
542     s.s0  = NBOX ((( c.s0 >>  0) & 0x3f),  0, s_skb)
543           | NBOX ((((c.s0 >>  6) & 0x03)
544                  | ((c.s0 >>  7) & 0x3c)), 1, s_skb)
545           | NBOX ((((c.s0 >> 13) & 0x0f)
546                  | ((c.s0 >> 14) & 0x30)), 2, s_skb)
547           | NBOX ((((c.s0 >> 20) & 0x01)
548                  | ((c.s0 >> 21) & 0x06)
549                  | ((c.s0 >> 22) & 0x38)), 3, s_skb);
550
551     t.s0  = NBOX ((( d.s0 >>  0) & 0x3f),  4, s_skb)
552           | NBOX ((((d.s0 >>  7) & 0x03)
553                  | ((d.s0 >>  8) & 0x3c)), 5, s_skb)
554           | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb)
555           | NBOX ((((d.s0 >> 21) & 0x0f)
556                  | ((d.s0 >> 22) & 0x30)), 7, s_skb);
557
558     s.s1  = NBOX ((( c.s1 >>  0) & 0x3f),  0, s_skb)
559           | NBOX ((((c.s1 >>  6) & 0x03)
560                  | ((c.s1 >>  7) & 0x3c)), 1, s_skb)
561           | NBOX ((((c.s1 >> 13) & 0x0f)
562                  | ((c.s1 >> 14) & 0x30)), 2, s_skb)
563           | NBOX ((((c.s1 >> 20) & 0x01)
564                  | ((c.s1 >> 21) & 0x06)
565                  | ((c.s1 >> 22) & 0x38)), 3, s_skb);
566
567     t.s1  = NBOX ((( d.s1 >>  0) & 0x3f),  4, s_skb)
568           | NBOX ((((d.s1 >>  7) & 0x03)
569                  | ((d.s1 >>  8) & 0x3c)), 5, s_skb)
570           | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb)
571           | NBOX ((((d.s1 >> 21) & 0x0f)
572                  | ((d.s1 >> 22) & 0x30)), 7, s_skb);
573
574     s.s2  = NBOX ((( c.s2 >>  0) & 0x3f),  0, s_skb)
575           | NBOX ((((c.s2 >>  6) & 0x03)
576                  | ((c.s2 >>  7) & 0x3c)), 1, s_skb)
577           | NBOX ((((c.s2 >> 13) & 0x0f)
578                  | ((c.s2 >> 14) & 0x30)), 2, s_skb)
579           | NBOX ((((c.s2 >> 20) & 0x01)
580                  | ((c.s2 >> 21) & 0x06)
581                  | ((c.s2 >> 22) & 0x38)), 3, s_skb);
582
583     t.s2  = NBOX ((( d.s2 >>  0) & 0x3f),  4, s_skb)
584           | NBOX ((((d.s2 >>  7) & 0x03)
585                  | ((d.s2 >>  8) & 0x3c)), 5, s_skb)
586           | NBOX ((((d.s2 >> 15) & 0x3f)), 6, s_skb)
587           | NBOX ((((d.s2 >> 21) & 0x0f)
588                  | ((d.s2 >> 22) & 0x30)), 7, s_skb);
589
590     s.s3  = NBOX ((( c.s3 >>  0) & 0x3f),  0, s_skb)
591           | NBOX ((((c.s3 >>  6) & 0x03)
592                  | ((c.s3 >>  7) & 0x3c)), 1, s_skb)
593           | NBOX ((((c.s3 >> 13) & 0x0f)
594                  | ((c.s3 >> 14) & 0x30)), 2, s_skb)
595           | NBOX ((((c.s3 >> 20) & 0x01)
596                  | ((c.s3 >> 21) & 0x06)
597                  | ((c.s3 >> 22) & 0x38)), 3, s_skb);
598
599     t.s3  = NBOX ((( d.s3 >>  0) & 0x3f),  4, s_skb)
600           | NBOX ((((d.s3 >>  7) & 0x03)
601                  | ((d.s3 >>  8) & 0x3c)), 5, s_skb)
602           | NBOX ((((d.s3 >> 15) & 0x3f)), 6, s_skb)
603           | NBOX ((((d.s3 >> 21) & 0x0f)
604                  | ((d.s3 >> 22) & 0x30)), 7, s_skb);
605     #endif
606
607     #if defined cl_amd_media_ops
608     Kc[i] = amd_bytealign (t, s << 16, 2);
609     Kd[i] = amd_bytealign (t >> 16, s, 2);
610     #else
611     Kc[i] = ((t << 16) | (s & 0x0000ffff));
612     Kd[i] = ((s >> 16) | (t & 0xffff0000));
613     #endif
614
615     Kc[i] = rotl32 (Kc[i], 2u);
616     Kd[i] = rotl32 (Kd[i], 2u);
617   }
618 }
619
620 static void transform_racf_key (const u32 w0, const u32 w1, u32 key[2])
621 {
622   #ifdef VECT_SIZE1
623
624   key[0]    = (ascii_to_ebcdic_pc[(w0    >>  0) & 0xff]) <<  0
625             | (ascii_to_ebcdic_pc[(w0    >>  8) & 0xff]) <<  8
626             | (ascii_to_ebcdic_pc[(w0    >> 16) & 0xff]) << 16
627             | (ascii_to_ebcdic_pc[(w0    >> 24) & 0xff]) << 24;
628
629   key[1]    = (ascii_to_ebcdic_pc[(w1    >>  0) & 0xff]) <<  0
630             | (ascii_to_ebcdic_pc[(w1    >>  8) & 0xff]) <<  8
631             | (ascii_to_ebcdic_pc[(w1    >> 16) & 0xff]) << 16
632             | (ascii_to_ebcdic_pc[(w1    >> 24) & 0xff]) << 24;
633   #endif
634
635   #ifdef VECT_SIZE2
636
637   key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >>  0) & 0xff]) <<  0
638             | (ascii_to_ebcdic_pc[(w0.s0 >>  8) & 0xff]) <<  8
639             | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16
640             | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24;
641
642   key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >>  0) & 0xff]) <<  0
643             | (ascii_to_ebcdic_pc[(w0.s1 >>  8) & 0xff]) <<  8
644             | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16
645             | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24;
646
647   key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >>  0) & 0xff]) <<  0
648             | (ascii_to_ebcdic_pc[(w1.s0 >>  8) & 0xff]) <<  8
649             | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16
650             | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24;
651
652   key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >>  0) & 0xff]) <<  0
653             | (ascii_to_ebcdic_pc[(w1.s1 >>  8) & 0xff]) <<  8
654             | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16
655             | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24;
656   #endif
657
658   #ifdef VECT_SIZE4
659   key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >>  0) & 0xff]) <<  0
660             | (ascii_to_ebcdic_pc[(w0.s0 >>  8) & 0xff]) <<  8
661             | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16
662             | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24;
663
664   key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >>  0) & 0xff]) <<  0
665             | (ascii_to_ebcdic_pc[(w0.s1 >>  8) & 0xff]) <<  8
666             | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16
667             | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24;
668
669   key[0].s2 = (ascii_to_ebcdic_pc[(w0.s2 >>  0) & 0xff]) <<  0
670             | (ascii_to_ebcdic_pc[(w0.s2 >>  8) & 0xff]) <<  8
671             | (ascii_to_ebcdic_pc[(w0.s2 >> 16) & 0xff]) << 16
672             | (ascii_to_ebcdic_pc[(w0.s2 >> 24) & 0xff]) << 24;
673
674   key[0].s3 = (ascii_to_ebcdic_pc[(w0.s3 >>  0) & 0xff]) <<  0
675             | (ascii_to_ebcdic_pc[(w0.s3 >>  8) & 0xff]) <<  8
676             | (ascii_to_ebcdic_pc[(w0.s3 >> 16) & 0xff]) << 16
677             | (ascii_to_ebcdic_pc[(w0.s3 >> 24) & 0xff]) << 24;
678
679   key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >>  0) & 0xff]) <<  0
680             | (ascii_to_ebcdic_pc[(w1.s0 >>  8) & 0xff]) <<  8
681             | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16
682             | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24;
683
684   key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >>  0) & 0xff]) <<  0
685             | (ascii_to_ebcdic_pc[(w1.s1 >>  8) & 0xff]) <<  8
686             | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16
687             | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24;
688
689   key[1].s2 = (ascii_to_ebcdic_pc[(w1.s2 >>  0) & 0xff]) <<  0
690             | (ascii_to_ebcdic_pc[(w1.s2 >>  8) & 0xff]) <<  8
691             | (ascii_to_ebcdic_pc[(w1.s2 >> 16) & 0xff]) << 16
692             | (ascii_to_ebcdic_pc[(w1.s2 >> 24) & 0xff]) << 24;
693
694   key[1].s3 = (ascii_to_ebcdic_pc[(w1.s3 >>  0) & 0xff]) <<  0
695             | (ascii_to_ebcdic_pc[(w1.s3 >>  8) & 0xff]) <<  8
696             | (ascii_to_ebcdic_pc[(w1.s3 >> 16) & 0xff]) << 16
697             | (ascii_to_ebcdic_pc[(w1.s3 >> 24) & 0xff]) << 24;
698   #endif
699 }
700
701 __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 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)
702 {
703   /**
704    * modifier
705    */
706
707   const u32 lid = get_local_id (0);
708
709   /**
710    * base
711    */
712
713   const u32 gid = get_global_id (0);
714
715   u32 wordl0[4];
716
717   wordl0[0] = pws[gid].i[ 0];
718   wordl0[1] = pws[gid].i[ 1];
719   wordl0[2] = 0;
720   wordl0[3] = 0;
721
722   u32 wordl1[4];
723
724   wordl1[0] = 0;
725   wordl1[1] = 0;
726   wordl1[2] = 0;
727   wordl1[3] = 0;
728
729   u32 wordl2[4];
730
731   wordl2[0] = 0;
732   wordl2[1] = 0;
733   wordl2[2] = 0;
734   wordl2[3] = 0;
735
736   u32 wordl3[4];
737
738   wordl3[0] = 0;
739   wordl3[1] = 0;
740   wordl3[2] = 0;
741   wordl3[3] = 0;
742
743   const u32 pw_l_len = pws[gid].pw_len;
744
745   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
746   {
747     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
748   }
749
750   /**
751    * salt
752    */
753
754   u32 salt_buf0[2];
755
756   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
757   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
758
759   /**
760    * sbox, kbox
761    */
762
763   __local u32 s_SPtrans[8][64];
764
765   __local u32 s_skb[8][64];
766
767   s_SPtrans[0][lid] = c_SPtrans[0][lid];
768   s_SPtrans[1][lid] = c_SPtrans[1][lid];
769   s_SPtrans[2][lid] = c_SPtrans[2][lid];
770   s_SPtrans[3][lid] = c_SPtrans[3][lid];
771   s_SPtrans[4][lid] = c_SPtrans[4][lid];
772   s_SPtrans[5][lid] = c_SPtrans[5][lid];
773   s_SPtrans[6][lid] = c_SPtrans[6][lid];
774   s_SPtrans[7][lid] = c_SPtrans[7][lid];
775
776   s_skb[0][lid] = c_skb[0][lid];
777   s_skb[1][lid] = c_skb[1][lid];
778   s_skb[2][lid] = c_skb[2][lid];
779   s_skb[3][lid] = c_skb[3][lid];
780   s_skb[4][lid] = c_skb[4][lid];
781   s_skb[5][lid] = c_skb[5][lid];
782   s_skb[6][lid] = c_skb[6][lid];
783   s_skb[7][lid] = c_skb[7][lid];
784
785   barrier (CLK_LOCAL_MEM_FENCE);
786
787   if (gid >= gid_max) return;
788
789   /**
790    * main
791    */
792
793   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
794   {
795     const u32 pw_r_len = combs_buf[il_pos].pw_len;
796
797     u32 pw_len = pw_l_len + pw_r_len;
798
799     pw_len = (pw_len >= 8) ? 8 : pw_len;
800
801     u32 wordr0[4];
802
803     wordr0[0] = combs_buf[il_pos].i[0];
804     wordr0[1] = combs_buf[il_pos].i[1];
805     wordr0[2] = 0;
806     wordr0[3] = 0;
807
808     u32 wordr1[4];
809
810     wordr1[0] = 0;
811     wordr1[1] = 0;
812     wordr1[2] = 0;
813     wordr1[3] = 0;
814
815     u32 wordr2[4];
816
817     wordr2[0] = 0;
818     wordr2[1] = 0;
819     wordr2[2] = 0;
820     wordr2[3] = 0;
821
822     u32 wordr3[4];
823
824     wordr3[0] = 0;
825     wordr3[1] = 0;
826     wordr3[2] = 0;
827     wordr3[3] = 0;
828
829     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
830     {
831       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
832     }
833
834     u32 w0[4];
835
836     w0[0] = wordl0[0] | wordr0[0];
837     w0[1] = wordl0[1] | wordr0[1];
838     w0[2] = 0;
839     w0[3] = 0;
840
841     u32 w1[4];
842
843     w1[0] = 0;
844     w1[1] = 0;
845     w1[2] = 0;
846     w1[3] = 0;
847
848     u32 w2[4];
849
850     w2[0] = 0;
851     w2[1] = 0;
852     w2[2] = 0;
853     w2[3] = 0;
854
855     u32 w3[4];
856
857     w3[0] = 0;
858     w3[1] = 0;
859     w3[2] = 0;
860     w3[3] = 0;
861
862     u32 key[2];
863
864     transform_racf_key (w0[0], w0[1], key);
865
866     const u32 c = key[0];
867     const u32 d = key[1];
868
869     u32 Kc[16];
870     u32 Kd[16];
871
872     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
873
874     u32 data[2];
875
876     data[0] = salt_buf0[0];
877     data[1] = salt_buf0[1];
878
879     u32 iv[2];
880
881     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
882
883     const u32 r0 = iv[0];
884     const u32 r1 = iv[1];
885     const u32 r2 = 0;
886     const u32 r3 = 0;
887
888     #include COMPARE_M
889   }
890 }
891
892 __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 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)
893 {
894 }
895
896 __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 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)
897 {
898 }
899
900 __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 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)
901 {
902   /**
903    * modifier
904    */
905
906   const u32 lid = get_local_id (0);
907
908   /**
909    * base
910    */
911
912   const u32 gid = get_global_id (0);
913
914   u32 wordl0[4];
915
916   wordl0[0] = pws[gid].i[ 0];
917   wordl0[1] = pws[gid].i[ 1];
918   wordl0[2] = 0;
919   wordl0[3] = 0;
920
921   u32 wordl1[4];
922
923   wordl1[0] = 0;
924   wordl1[1] = 0;
925   wordl1[2] = 0;
926   wordl1[3] = 0;
927
928   u32 wordl2[4];
929
930   wordl2[0] = 0;
931   wordl2[1] = 0;
932   wordl2[2] = 0;
933   wordl2[3] = 0;
934
935   u32 wordl3[4];
936
937   wordl3[0] = 0;
938   wordl3[1] = 0;
939   wordl3[2] = 0;
940   wordl3[3] = 0;
941
942   const u32 pw_l_len = pws[gid].pw_len;
943
944   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
945   {
946     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
947   }
948
949   /**
950    * salt
951    */
952
953   u32 salt_buf0[2];
954
955   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
956   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
957
958   /**
959    * sbox, kbox
960    */
961
962   __local u32 s_SPtrans[8][64];
963
964   __local u32 s_skb[8][64];
965
966   s_SPtrans[0][lid] = c_SPtrans[0][lid];
967   s_SPtrans[1][lid] = c_SPtrans[1][lid];
968   s_SPtrans[2][lid] = c_SPtrans[2][lid];
969   s_SPtrans[3][lid] = c_SPtrans[3][lid];
970   s_SPtrans[4][lid] = c_SPtrans[4][lid];
971   s_SPtrans[5][lid] = c_SPtrans[5][lid];
972   s_SPtrans[6][lid] = c_SPtrans[6][lid];
973   s_SPtrans[7][lid] = c_SPtrans[7][lid];
974
975   s_skb[0][lid] = c_skb[0][lid];
976   s_skb[1][lid] = c_skb[1][lid];
977   s_skb[2][lid] = c_skb[2][lid];
978   s_skb[3][lid] = c_skb[3][lid];
979   s_skb[4][lid] = c_skb[4][lid];
980   s_skb[5][lid] = c_skb[5][lid];
981   s_skb[6][lid] = c_skb[6][lid];
982   s_skb[7][lid] = c_skb[7][lid];
983
984   barrier (CLK_LOCAL_MEM_FENCE);
985
986   if (gid >= gid_max) return;
987
988   /**
989    * digest
990    */
991
992   const u32 search[4] =
993   {
994     digests_buf[digests_offset].digest_buf[DGST_R0],
995     digests_buf[digests_offset].digest_buf[DGST_R1],
996     digests_buf[digests_offset].digest_buf[DGST_R2],
997     digests_buf[digests_offset].digest_buf[DGST_R3]
998   };
999
1000   /**
1001    * main
1002    */
1003
1004   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
1005   {
1006     const u32 pw_r_len = combs_buf[il_pos].pw_len;
1007
1008     u32 pw_len = pw_l_len + pw_r_len;
1009
1010     pw_len = (pw_len >= 8) ? 8 : pw_len;
1011
1012     u32 wordr0[4];
1013
1014     wordr0[0] = combs_buf[il_pos].i[0];
1015     wordr0[1] = combs_buf[il_pos].i[1];
1016     wordr0[2] = 0;
1017     wordr0[3] = 0;
1018
1019     u32 wordr1[4];
1020
1021     wordr1[0] = 0;
1022     wordr1[1] = 0;
1023     wordr1[2] = 0;
1024     wordr1[3] = 0;
1025
1026     u32 wordr2[4];
1027
1028     wordr2[0] = 0;
1029     wordr2[1] = 0;
1030     wordr2[2] = 0;
1031     wordr2[3] = 0;
1032
1033     u32 wordr3[4];
1034
1035     wordr3[0] = 0;
1036     wordr3[1] = 0;
1037     wordr3[2] = 0;
1038     wordr3[3] = 0;
1039
1040     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1041     {
1042       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1043     }
1044
1045     u32 w0[4];
1046
1047     w0[0] = wordl0[0] | wordr0[0];
1048     w0[1] = wordl0[1] | wordr0[1];
1049     w0[2] = 0;
1050     w0[3] = 0;
1051
1052     u32 w1[4];
1053
1054     w1[0] = 0;
1055     w1[1] = 0;
1056     w1[2] = 0;
1057     w1[3] = 0;
1058
1059     u32 w2[4];
1060
1061     w2[0] = 0;
1062     w2[1] = 0;
1063     w2[2] = 0;
1064     w2[3] = 0;
1065
1066     u32 w3[4];
1067
1068     w3[0] = 0;
1069     w3[1] = 0;
1070     w3[2] = 0;
1071     w3[3] = 0;
1072
1073     u32 key[2];
1074
1075     transform_racf_key (w0[0], w0[1], key);
1076
1077     const u32 c = key[0];
1078     const u32 d = key[1];
1079
1080     u32 Kc[16];
1081     u32 Kd[16];
1082
1083     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
1084
1085     u32 data[2];
1086
1087     data[0] = salt_buf0[0];
1088     data[1] = salt_buf0[1];
1089
1090     u32 iv[2];
1091
1092     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
1093
1094     const u32 r0 = iv[0];
1095     const u32 r1 = iv[1];
1096     const u32 r2 = 0;
1097     const u32 r3 = 0;
1098
1099     #include COMPARE_S
1100   }
1101 }
1102
1103 __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 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)
1104 {
1105 }
1106
1107 __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 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)
1108 {
1109 }