Initial commit
[hashcat.git] / amd / 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 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE2
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE2
21 #endif
22
23 #define DGST_R0 0
24 #define DGST_R1 1
25 #define DGST_R2 2
26 #define DGST_R3 3
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31
32 #ifdef  VECT_SIZE1
33 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
34 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
35 #endif
36
37 #ifdef  VECT_SIZE2
38 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
39 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
40 #endif
41
42 #ifdef  VECT_SIZE4
43 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
44 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
45 #endif
46
47 #define PERM_OP(a,b,tt,n,m) \
48 {                           \
49   tt = a >> n;              \
50   tt = tt ^ b;              \
51   tt = tt & m;              \
52   b = b ^ tt;               \
53   tt = tt << n;             \
54   a = a ^ tt;               \
55 }
56
57 #define HPERM_OP(a,tt,n,m)  \
58 {                           \
59   tt = a << (16 + n);       \
60   tt = tt ^ a;              \
61   tt = tt & m;              \
62   a  = a ^ tt;              \
63   tt = tt >> (16 + n);      \
64   a  = a ^ tt;              \
65 }
66
67 #define IP(l,r,tt)                     \
68 {                                      \
69   PERM_OP (r, l, tt,  4, 0x0f0f0f0f);  \
70   PERM_OP (l, r, tt, 16, 0x0000ffff);  \
71   PERM_OP (r, l, tt,  2, 0x33333333);  \
72   PERM_OP (l, r, tt,  8, 0x00ff00ff);  \
73   PERM_OP (r, l, tt,  1, 0x55555555);  \
74 }
75
76 #define FP(l,r,tt)                     \
77 {                                      \
78   PERM_OP (l, r, tt,  1, 0x55555555);  \
79   PERM_OP (r, l, tt,  8, 0x00ff00ff);  \
80   PERM_OP (l, r, tt,  2, 0x33333333);  \
81   PERM_OP (r, l, tt, 16, 0x0000ffff);  \
82   PERM_OP (l, r, tt,  4, 0x0f0f0f0f);  \
83 }
84
85 __constant u8 ascii_to_ebcdic_pc[256] =
86 {
87   // little hack, can't crack 0-bytes in password, but who cares
88   //    0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5,
89   0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5,
90   0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94,
91   0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68,
92   0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75,
93   0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07,
94   0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70,
95   0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86,
96   0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4,
97   0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d,
98   0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68,
99   0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04,
100   0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40,
101   0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97,
102   0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4,
103   0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c,
104   0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54,
105 };
106
107 __constant u32 c_SPtrans[8][64] =
108 {
109   /* nibble 0 */
110   0x02080800, 0x00080000, 0x02000002, 0x02080802,
111   0x02000000, 0x00080802, 0x00080002, 0x02000002,
112   0x00080802, 0x02080800, 0x02080000, 0x00000802,
113   0x02000802, 0x02000000, 0x00000000, 0x00080002,
114   0x00080000, 0x00000002, 0x02000800, 0x00080800,
115   0x02080802, 0x02080000, 0x00000802, 0x02000800,
116   0x00000002, 0x00000800, 0x00080800, 0x02080002,
117   0x00000800, 0x02000802, 0x02080002, 0x00000000,
118   0x00000000, 0x02080802, 0x02000800, 0x00080002,
119   0x02080800, 0x00080000, 0x00000802, 0x02000800,
120   0x02080002, 0x00000800, 0x00080800, 0x02000002,
121   0x00080802, 0x00000002, 0x02000002, 0x02080000,
122   0x02080802, 0x00080800, 0x02080000, 0x02000802,
123   0x02000000, 0x00000802, 0x00080002, 0x00000000,
124   0x00080000, 0x02000000, 0x02000802, 0x02080800,
125   0x00000002, 0x02080002, 0x00000800, 0x00080802,
126   /* nibble 1 */
127   0x40108010, 0x00000000, 0x00108000, 0x40100000,
128   0x40000010, 0x00008010, 0x40008000, 0x00108000,
129   0x00008000, 0x40100010, 0x00000010, 0x40008000,
130   0x00100010, 0x40108000, 0x40100000, 0x00000010,
131   0x00100000, 0x40008010, 0x40100010, 0x00008000,
132   0x00108010, 0x40000000, 0x00000000, 0x00100010,
133   0x40008010, 0x00108010, 0x40108000, 0x40000010,
134   0x40000000, 0x00100000, 0x00008010, 0x40108010,
135   0x00100010, 0x40108000, 0x40008000, 0x00108010,
136   0x40108010, 0x00100010, 0x40000010, 0x00000000,
137   0x40000000, 0x00008010, 0x00100000, 0x40100010,
138   0x00008000, 0x40000000, 0x00108010, 0x40008010,
139   0x40108000, 0x00008000, 0x00000000, 0x40000010,
140   0x00000010, 0x40108010, 0x00108000, 0x40100000,
141   0x40100010, 0x00100000, 0x00008010, 0x40008000,
142   0x40008010, 0x00000010, 0x40100000, 0x00108000,
143   /* nibble 2 */
144   0x04000001, 0x04040100, 0x00000100, 0x04000101,
145   0x00040001, 0x04000000, 0x04000101, 0x00040100,
146   0x04000100, 0x00040000, 0x04040000, 0x00000001,
147   0x04040101, 0x00000101, 0x00000001, 0x04040001,
148   0x00000000, 0x00040001, 0x04040100, 0x00000100,
149   0x00000101, 0x04040101, 0x00040000, 0x04000001,
150   0x04040001, 0x04000100, 0x00040101, 0x04040000,
151   0x00040100, 0x00000000, 0x04000000, 0x00040101,
152   0x04040100, 0x00000100, 0x00000001, 0x00040000,
153   0x00000101, 0x00040001, 0x04040000, 0x04000101,
154   0x00000000, 0x04040100, 0x00040100, 0x04040001,
155   0x00040001, 0x04000000, 0x04040101, 0x00000001,
156   0x00040101, 0x04000001, 0x04000000, 0x04040101,
157   0x00040000, 0x04000100, 0x04000101, 0x00040100,
158   0x04000100, 0x00000000, 0x04040001, 0x00000101,
159   0x04000001, 0x00040101, 0x00000100, 0x04040000,
160   /* nibble 3 */
161   0x00401008, 0x10001000, 0x00000008, 0x10401008,
162   0x00000000, 0x10400000, 0x10001008, 0x00400008,
163   0x10401000, 0x10000008, 0x10000000, 0x00001008,
164   0x10000008, 0x00401008, 0x00400000, 0x10000000,
165   0x10400008, 0x00401000, 0x00001000, 0x00000008,
166   0x00401000, 0x10001008, 0x10400000, 0x00001000,
167   0x00001008, 0x00000000, 0x00400008, 0x10401000,
168   0x10001000, 0x10400008, 0x10401008, 0x00400000,
169   0x10400008, 0x00001008, 0x00400000, 0x10000008,
170   0x00401000, 0x10001000, 0x00000008, 0x10400000,
171   0x10001008, 0x00000000, 0x00001000, 0x00400008,
172   0x00000000, 0x10400008, 0x10401000, 0x00001000,
173   0x10000000, 0x10401008, 0x00401008, 0x00400000,
174   0x10401008, 0x00000008, 0x10001000, 0x00401008,
175   0x00400008, 0x00401000, 0x10400000, 0x10001008,
176   0x00001008, 0x10000000, 0x10000008, 0x10401000,
177   /* nibble 4 */
178   0x08000000, 0x00010000, 0x00000400, 0x08010420,
179   0x08010020, 0x08000400, 0x00010420, 0x08010000,
180   0x00010000, 0x00000020, 0x08000020, 0x00010400,
181   0x08000420, 0x08010020, 0x08010400, 0x00000000,
182   0x00010400, 0x08000000, 0x00010020, 0x00000420,
183   0x08000400, 0x00010420, 0x00000000, 0x08000020,
184   0x00000020, 0x08000420, 0x08010420, 0x00010020,
185   0x08010000, 0x00000400, 0x00000420, 0x08010400,
186   0x08010400, 0x08000420, 0x00010020, 0x08010000,
187   0x00010000, 0x00000020, 0x08000020, 0x08000400,
188   0x08000000, 0x00010400, 0x08010420, 0x00000000,
189   0x00010420, 0x08000000, 0x00000400, 0x00010020,
190   0x08000420, 0x00000400, 0x00000000, 0x08010420,
191   0x08010020, 0x08010400, 0x00000420, 0x00010000,
192   0x00010400, 0x08010020, 0x08000400, 0x00000420,
193   0x00000020, 0x00010420, 0x08010000, 0x08000020,
194   /* nibble 5 */
195   0x80000040, 0x00200040, 0x00000000, 0x80202000,
196   0x00200040, 0x00002000, 0x80002040, 0x00200000,
197   0x00002040, 0x80202040, 0x00202000, 0x80000000,
198   0x80002000, 0x80000040, 0x80200000, 0x00202040,
199   0x00200000, 0x80002040, 0x80200040, 0x00000000,
200   0x00002000, 0x00000040, 0x80202000, 0x80200040,
201   0x80202040, 0x80200000, 0x80000000, 0x00002040,
202   0x00000040, 0x00202000, 0x00202040, 0x80002000,
203   0x00002040, 0x80000000, 0x80002000, 0x00202040,
204   0x80202000, 0x00200040, 0x00000000, 0x80002000,
205   0x80000000, 0x00002000, 0x80200040, 0x00200000,
206   0x00200040, 0x80202040, 0x00202000, 0x00000040,
207   0x80202040, 0x00202000, 0x00200000, 0x80002040,
208   0x80000040, 0x80200000, 0x00202040, 0x00000000,
209   0x00002000, 0x80000040, 0x80002040, 0x80202000,
210   0x80200000, 0x00002040, 0x00000040, 0x80200040,
211   /* nibble 6 */
212   0x00004000, 0x00000200, 0x01000200, 0x01000004,
213   0x01004204, 0x00004004, 0x00004200, 0x00000000,
214   0x01000000, 0x01000204, 0x00000204, 0x01004000,
215   0x00000004, 0x01004200, 0x01004000, 0x00000204,
216   0x01000204, 0x00004000, 0x00004004, 0x01004204,
217   0x00000000, 0x01000200, 0x01000004, 0x00004200,
218   0x01004004, 0x00004204, 0x01004200, 0x00000004,
219   0x00004204, 0x01004004, 0x00000200, 0x01000000,
220   0x00004204, 0x01004000, 0x01004004, 0x00000204,
221   0x00004000, 0x00000200, 0x01000000, 0x01004004,
222   0x01000204, 0x00004204, 0x00004200, 0x00000000,
223   0x00000200, 0x01000004, 0x00000004, 0x01000200,
224   0x00000000, 0x01000204, 0x01000200, 0x00004200,
225   0x00000204, 0x00004000, 0x01004204, 0x01000000,
226   0x01004200, 0x00000004, 0x00004004, 0x01004204,
227   0x01000004, 0x01004200, 0x01004000, 0x00004004,
228   /* nibble 7 */
229   0x20800080, 0x20820000, 0x00020080, 0x00000000,
230   0x20020000, 0x00800080, 0x20800000, 0x20820080,
231   0x00000080, 0x20000000, 0x00820000, 0x00020080,
232   0x00820080, 0x20020080, 0x20000080, 0x20800000,
233   0x00020000, 0x00820080, 0x00800080, 0x20020000,
234   0x20820080, 0x20000080, 0x00000000, 0x00820000,
235   0x20000000, 0x00800000, 0x20020080, 0x20800080,
236   0x00800000, 0x00020000, 0x20820000, 0x00000080,
237   0x00800000, 0x00020000, 0x20000080, 0x20820080,
238   0x00020080, 0x20000000, 0x00000000, 0x00820000,
239   0x20800080, 0x20020080, 0x20020000, 0x00800080,
240   0x20820000, 0x00000080, 0x00800080, 0x20020000,
241   0x20820080, 0x00800000, 0x20800000, 0x20000080,
242   0x00820000, 0x00020080, 0x20020080, 0x20800000,
243   0x00000080, 0x20820000, 0x00820080, 0x00000000,
244   0x20000000, 0x20800080, 0x00020000, 0x00820080,
245 };
246
247 __constant u32 c_skb[8][64] =
248 {
249   /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
250   0x00000000, 0x00000010, 0x20000000, 0x20000010,
251   0x00010000, 0x00010010, 0x20010000, 0x20010010,
252   0x00000800, 0x00000810, 0x20000800, 0x20000810,
253   0x00010800, 0x00010810, 0x20010800, 0x20010810,
254   0x00000020, 0x00000030, 0x20000020, 0x20000030,
255   0x00010020, 0x00010030, 0x20010020, 0x20010030,
256   0x00000820, 0x00000830, 0x20000820, 0x20000830,
257   0x00010820, 0x00010830, 0x20010820, 0x20010830,
258   0x00080000, 0x00080010, 0x20080000, 0x20080010,
259   0x00090000, 0x00090010, 0x20090000, 0x20090010,
260   0x00080800, 0x00080810, 0x20080800, 0x20080810,
261   0x00090800, 0x00090810, 0x20090800, 0x20090810,
262   0x00080020, 0x00080030, 0x20080020, 0x20080030,
263   0x00090020, 0x00090030, 0x20090020, 0x20090030,
264   0x00080820, 0x00080830, 0x20080820, 0x20080830,
265   0x00090820, 0x00090830, 0x20090820, 0x20090830,
266   /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
267   0x00000000, 0x02000000, 0x00002000, 0x02002000,
268   0x00200000, 0x02200000, 0x00202000, 0x02202000,
269   0x00000004, 0x02000004, 0x00002004, 0x02002004,
270   0x00200004, 0x02200004, 0x00202004, 0x02202004,
271   0x00000400, 0x02000400, 0x00002400, 0x02002400,
272   0x00200400, 0x02200400, 0x00202400, 0x02202400,
273   0x00000404, 0x02000404, 0x00002404, 0x02002404,
274   0x00200404, 0x02200404, 0x00202404, 0x02202404,
275   0x10000000, 0x12000000, 0x10002000, 0x12002000,
276   0x10200000, 0x12200000, 0x10202000, 0x12202000,
277   0x10000004, 0x12000004, 0x10002004, 0x12002004,
278   0x10200004, 0x12200004, 0x10202004, 0x12202004,
279   0x10000400, 0x12000400, 0x10002400, 0x12002400,
280   0x10200400, 0x12200400, 0x10202400, 0x12202400,
281   0x10000404, 0x12000404, 0x10002404, 0x12002404,
282   0x10200404, 0x12200404, 0x10202404, 0x12202404,
283   /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
284   0x00000000, 0x00000001, 0x00040000, 0x00040001,
285   0x01000000, 0x01000001, 0x01040000, 0x01040001,
286   0x00000002, 0x00000003, 0x00040002, 0x00040003,
287   0x01000002, 0x01000003, 0x01040002, 0x01040003,
288   0x00000200, 0x00000201, 0x00040200, 0x00040201,
289   0x01000200, 0x01000201, 0x01040200, 0x01040201,
290   0x00000202, 0x00000203, 0x00040202, 0x00040203,
291   0x01000202, 0x01000203, 0x01040202, 0x01040203,
292   0x08000000, 0x08000001, 0x08040000, 0x08040001,
293   0x09000000, 0x09000001, 0x09040000, 0x09040001,
294   0x08000002, 0x08000003, 0x08040002, 0x08040003,
295   0x09000002, 0x09000003, 0x09040002, 0x09040003,
296   0x08000200, 0x08000201, 0x08040200, 0x08040201,
297   0x09000200, 0x09000201, 0x09040200, 0x09040201,
298   0x08000202, 0x08000203, 0x08040202, 0x08040203,
299   0x09000202, 0x09000203, 0x09040202, 0x09040203,
300   /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
301   0x00000000, 0x00100000, 0x00000100, 0x00100100,
302   0x00000008, 0x00100008, 0x00000108, 0x00100108,
303   0x00001000, 0x00101000, 0x00001100, 0x00101100,
304   0x00001008, 0x00101008, 0x00001108, 0x00101108,
305   0x04000000, 0x04100000, 0x04000100, 0x04100100,
306   0x04000008, 0x04100008, 0x04000108, 0x04100108,
307   0x04001000, 0x04101000, 0x04001100, 0x04101100,
308   0x04001008, 0x04101008, 0x04001108, 0x04101108,
309   0x00020000, 0x00120000, 0x00020100, 0x00120100,
310   0x00020008, 0x00120008, 0x00020108, 0x00120108,
311   0x00021000, 0x00121000, 0x00021100, 0x00121100,
312   0x00021008, 0x00121008, 0x00021108, 0x00121108,
313   0x04020000, 0x04120000, 0x04020100, 0x04120100,
314   0x04020008, 0x04120008, 0x04020108, 0x04120108,
315   0x04021000, 0x04121000, 0x04021100, 0x04121100,
316   0x04021008, 0x04121008, 0x04021108, 0x04121108,
317   /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
318   0x00000000, 0x10000000, 0x00010000, 0x10010000,
319   0x00000004, 0x10000004, 0x00010004, 0x10010004,
320   0x20000000, 0x30000000, 0x20010000, 0x30010000,
321   0x20000004, 0x30000004, 0x20010004, 0x30010004,
322   0x00100000, 0x10100000, 0x00110000, 0x10110000,
323   0x00100004, 0x10100004, 0x00110004, 0x10110004,
324   0x20100000, 0x30100000, 0x20110000, 0x30110000,
325   0x20100004, 0x30100004, 0x20110004, 0x30110004,
326   0x00001000, 0x10001000, 0x00011000, 0x10011000,
327   0x00001004, 0x10001004, 0x00011004, 0x10011004,
328   0x20001000, 0x30001000, 0x20011000, 0x30011000,
329   0x20001004, 0x30001004, 0x20011004, 0x30011004,
330   0x00101000, 0x10101000, 0x00111000, 0x10111000,
331   0x00101004, 0x10101004, 0x00111004, 0x10111004,
332   0x20101000, 0x30101000, 0x20111000, 0x30111000,
333   0x20101004, 0x30101004, 0x20111004, 0x30111004,
334   /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
335   0x00000000, 0x08000000, 0x00000008, 0x08000008,
336   0x00000400, 0x08000400, 0x00000408, 0x08000408,
337   0x00020000, 0x08020000, 0x00020008, 0x08020008,
338   0x00020400, 0x08020400, 0x00020408, 0x08020408,
339   0x00000001, 0x08000001, 0x00000009, 0x08000009,
340   0x00000401, 0x08000401, 0x00000409, 0x08000409,
341   0x00020001, 0x08020001, 0x00020009, 0x08020009,
342   0x00020401, 0x08020401, 0x00020409, 0x08020409,
343   0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
344   0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
345   0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
346   0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
347   0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
348   0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
349   0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
350   0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
351   /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
352   0x00000000, 0x00000100, 0x00080000, 0x00080100,
353   0x01000000, 0x01000100, 0x01080000, 0x01080100,
354   0x00000010, 0x00000110, 0x00080010, 0x00080110,
355   0x01000010, 0x01000110, 0x01080010, 0x01080110,
356   0x00200000, 0x00200100, 0x00280000, 0x00280100,
357   0x01200000, 0x01200100, 0x01280000, 0x01280100,
358   0x00200010, 0x00200110, 0x00280010, 0x00280110,
359   0x01200010, 0x01200110, 0x01280010, 0x01280110,
360   0x00000200, 0x00000300, 0x00080200, 0x00080300,
361   0x01000200, 0x01000300, 0x01080200, 0x01080300,
362   0x00000210, 0x00000310, 0x00080210, 0x00080310,
363   0x01000210, 0x01000310, 0x01080210, 0x01080310,
364   0x00200200, 0x00200300, 0x00280200, 0x00280300,
365   0x01200200, 0x01200300, 0x01280200, 0x01280300,
366   0x00200210, 0x00200310, 0x00280210, 0x00280310,
367   0x01200210, 0x01200310, 0x01280210, 0x01280310,
368   /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
369   0x00000000, 0x04000000, 0x00040000, 0x04040000,
370   0x00000002, 0x04000002, 0x00040002, 0x04040002,
371   0x00002000, 0x04002000, 0x00042000, 0x04042000,
372   0x00002002, 0x04002002, 0x00042002, 0x04042002,
373   0x00000020, 0x04000020, 0x00040020, 0x04040020,
374   0x00000022, 0x04000022, 0x00040022, 0x04040022,
375   0x00002020, 0x04002020, 0x00042020, 0x04042020,
376   0x00002022, 0x04002022, 0x00042022, 0x04042022,
377   0x00000800, 0x04000800, 0x00040800, 0x04040800,
378   0x00000802, 0x04000802, 0x00040802, 0x04040802,
379   0x00002800, 0x04002800, 0x00042800, 0x04042800,
380   0x00002802, 0x04002802, 0x00042802, 0x04042802,
381   0x00000820, 0x04000820, 0x00040820, 0x04040820,
382   0x00000822, 0x04000822, 0x00040822, 0x04040822,
383   0x00002820, 0x04002820, 0x00042820, 0x04042820,
384   0x00002822, 0x04002822, 0x00042822, 0x04042822,
385 };
386
387 #define NBOX(i,n,S) (S)[(n)][(i)]
388
389 static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64])
390 {
391   u32x tt;
392
393   u32x r = data[0];
394   u32x l = data[1];
395
396   #pragma unroll 16
397   for (u32 i = 0; i < 16; i++)
398   {
399     u32x u = Kc[i] ^ r;
400     u32x t = Kd[i] ^ rotl32 (r, 28u);
401
402     #ifdef VECT_SIZE1
403     l    ^= NBOX (((u    >>  2) & 0x3f), 0, s_SPtrans)
404           | NBOX (((u    >> 10) & 0x3f), 2, s_SPtrans)
405           | NBOX (((u    >> 18) & 0x3f), 4, s_SPtrans)
406           | NBOX (((u    >> 26) & 0x3f), 6, s_SPtrans)
407           | NBOX (((t    >>  2) & 0x3f), 1, s_SPtrans)
408           | NBOX (((t    >> 10) & 0x3f), 3, s_SPtrans)
409           | NBOX (((t    >> 18) & 0x3f), 5, s_SPtrans)
410           | NBOX (((t    >> 26) & 0x3f), 7, s_SPtrans);
411     #endif
412
413     #ifdef VECT_SIZE2
414     l.s0 ^= NBOX (((u.s0 >>  2) & 0x3f), 0, s_SPtrans)
415           | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans)
416           | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans)
417           | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans)
418           | NBOX (((t.s0 >>  2) & 0x3f), 1, s_SPtrans)
419           | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans)
420           | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans)
421           | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans);
422
423     l.s1 ^= NBOX (((u.s1 >>  2) & 0x3f), 0, s_SPtrans)
424           | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans)
425           | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans)
426           | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans)
427           | NBOX (((t.s1 >>  2) & 0x3f), 1, s_SPtrans)
428           | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans)
429           | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans)
430           | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans);
431     #endif
432
433     #ifdef VECT_SIZE4
434     l.s0 ^= NBOX (((u.s0 >>  2) & 0x3f), 0, s_SPtrans)
435           | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans)
436           | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans)
437           | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans)
438           | NBOX (((t.s0 >>  2) & 0x3f), 1, s_SPtrans)
439           | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans)
440           | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans)
441           | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans);
442
443     l.s1 ^= NBOX (((u.s1 >>  2) & 0x3f), 0, s_SPtrans)
444           | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans)
445           | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans)
446           | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans)
447           | NBOX (((t.s1 >>  2) & 0x3f), 1, s_SPtrans)
448           | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans)
449           | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans)
450           | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans);
451
452     l.s2 ^= NBOX (((u.s2 >>  2) & 0x3f), 0, s_SPtrans)
453           | NBOX (((u.s2 >> 10) & 0x3f), 2, s_SPtrans)
454           | NBOX (((u.s2 >> 18) & 0x3f), 4, s_SPtrans)
455           | NBOX (((u.s2 >> 26) & 0x3f), 6, s_SPtrans)
456           | NBOX (((t.s2 >>  2) & 0x3f), 1, s_SPtrans)
457           | NBOX (((t.s2 >> 10) & 0x3f), 3, s_SPtrans)
458           | NBOX (((t.s2 >> 18) & 0x3f), 5, s_SPtrans)
459           | NBOX (((t.s2 >> 26) & 0x3f), 7, s_SPtrans);
460
461     l.s3 ^= NBOX (((u.s3 >>  2) & 0x3f), 0, s_SPtrans)
462           | NBOX (((u.s3 >> 10) & 0x3f), 2, s_SPtrans)
463           | NBOX (((u.s3 >> 18) & 0x3f), 4, s_SPtrans)
464           | NBOX (((u.s3 >> 26) & 0x3f), 6, s_SPtrans)
465           | NBOX (((t.s3 >>  2) & 0x3f), 1, s_SPtrans)
466           | NBOX (((t.s3 >> 10) & 0x3f), 3, s_SPtrans)
467           | NBOX (((t.s3 >> 18) & 0x3f), 5, s_SPtrans)
468           | NBOX (((t.s3 >> 26) & 0x3f), 7, s_SPtrans);
469     #endif
470
471     tt = l;
472     l  = r;
473     r  = tt;
474   }
475
476   iv[0] = l;
477   iv[1] = r;
478 }
479
480 static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64])
481 {
482   u32x tt;
483
484   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
485   HPERM_OP (c,    tt, 2, 0xcccc0000);
486   HPERM_OP (d,    tt, 2, 0xcccc0000);
487   PERM_OP  (d, c, tt, 1, 0x55555555);
488   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
489   PERM_OP  (d, c, tt, 1, 0x55555555);
490
491   d = ((d & 0x000000ff) << 16)
492     | ((d & 0x0000ff00) <<  0)
493     | ((d & 0x00ff0000) >> 16)
494     | ((c & 0xf0000000) >>  4);
495
496   c = c & 0x0fffffff;
497
498   #pragma unroll 16
499   for (u32 i = 0; i < 16; i++)
500   {
501     const u32 shifts3s0[16] = {  1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1 };
502     const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 };
503
504     c = c >> shifts3s0[i] | c << shifts3s1[i];
505     d = d >> shifts3s0[i] | d << shifts3s1[i];
506
507     c = c & 0x0fffffff;
508     d = d & 0x0fffffff;
509
510     u32x s;
511     u32x t;
512
513     #ifdef VECT_SIZE1
514     s     = NBOX ((( c    >>  0) & 0x3f),  0, s_skb)
515           | NBOX ((((c    >>  6) & 0x03)
516                  | ((c    >>  7) & 0x3c)), 1, s_skb)
517           | NBOX ((((c    >> 13) & 0x0f)
518                  | ((c    >> 14) & 0x30)), 2, s_skb)
519           | NBOX ((((c    >> 20) & 0x01)
520                  | ((c    >> 21) & 0x06)
521                  | ((c    >> 22) & 0x38)), 3, s_skb);
522
523     t     = NBOX ((( d    >>  0) & 0x3f),  4, s_skb)
524           | NBOX ((((d    >>  7) & 0x03)
525                  | ((d    >>  8) & 0x3c)), 5, s_skb)
526           | NBOX ((((d    >> 15) & 0x3f)), 6, s_skb)
527           | NBOX ((((d    >> 21) & 0x0f)
528                  | ((d    >> 22) & 0x30)), 7, s_skb);
529     #endif
530
531     #ifdef VECT_SIZE2
532     s.s0  = NBOX ((( c.s0 >>  0) & 0x3f),  0, s_skb)
533           | NBOX ((((c.s0 >>  6) & 0x03)
534                  | ((c.s0 >>  7) & 0x3c)), 1, s_skb)
535           | NBOX ((((c.s0 >> 13) & 0x0f)
536                  | ((c.s0 >> 14) & 0x30)), 2, s_skb)
537           | NBOX ((((c.s0 >> 20) & 0x01)
538                  | ((c.s0 >> 21) & 0x06)
539                  | ((c.s0 >> 22) & 0x38)), 3, s_skb);
540
541     t.s0  = NBOX ((( d.s0 >>  0) & 0x3f),  4, s_skb)
542           | NBOX ((((d.s0 >>  7) & 0x03)
543                  | ((d.s0 >>  8) & 0x3c)), 5, s_skb)
544           | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb)
545           | NBOX ((((d.s0 >> 21) & 0x0f)
546                  | ((d.s0 >> 22) & 0x30)), 7, s_skb);
547
548     s.s1  = NBOX ((( c.s1 >>  0) & 0x3f),  0, s_skb)
549           | NBOX ((((c.s1 >>  6) & 0x03)
550                  | ((c.s1 >>  7) & 0x3c)), 1, s_skb)
551           | NBOX ((((c.s1 >> 13) & 0x0f)
552                  | ((c.s1 >> 14) & 0x30)), 2, s_skb)
553           | NBOX ((((c.s1 >> 20) & 0x01)
554                  | ((c.s1 >> 21) & 0x06)
555                  | ((c.s1 >> 22) & 0x38)), 3, s_skb);
556
557     t.s1  = NBOX ((( d.s1 >>  0) & 0x3f),  4, s_skb)
558           | NBOX ((((d.s1 >>  7) & 0x03)
559                  | ((d.s1 >>  8) & 0x3c)), 5, s_skb)
560           | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb)
561           | NBOX ((((d.s1 >> 21) & 0x0f)
562                  | ((d.s1 >> 22) & 0x30)), 7, s_skb);
563     #endif
564
565     #ifdef VECT_SIZE4
566     s.s0  = NBOX ((( c.s0 >>  0) & 0x3f),  0, s_skb)
567           | NBOX ((((c.s0 >>  6) & 0x03)
568                  | ((c.s0 >>  7) & 0x3c)), 1, s_skb)
569           | NBOX ((((c.s0 >> 13) & 0x0f)
570                  | ((c.s0 >> 14) & 0x30)), 2, s_skb)
571           | NBOX ((((c.s0 >> 20) & 0x01)
572                  | ((c.s0 >> 21) & 0x06)
573                  | ((c.s0 >> 22) & 0x38)), 3, s_skb);
574
575     t.s0  = NBOX ((( d.s0 >>  0) & 0x3f),  4, s_skb)
576           | NBOX ((((d.s0 >>  7) & 0x03)
577                  | ((d.s0 >>  8) & 0x3c)), 5, s_skb)
578           | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb)
579           | NBOX ((((d.s0 >> 21) & 0x0f)
580                  | ((d.s0 >> 22) & 0x30)), 7, s_skb);
581
582     s.s1  = NBOX ((( c.s1 >>  0) & 0x3f),  0, s_skb)
583           | NBOX ((((c.s1 >>  6) & 0x03)
584                  | ((c.s1 >>  7) & 0x3c)), 1, s_skb)
585           | NBOX ((((c.s1 >> 13) & 0x0f)
586                  | ((c.s1 >> 14) & 0x30)), 2, s_skb)
587           | NBOX ((((c.s1 >> 20) & 0x01)
588                  | ((c.s1 >> 21) & 0x06)
589                  | ((c.s1 >> 22) & 0x38)), 3, s_skb);
590
591     t.s1  = NBOX ((( d.s1 >>  0) & 0x3f),  4, s_skb)
592           | NBOX ((((d.s1 >>  7) & 0x03)
593                  | ((d.s1 >>  8) & 0x3c)), 5, s_skb)
594           | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb)
595           | NBOX ((((d.s1 >> 21) & 0x0f)
596                  | ((d.s1 >> 22) & 0x30)), 7, s_skb);
597
598     s.s2  = NBOX ((( c.s2 >>  0) & 0x3f),  0, s_skb)
599           | NBOX ((((c.s2 >>  6) & 0x03)
600                  | ((c.s2 >>  7) & 0x3c)), 1, s_skb)
601           | NBOX ((((c.s2 >> 13) & 0x0f)
602                  | ((c.s2 >> 14) & 0x30)), 2, s_skb)
603           | NBOX ((((c.s2 >> 20) & 0x01)
604                  | ((c.s2 >> 21) & 0x06)
605                  | ((c.s2 >> 22) & 0x38)), 3, s_skb);
606
607     t.s2  = NBOX ((( d.s2 >>  0) & 0x3f),  4, s_skb)
608           | NBOX ((((d.s2 >>  7) & 0x03)
609                  | ((d.s2 >>  8) & 0x3c)), 5, s_skb)
610           | NBOX ((((d.s2 >> 15) & 0x3f)), 6, s_skb)
611           | NBOX ((((d.s2 >> 21) & 0x0f)
612                  | ((d.s2 >> 22) & 0x30)), 7, s_skb);
613
614     s.s3  = NBOX ((( c.s3 >>  0) & 0x3f),  0, s_skb)
615           | NBOX ((((c.s3 >>  6) & 0x03)
616                  | ((c.s3 >>  7) & 0x3c)), 1, s_skb)
617           | NBOX ((((c.s3 >> 13) & 0x0f)
618                  | ((c.s3 >> 14) & 0x30)), 2, s_skb)
619           | NBOX ((((c.s3 >> 20) & 0x01)
620                  | ((c.s3 >> 21) & 0x06)
621                  | ((c.s3 >> 22) & 0x38)), 3, s_skb);
622
623     t.s3  = NBOX ((( d.s3 >>  0) & 0x3f),  4, s_skb)
624           | NBOX ((((d.s3 >>  7) & 0x03)
625                  | ((d.s3 >>  8) & 0x3c)), 5, s_skb)
626           | NBOX ((((d.s3 >> 15) & 0x3f)), 6, s_skb)
627           | NBOX ((((d.s3 >> 21) & 0x0f)
628                  | ((d.s3 >> 22) & 0x30)), 7, s_skb);
629     #endif
630
631     #if defined cl_amd_media_ops
632     Kc[i] = amd_bytealign (t, s << 16, 2);
633     Kd[i] = amd_bytealign (t >> 16, s, 2);
634     #else
635     Kc[i] = ((t << 16) | (s & 0x0000ffff));
636     Kd[i] = ((s >> 16) | (t & 0xffff0000));
637     #endif
638
639     Kc[i] = rotl32 (Kc[i], 2u);
640     Kd[i] = rotl32 (Kd[i], 2u);
641   }
642 }
643
644 static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2])
645 {
646   #ifdef VECT_SIZE1
647
648   key[0]    = (ascii_to_ebcdic_pc[(w0    >>  0) & 0xff]) <<  0
649             | (ascii_to_ebcdic_pc[(w0    >>  8) & 0xff]) <<  8
650             | (ascii_to_ebcdic_pc[(w0    >> 16) & 0xff]) << 16
651             | (ascii_to_ebcdic_pc[(w0    >> 24) & 0xff]) << 24;
652
653   key[1]    = (ascii_to_ebcdic_pc[(w1    >>  0) & 0xff]) <<  0
654             | (ascii_to_ebcdic_pc[(w1    >>  8) & 0xff]) <<  8
655             | (ascii_to_ebcdic_pc[(w1    >> 16) & 0xff]) << 16
656             | (ascii_to_ebcdic_pc[(w1    >> 24) & 0xff]) << 24;
657   #endif
658
659   #ifdef VECT_SIZE2
660
661   key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >>  0) & 0xff]) <<  0
662             | (ascii_to_ebcdic_pc[(w0.s0 >>  8) & 0xff]) <<  8
663             | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16
664             | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24;
665
666   key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >>  0) & 0xff]) <<  0
667             | (ascii_to_ebcdic_pc[(w0.s1 >>  8) & 0xff]) <<  8
668             | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16
669             | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24;
670
671   key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >>  0) & 0xff]) <<  0
672             | (ascii_to_ebcdic_pc[(w1.s0 >>  8) & 0xff]) <<  8
673             | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16
674             | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24;
675
676   key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >>  0) & 0xff]) <<  0
677             | (ascii_to_ebcdic_pc[(w1.s1 >>  8) & 0xff]) <<  8
678             | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16
679             | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24;
680   #endif
681
682   #ifdef VECT_SIZE4
683   key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >>  0) & 0xff]) <<  0
684             | (ascii_to_ebcdic_pc[(w0.s0 >>  8) & 0xff]) <<  8
685             | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16
686             | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24;
687
688   key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >>  0) & 0xff]) <<  0
689             | (ascii_to_ebcdic_pc[(w0.s1 >>  8) & 0xff]) <<  8
690             | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16
691             | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24;
692
693   key[0].s2 = (ascii_to_ebcdic_pc[(w0.s2 >>  0) & 0xff]) <<  0
694             | (ascii_to_ebcdic_pc[(w0.s2 >>  8) & 0xff]) <<  8
695             | (ascii_to_ebcdic_pc[(w0.s2 >> 16) & 0xff]) << 16
696             | (ascii_to_ebcdic_pc[(w0.s2 >> 24) & 0xff]) << 24;
697
698   key[0].s3 = (ascii_to_ebcdic_pc[(w0.s3 >>  0) & 0xff]) <<  0
699             | (ascii_to_ebcdic_pc[(w0.s3 >>  8) & 0xff]) <<  8
700             | (ascii_to_ebcdic_pc[(w0.s3 >> 16) & 0xff]) << 16
701             | (ascii_to_ebcdic_pc[(w0.s3 >> 24) & 0xff]) << 24;
702
703   key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >>  0) & 0xff]) <<  0
704             | (ascii_to_ebcdic_pc[(w1.s0 >>  8) & 0xff]) <<  8
705             | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16
706             | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24;
707
708   key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >>  0) & 0xff]) <<  0
709             | (ascii_to_ebcdic_pc[(w1.s1 >>  8) & 0xff]) <<  8
710             | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16
711             | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24;
712
713   key[1].s2 = (ascii_to_ebcdic_pc[(w1.s2 >>  0) & 0xff]) <<  0
714             | (ascii_to_ebcdic_pc[(w1.s2 >>  8) & 0xff]) <<  8
715             | (ascii_to_ebcdic_pc[(w1.s2 >> 16) & 0xff]) << 16
716             | (ascii_to_ebcdic_pc[(w1.s2 >> 24) & 0xff]) << 24;
717
718   key[1].s3 = (ascii_to_ebcdic_pc[(w1.s3 >>  0) & 0xff]) <<  0
719             | (ascii_to_ebcdic_pc[(w1.s3 >>  8) & 0xff]) <<  8
720             | (ascii_to_ebcdic_pc[(w1.s3 >> 16) & 0xff]) << 16
721             | (ascii_to_ebcdic_pc[(w1.s3 >> 24) & 0xff]) << 24;
722   #endif
723 }
724
725 __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)
726 {
727   /**
728    * modifier
729    */
730
731   const u32 lid = get_local_id (0);
732
733   /**
734    * base
735    */
736
737   const u32 gid = get_global_id (0);
738
739   u32x wordl0[4];
740
741   wordl0[0] = pws[gid].i[ 0];
742   wordl0[1] = pws[gid].i[ 1];
743   wordl0[2] = 0;
744   wordl0[3] = 0;
745
746   u32x wordl1[4];
747
748   wordl1[0] = 0;
749   wordl1[1] = 0;
750   wordl1[2] = 0;
751   wordl1[3] = 0;
752
753   u32x wordl2[4];
754
755   wordl2[0] = 0;
756   wordl2[1] = 0;
757   wordl2[2] = 0;
758   wordl2[3] = 0;
759
760   u32x wordl3[4];
761
762   wordl3[0] = 0;
763   wordl3[1] = 0;
764   wordl3[2] = 0;
765   wordl3[3] = 0;
766
767   const u32 pw_l_len = pws[gid].pw_len;
768
769   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
770   {
771     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
772   }
773
774   /**
775    * salt
776    */
777
778   u32 salt_buf0[2];
779
780   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
781   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
782
783   /**
784    * sbox, kbox
785    */
786
787   __local u32 s_SPtrans[8][64];
788
789   __local u32 s_skb[8][64];
790
791   s_SPtrans[0][lid] = c_SPtrans[0][lid];
792   s_SPtrans[1][lid] = c_SPtrans[1][lid];
793   s_SPtrans[2][lid] = c_SPtrans[2][lid];
794   s_SPtrans[3][lid] = c_SPtrans[3][lid];
795   s_SPtrans[4][lid] = c_SPtrans[4][lid];
796   s_SPtrans[5][lid] = c_SPtrans[5][lid];
797   s_SPtrans[6][lid] = c_SPtrans[6][lid];
798   s_SPtrans[7][lid] = c_SPtrans[7][lid];
799
800   s_skb[0][lid] = c_skb[0][lid];
801   s_skb[1][lid] = c_skb[1][lid];
802   s_skb[2][lid] = c_skb[2][lid];
803   s_skb[3][lid] = c_skb[3][lid];
804   s_skb[4][lid] = c_skb[4][lid];
805   s_skb[5][lid] = c_skb[5][lid];
806   s_skb[6][lid] = c_skb[6][lid];
807   s_skb[7][lid] = c_skb[7][lid];
808
809   barrier (CLK_LOCAL_MEM_FENCE);
810
811   if (gid >= gid_max) return;
812
813   /**
814    * main
815    */
816
817   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
818   {
819     const u32 pw_r_len = combs_buf[il_pos].pw_len;
820
821     u32 pw_len = pw_l_len + pw_r_len;
822
823     pw_len = (pw_len >= 8) ? 8 : pw_len;
824
825     u32 wordr0[4];
826
827     wordr0[0] = combs_buf[il_pos].i[0];
828     wordr0[1] = combs_buf[il_pos].i[1];
829     wordr0[2] = 0;
830     wordr0[3] = 0;
831
832     u32 wordr1[4];
833
834     wordr1[0] = 0;
835     wordr1[1] = 0;
836     wordr1[2] = 0;
837     wordr1[3] = 0;
838
839     u32 wordr2[4];
840
841     wordr2[0] = 0;
842     wordr2[1] = 0;
843     wordr2[2] = 0;
844     wordr2[3] = 0;
845
846     u32 wordr3[4];
847
848     wordr3[0] = 0;
849     wordr3[1] = 0;
850     wordr3[2] = 0;
851     wordr3[3] = 0;
852
853     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
854     {
855       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
856     }
857
858     u32x w0[4];
859
860     w0[0] = wordl0[0] | wordr0[0];
861     w0[1] = wordl0[1] | wordr0[1];
862     w0[2] = 0;
863     w0[3] = 0;
864
865     u32x w1[4];
866
867     w1[0] = 0;
868     w1[1] = 0;
869     w1[2] = 0;
870     w1[3] = 0;
871
872     u32x w2[4];
873
874     w2[0] = 0;
875     w2[1] = 0;
876     w2[2] = 0;
877     w2[3] = 0;
878
879     u32x w3[4];
880
881     w3[0] = 0;
882     w3[1] = 0;
883     w3[2] = 0;
884     w3[3] = 0;
885
886     u32x key[2];
887
888     transform_racf_key (w0[0], w0[1], key);
889
890     const u32x c = key[0];
891     const u32x d = key[1];
892
893     u32x Kc[16];
894     u32x Kd[16];
895
896     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
897
898     u32x data[2];
899
900     data[0] = salt_buf0[0];
901     data[1] = salt_buf0[1];
902
903     u32x iv[2];
904
905     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
906
907     const u32x r0 = iv[0];
908     const u32x r1 = iv[1];
909     const u32x r2 = 0;
910     const u32x r3 = 0;
911
912     #include VECT_COMPARE_M
913   }
914 }
915
916 __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)
917 {
918 }
919
920 __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)
921 {
922 }
923
924 __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)
925 {
926   /**
927    * modifier
928    */
929
930   const u32 lid = get_local_id (0);
931
932   /**
933    * base
934    */
935
936   const u32 gid = get_global_id (0);
937
938   u32x wordl0[4];
939
940   wordl0[0] = pws[gid].i[ 0];
941   wordl0[1] = pws[gid].i[ 1];
942   wordl0[2] = 0;
943   wordl0[3] = 0;
944
945   u32x wordl1[4];
946
947   wordl1[0] = 0;
948   wordl1[1] = 0;
949   wordl1[2] = 0;
950   wordl1[3] = 0;
951
952   u32x wordl2[4];
953
954   wordl2[0] = 0;
955   wordl2[1] = 0;
956   wordl2[2] = 0;
957   wordl2[3] = 0;
958
959   u32x wordl3[4];
960
961   wordl3[0] = 0;
962   wordl3[1] = 0;
963   wordl3[2] = 0;
964   wordl3[3] = 0;
965
966   const u32 pw_l_len = pws[gid].pw_len;
967
968   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
969   {
970     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
971   }
972
973   /**
974    * salt
975    */
976
977   u32 salt_buf0[2];
978
979   salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0];
980   salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1];
981
982   /**
983    * sbox, kbox
984    */
985
986   __local u32 s_SPtrans[8][64];
987
988   __local u32 s_skb[8][64];
989
990   s_SPtrans[0][lid] = c_SPtrans[0][lid];
991   s_SPtrans[1][lid] = c_SPtrans[1][lid];
992   s_SPtrans[2][lid] = c_SPtrans[2][lid];
993   s_SPtrans[3][lid] = c_SPtrans[3][lid];
994   s_SPtrans[4][lid] = c_SPtrans[4][lid];
995   s_SPtrans[5][lid] = c_SPtrans[5][lid];
996   s_SPtrans[6][lid] = c_SPtrans[6][lid];
997   s_SPtrans[7][lid] = c_SPtrans[7][lid];
998
999   s_skb[0][lid] = c_skb[0][lid];
1000   s_skb[1][lid] = c_skb[1][lid];
1001   s_skb[2][lid] = c_skb[2][lid];
1002   s_skb[3][lid] = c_skb[3][lid];
1003   s_skb[4][lid] = c_skb[4][lid];
1004   s_skb[5][lid] = c_skb[5][lid];
1005   s_skb[6][lid] = c_skb[6][lid];
1006   s_skb[7][lid] = c_skb[7][lid];
1007
1008   barrier (CLK_LOCAL_MEM_FENCE);
1009
1010   if (gid >= gid_max) return;
1011
1012   /**
1013    * digest
1014    */
1015
1016   const u32 search[4] =
1017   {
1018     digests_buf[digests_offset].digest_buf[DGST_R0],
1019     digests_buf[digests_offset].digest_buf[DGST_R1],
1020     digests_buf[digests_offset].digest_buf[DGST_R2],
1021     digests_buf[digests_offset].digest_buf[DGST_R3]
1022   };
1023
1024   /**
1025    * main
1026    */
1027
1028   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
1029   {
1030     const u32 pw_r_len = combs_buf[il_pos].pw_len;
1031
1032     u32 pw_len = pw_l_len + pw_r_len;
1033
1034     pw_len = (pw_len >= 8) ? 8 : pw_len;
1035
1036     u32 wordr0[4];
1037
1038     wordr0[0] = combs_buf[il_pos].i[0];
1039     wordr0[1] = combs_buf[il_pos].i[1];
1040     wordr0[2] = 0;
1041     wordr0[3] = 0;
1042
1043     u32 wordr1[4];
1044
1045     wordr1[0] = 0;
1046     wordr1[1] = 0;
1047     wordr1[2] = 0;
1048     wordr1[3] = 0;
1049
1050     u32 wordr2[4];
1051
1052     wordr2[0] = 0;
1053     wordr2[1] = 0;
1054     wordr2[2] = 0;
1055     wordr2[3] = 0;
1056
1057     u32 wordr3[4];
1058
1059     wordr3[0] = 0;
1060     wordr3[1] = 0;
1061     wordr3[2] = 0;
1062     wordr3[3] = 0;
1063
1064     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1065     {
1066       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1067     }
1068
1069     u32x w0[4];
1070
1071     w0[0] = wordl0[0] | wordr0[0];
1072     w0[1] = wordl0[1] | wordr0[1];
1073     w0[2] = 0;
1074     w0[3] = 0;
1075
1076     u32x w1[4];
1077
1078     w1[0] = 0;
1079     w1[1] = 0;
1080     w1[2] = 0;
1081     w1[3] = 0;
1082
1083     u32x w2[4];
1084
1085     w2[0] = 0;
1086     w2[1] = 0;
1087     w2[2] = 0;
1088     w2[3] = 0;
1089
1090     u32x w3[4];
1091
1092     w3[0] = 0;
1093     w3[1] = 0;
1094     w3[2] = 0;
1095     w3[3] = 0;
1096
1097     u32x key[2];
1098
1099     transform_racf_key (w0[0], w0[1], key);
1100
1101     const u32x c = key[0];
1102     const u32x d = key[1];
1103
1104     u32x Kc[16];
1105     u32x Kd[16];
1106
1107     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
1108
1109     u32x data[2];
1110
1111     data[0] = salt_buf0[0];
1112     data[1] = salt_buf0[1];
1113
1114     u32x iv[2];
1115
1116     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
1117
1118     const u32x r0 = iv[0];
1119     const u32x r1 = iv[1];
1120     const u32x r2 = 0;
1121     const u32x r3 = 0;
1122
1123     #include VECT_COMPARE_S
1124   }
1125 }
1126
1127 __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)
1128 {
1129 }
1130
1131 __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)
1132 {
1133 }