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