- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[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     #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 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)
702 {
703   /**
704    * modifier
705    */
706
707   const u32 gid = get_global_id (0);
708   const u32 lid = get_local_id (0);
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    * loop
721    */
722
723   u32 w0l = w[0];
724
725   u32 w1 = w[1];
726
727   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
728   {
729     const u32 w0r = words_buf_r[il_pos];
730
731     const u32 w0 = w0l | w0r;
732
733     u32 key[2];
734
735     transform_racf_key (w0, w1, key);
736
737     const u32 c = key[0];
738     const u32 d = key[1];
739
740     u32 Kc[16];
741     u32 Kd[16];
742
743     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
744
745     u32 data[2];
746
747     data[0] = salt_buf0[0];
748     data[1] = salt_buf0[1];
749
750     u32 iv[2];
751
752     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
753
754     const u32 r0 = iv[0];
755     const u32 r1 = iv[1];
756     const u32 r2 = 0;
757     const u32 r3 = 0;
758
759     #include COMPARE_M
760   }
761 }
762
763 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)
764 {
765   /**
766    * modifier
767    */
768
769   const u32 gid = get_global_id (0);
770   const u32 lid = get_local_id (0);
771
772   /**
773    * salt
774    */
775
776   u32 salt_buf0[2];
777
778   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
779   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
780
781   /**
782    * digest
783    */
784
785   const u32 search[4] =
786   {
787     digests_buf[digests_offset].digest_buf[DGST_R0],
788     digests_buf[digests_offset].digest_buf[DGST_R1],
789     digests_buf[digests_offset].digest_buf[DGST_R2],
790     digests_buf[digests_offset].digest_buf[DGST_R3]
791   };
792
793   /**
794    * loop
795    */
796
797   u32 w0l = w[0];
798
799   u32 w1 = w[1];
800
801   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
802   {
803     const u32 w0r = words_buf_r[il_pos];
804
805     const u32 w0 = w0l | w0r;
806
807     u32 key[2];
808
809     transform_racf_key (w0, w1, key);
810
811     const u32 c = key[0];
812     const u32 d = key[1];
813
814     u32 Kc[16];
815     u32 Kd[16];
816
817     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
818
819     u32 data[2];
820
821     data[0] = salt_buf0[0];
822     data[1] = salt_buf0[1];
823
824     u32 iv[2];
825
826     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
827
828     const u32 r0 = iv[0];
829     const u32 r1 = iv[1];
830     const u32 r2 = 0;
831     const u32 r3 = 0;
832
833     #include COMPARE_S
834   }
835 }
836
837 __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)
838 {
839   __local u32 s_SPtrans[8][64];
840
841   __local u32 s_skb[8][64];
842
843   /**
844    * base
845    */
846
847   const u32 gid = get_global_id (0);
848   const u32 lid = get_local_id (0);
849
850   u32 w[16];
851
852   w[ 0] = pws[gid].i[ 0];
853   w[ 1] = pws[gid].i[ 1];
854   w[ 2] = 0;
855   w[ 3] = 0;
856   w[ 4] = 0;
857   w[ 5] = 0;
858   w[ 6] = 0;
859   w[ 7] = 0;
860   w[ 8] = 0;
861   w[ 9] = 0;
862   w[10] = 0;
863   w[11] = 0;
864   w[12] = 0;
865   w[13] = 0;
866   w[14] = 0;
867   w[15] = 0;
868
869   const u32 pw_len = pws[gid].pw_len;
870
871   /**
872    * sbox, kbox
873    */
874
875   s_SPtrans[0][lid] = c_SPtrans[0][lid];
876   s_SPtrans[1][lid] = c_SPtrans[1][lid];
877   s_SPtrans[2][lid] = c_SPtrans[2][lid];
878   s_SPtrans[3][lid] = c_SPtrans[3][lid];
879   s_SPtrans[4][lid] = c_SPtrans[4][lid];
880   s_SPtrans[5][lid] = c_SPtrans[5][lid];
881   s_SPtrans[6][lid] = c_SPtrans[6][lid];
882   s_SPtrans[7][lid] = c_SPtrans[7][lid];
883
884   s_skb[0][lid] = c_skb[0][lid];
885   s_skb[1][lid] = c_skb[1][lid];
886   s_skb[2][lid] = c_skb[2][lid];
887   s_skb[3][lid] = c_skb[3][lid];
888   s_skb[4][lid] = c_skb[4][lid];
889   s_skb[5][lid] = c_skb[5][lid];
890   s_skb[6][lid] = c_skb[6][lid];
891   s_skb[7][lid] = c_skb[7][lid];
892
893   barrier (CLK_LOCAL_MEM_FENCE);
894
895   if (gid >= gid_max) return;
896
897   /**
898    * main
899    */
900
901   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);
902 }
903
904 __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)
905 {
906 }
907
908 __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)
909 {
910 }
911
912 __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)
913 {
914   __local u32 s_SPtrans[8][64];
915
916   __local u32 s_skb[8][64];
917
918   /**
919    * base
920    */
921
922   const u32 gid = get_global_id (0);
923   const u32 lid = get_local_id (0);
924
925   u32 w[16];
926
927   w[ 0] = pws[gid].i[ 0];
928   w[ 1] = pws[gid].i[ 1];
929   w[ 2] = 0;
930   w[ 3] = 0;
931   w[ 4] = 0;
932   w[ 5] = 0;
933   w[ 6] = 0;
934   w[ 7] = 0;
935   w[ 8] = 0;
936   w[ 9] = 0;
937   w[10] = 0;
938   w[11] = 0;
939   w[12] = 0;
940   w[13] = 0;
941   w[14] = 0;
942   w[15] = 0;
943
944   const u32 pw_len = pws[gid].pw_len;
945
946   /**
947    * sbox, kbox
948    */
949
950   s_SPtrans[0][lid] = c_SPtrans[0][lid];
951   s_SPtrans[1][lid] = c_SPtrans[1][lid];
952   s_SPtrans[2][lid] = c_SPtrans[2][lid];
953   s_SPtrans[3][lid] = c_SPtrans[3][lid];
954   s_SPtrans[4][lid] = c_SPtrans[4][lid];
955   s_SPtrans[5][lid] = c_SPtrans[5][lid];
956   s_SPtrans[6][lid] = c_SPtrans[6][lid];
957   s_SPtrans[7][lid] = c_SPtrans[7][lid];
958
959   s_skb[0][lid] = c_skb[0][lid];
960   s_skb[1][lid] = c_skb[1][lid];
961   s_skb[2][lid] = c_skb[2][lid];
962   s_skb[3][lid] = c_skb[3][lid];
963   s_skb[4][lid] = c_skb[4][lid];
964   s_skb[5][lid] = c_skb[5][lid];
965   s_skb[6][lid] = c_skb[6][lid];
966   s_skb[7][lid] = c_skb[7][lid];
967
968   barrier (CLK_LOCAL_MEM_FENCE);
969
970   if (gid >= gid_max) return;
971
972   /**
973    * main
974    */
975
976   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);
977 }
978
979 __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)
980 {
981 }
982
983 __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)
984 {
985 }