Merge pull request #181 from gm4tr1x/appleCpu
[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 #define BOX(i,n,S) (S)[(n)][(i)]
362
363 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 (*s_SPtrans)[64])
364 {
365   u32 tt;
366
367   u32 r = data[0];
368   u32 l = data[1];
369
370   IP (r, l, tt);
371
372   r = rotl32 (r, 3u);
373   l = rotl32 (l, 3u);
374
375   #pragma unroll 16
376   for (u32 i = 0; i < 16; i += 2)
377   {
378     u32 u;
379     u32 t;
380
381     u = Kc[i + 0] ^ r;
382     t = Kd[i + 0] ^ rotl32 (r, 28u);
383
384     l ^= BOX (((u >>  2) & 0x3f), 0, s_SPtrans)
385        | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
386        | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
387        | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
388        | BOX (((t >>  2) & 0x3f), 1, s_SPtrans)
389        | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
390        | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
391        | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
392
393     u = Kc[i + 1] ^ l;
394     t = Kd[i + 1] ^ rotl32 (l, 28u);
395
396     r ^= BOX (((u >>  2) & 0x3f), 0, s_SPtrans)
397        | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
398        | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
399        | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
400        | BOX (((t >>  2) & 0x3f), 1, s_SPtrans)
401        | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
402        | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
403        | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
404   }
405
406   l = rotl32 (l, 29u);
407   r = rotl32 (r, 29u);
408
409   FP (r, l, tt);
410
411   iv[0] = l;
412   iv[1] = r;
413 }
414
415 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 (*s_skb)[64])
416 {
417   u32 tt;
418
419   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
420   HPERM_OP (c,    tt, 2, 0xcccc0000);
421   HPERM_OP (d,    tt, 2, 0xcccc0000);
422   PERM_OP  (d, c, tt, 1, 0x55555555);
423   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
424   PERM_OP  (d, c, tt, 1, 0x55555555);
425
426   d = ((d & 0x000000ff) << 16)
427     | ((d & 0x0000ff00) <<  0)
428     | ((d & 0x00ff0000) >> 16)
429     | ((c & 0xf0000000) >>  4);
430
431   c = c & 0x0fffffff;
432
433   #pragma unroll 16
434   for (u32 i = 0; i < 16; i++)
435   {
436     if ((i < 2) || (i == 8) || (i == 15))
437     {
438       c = ((c >> 1) | (c << 27));
439       d = ((d >> 1) | (d << 27));
440     }
441     else
442     {
443       c = ((c >> 2) | (c << 26));
444       d = ((d >> 2) | (d << 26));
445     }
446
447     c = c & 0x0fffffff;
448     d = d & 0x0fffffff;
449
450     const u32 c00 = (c >>  0) & 0x0000003f;
451     const u32 c06 = (c >>  6) & 0x00383003;
452     const u32 c07 = (c >>  7) & 0x0000003c;
453     const u32 c13 = (c >> 13) & 0x0000060f;
454     const u32 c20 = (c >> 20) & 0x00000001;
455
456     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
457           | BOX (((c06 >>  0) & 0xff)
458                 |((c07 >>  0) & 0xff), 1, s_skb)
459           | BOX (((c13 >>  0) & 0xff)
460                 |((c06 >>  8) & 0xff), 2, s_skb)
461           | BOX (((c20 >>  0) & 0xff)
462                 |((c13 >>  8) & 0xff)
463                 |((c06 >> 16) & 0xff), 3, s_skb);
464
465     const u32 d00 = (d >>  0) & 0x00003c3f;
466     const u32 d07 = (d >>  7) & 0x00003f03;
467     const u32 d21 = (d >> 21) & 0x0000000f;
468     const u32 d22 = (d >> 22) & 0x00000030;
469
470     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
471           | BOX (((d07 >>  0) & 0xff)
472                 |((d00 >>  8) & 0xff), 5, s_skb)
473           | BOX (((d07 >>  8) & 0xff), 6, s_skb)
474           | BOX (((d21 >>  0) & 0xff)
475                 |((d22 >>  0) & 0xff), 7, s_skb);
476
477     Kc[i] = ((t << 16) | (s & 0x0000ffff));
478     Kd[i] = ((s >> 16) | (t & 0xffff0000));
479
480     Kc[i] = rotl32 (Kc[i], 2u);
481     Kd[i] = rotl32 (Kd[i], 2u);
482   }
483 }
484
485 __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)
486 {
487   /**
488    * modifier
489    */
490
491   const u32 gid = get_global_id (0);
492   const u32 lid = get_local_id (0);
493   const u32 lsz = get_local_size (0);
494
495   /**
496    * sbox, kbox
497    */
498
499   __local u32 s_SPtrans[8][64];
500   __local u32 s_skb[8][64];
501
502   for (u32 i = lid; i < 64; i += lsz)
503   {
504     s_SPtrans[0][i] = c_SPtrans[0][i];
505     s_SPtrans[1][i] = c_SPtrans[1][i];
506     s_SPtrans[2][i] = c_SPtrans[2][i];
507     s_SPtrans[3][i] = c_SPtrans[3][i];
508     s_SPtrans[4][i] = c_SPtrans[4][i];
509     s_SPtrans[5][i] = c_SPtrans[5][i];
510     s_SPtrans[6][i] = c_SPtrans[6][i];
511     s_SPtrans[7][i] = c_SPtrans[7][i];
512
513     s_skb[0][i] = c_skb[0][i];
514     s_skb[1][i] = c_skb[1][i];
515     s_skb[2][i] = c_skb[2][i];
516     s_skb[3][i] = c_skb[3][i];
517     s_skb[4][i] = c_skb[4][i];
518     s_skb[5][i] = c_skb[5][i];
519     s_skb[6][i] = c_skb[6][i];
520     s_skb[7][i] = c_skb[7][i];
521   }
522
523   barrier (CLK_LOCAL_MEM_FENCE);
524
525   if (gid >= gid_max) return;
526
527   /**
528    * base
529    */
530
531   u32 pw_buf0[4];
532
533   pw_buf0[0] = pws[gid].i[ 0];
534   pw_buf0[1] = pws[gid].i[ 1];
535   pw_buf0[2] = pws[gid].i[ 2];
536   pw_buf0[3] = pws[gid].i[ 3];
537
538   u32 pw_buf1[4];
539
540   pw_buf1[0] = pws[gid].i[ 4];
541   pw_buf1[1] = pws[gid].i[ 5];
542   pw_buf1[2] = pws[gid].i[ 6];
543   pw_buf1[3] = pws[gid].i[ 7];
544
545   const u32 pw_len = pws[gid].pw_len;
546
547   /**
548    * salt
549    */
550
551   u32 salt_buf0[4];
552
553   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
554   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
555   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
556   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
557
558   u32 salt_buf1[4];
559
560   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
561   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
562   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
563   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
564
565   const u32 salt_len = salt_bufs[salt_pos].salt_len;
566
567   /**
568    * loop
569    */
570
571   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
572   {
573     u32 w0[4];
574
575     w0[0] = pw_buf0[0];
576     w0[1] = pw_buf0[1];
577     w0[2] = pw_buf0[2];
578     w0[3] = pw_buf0[3];
579
580     u32 w1[4];
581
582     w1[0] = pw_buf1[0];
583     w1[1] = pw_buf1[1];
584     w1[2] = pw_buf1[2];
585     w1[3] = pw_buf1[3];
586
587     u32 w2[4];
588
589     w2[0] = 0;
590     w2[1] = 0;
591     w2[2] = 0;
592     w2[3] = 0;
593
594     u32 w3[4];
595
596     w3[0] = 0;
597     w3[1] = 0;
598     w3[2] = 0;
599     w3[3] = 0;
600
601     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
602
603     const u32 salt_word_len = (salt_len + out_len) * 2;
604
605     /**
606      * prepend salt
607      */
608
609     u32 w0_t[4];
610
611     w0_t[0] = w0[0];
612     w0_t[1] = w0[1];
613     w0_t[2] = w0[2];
614     w0_t[3] = w0[3];
615
616     u32 w1_t[4];
617
618     w1_t[0] = w1[0];
619     w1_t[1] = w1[1];
620     w1_t[2] = w1[2];
621     w1_t[3] = w1[3];
622
623     u32 w2_t[4];
624
625     w2_t[0] = w2[0];
626     w2_t[1] = w2[1];
627     w2_t[2] = w2[2];
628     w2_t[3] = w2[3];
629
630     u32 w3_t[4];
631
632     w3_t[0] = w3[0];
633     w3_t[1] = w3[1];
634     w3_t[2] = w3[2];
635     w3_t[3] = w3[3];
636
637     switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, salt_len);
638
639     w0_t[0] |= salt_buf0[0];
640     w0_t[1] |= salt_buf0[1];
641     w0_t[2] |= salt_buf0[2];
642     w0_t[3] |= salt_buf0[3];
643     w1_t[0] |= salt_buf1[0];
644     w1_t[1] |= salt_buf1[1];
645     w1_t[2] |= salt_buf1[2];
646     w1_t[3] |= salt_buf1[3];
647
648     u32 dst[16];
649
650     dst[ 0] = w0_t[0];
651     dst[ 1] = w0_t[1];
652     dst[ 2] = w0_t[2];
653     dst[ 3] = w0_t[3];
654     dst[ 4] = w1_t[0];
655     dst[ 5] = w1_t[1];
656     dst[ 6] = w1_t[2];
657     dst[ 7] = w1_t[3];
658     dst[ 8] = w2_t[0];
659     dst[ 9] = w2_t[1];
660     dst[10] = w2_t[2];
661     dst[11] = w2_t[3];
662     dst[12] = 0;
663     dst[13] = 0;
664     dst[14] = 0;
665     dst[15] = 0;
666
667     /**
668      * precompute key1 since key is static: 0x0123456789abcdef
669      * plus LEFT_ROTATE by 2
670      */
671
672     u32 Kc[16];
673
674     Kc[ 0] = 0x64649040;
675     Kc[ 1] = 0x14909858;
676     Kc[ 2] = 0xc4b44888;
677     Kc[ 3] = 0x9094e438;
678     Kc[ 4] = 0xd8a004f0;
679     Kc[ 5] = 0xa8f02810;
680     Kc[ 6] = 0xc84048d8;
681     Kc[ 7] = 0x68d804a8;
682     Kc[ 8] = 0x0490e40c;
683     Kc[ 9] = 0xac183024;
684     Kc[10] = 0x24c07c10;
685     Kc[11] = 0x8c88c038;
686     Kc[12] = 0xc048c824;
687     Kc[13] = 0x4c0470a8;
688     Kc[14] = 0x584020b4;
689     Kc[15] = 0x00742c4c;
690
691     u32 Kd[16];
692
693     Kd[ 0] = 0xa42ce40c;
694     Kd[ 1] = 0x64689858;
695     Kd[ 2] = 0x484050b8;
696     Kd[ 3] = 0xe8184814;
697     Kd[ 4] = 0x405cc070;
698     Kd[ 5] = 0xa010784c;
699     Kd[ 6] = 0x6074a800;
700     Kd[ 7] = 0x80701c1c;
701     Kd[ 8] = 0x9cd49430;
702     Kd[ 9] = 0x4c8ce078;
703     Kd[10] = 0x5c18c088;
704     Kd[11] = 0x28a8a4c8;
705     Kd[12] = 0x3c180838;
706     Kd[13] = 0xb0b86c20;
707     Kd[14] = 0xac84a094;
708     Kd[15] = 0x4ce0c0c4;
709
710     /**
711      * key1 (generate key)
712      */
713
714     u32 iv[2];
715
716     iv[0] = 0;
717     iv[1] = 0;
718
719     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
720     {
721       u32 data[2];
722
723       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
724       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
725
726       data[0] ^= iv[0];
727       data[1] ^= iv[1];
728
729       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
730     }
731
732     /**
733      * key2 (generate hash)
734      */
735
736     _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb);
737
738     iv[0] = 0;
739     iv[1] = 0;
740
741     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
742     {
743       u32 data[2];
744
745       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
746       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
747
748       data[0] ^= iv[0];
749       data[1] ^= iv[1];
750
751       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
752     }
753
754     /**
755      * cmp
756      */
757
758     const u32 r0 = iv[0];
759     const u32 r1 = iv[1];
760     const u32 r2 = 0;
761     const u32 r3 = 0;
762
763     #include COMPARE_M
764   }
765 }
766
767 __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)
768 {
769 }
770
771 __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)
772 {
773 }
774
775 __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)
776 {
777   /**
778    * modifier
779    */
780
781   const u32 gid = get_global_id (0);
782   const u32 lid = get_local_id (0);
783   const u32 lsz = get_local_size (0);
784
785   /**
786    * sbox, kbox
787    */
788
789   __local u32 s_SPtrans[8][64];
790   __local u32 s_skb[8][64];
791
792   for (u32 i = lid; i < 64; i += lsz)
793   {
794     s_SPtrans[0][i] = c_SPtrans[0][i];
795     s_SPtrans[1][i] = c_SPtrans[1][i];
796     s_SPtrans[2][i] = c_SPtrans[2][i];
797     s_SPtrans[3][i] = c_SPtrans[3][i];
798     s_SPtrans[4][i] = c_SPtrans[4][i];
799     s_SPtrans[5][i] = c_SPtrans[5][i];
800     s_SPtrans[6][i] = c_SPtrans[6][i];
801     s_SPtrans[7][i] = c_SPtrans[7][i];
802
803     s_skb[0][i] = c_skb[0][i];
804     s_skb[1][i] = c_skb[1][i];
805     s_skb[2][i] = c_skb[2][i];
806     s_skb[3][i] = c_skb[3][i];
807     s_skb[4][i] = c_skb[4][i];
808     s_skb[5][i] = c_skb[5][i];
809     s_skb[6][i] = c_skb[6][i];
810     s_skb[7][i] = c_skb[7][i];
811   }
812
813   barrier (CLK_LOCAL_MEM_FENCE);
814
815   if (gid >= gid_max) return;
816
817   /**
818    * base
819    */
820
821   u32 pw_buf0[4];
822
823   pw_buf0[0] = pws[gid].i[ 0];
824   pw_buf0[1] = pws[gid].i[ 1];
825   pw_buf0[2] = pws[gid].i[ 2];
826   pw_buf0[3] = pws[gid].i[ 3];
827
828   u32 pw_buf1[4];
829
830   pw_buf1[0] = pws[gid].i[ 4];
831   pw_buf1[1] = pws[gid].i[ 5];
832   pw_buf1[2] = pws[gid].i[ 6];
833   pw_buf1[3] = pws[gid].i[ 7];
834
835   const u32 pw_len = pws[gid].pw_len;
836
837   /**
838    * salt
839    */
840
841   u32 salt_buf0[4];
842
843   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
844   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
845   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
846   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
847
848   u32 salt_buf1[4];
849
850   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
851   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
852   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
853   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
854
855   const u32 salt_len = salt_bufs[salt_pos].salt_len;
856
857   /**
858    * digest
859    */
860
861   const u32 search[4] =
862   {
863     digests_buf[digests_offset].digest_buf[DGST_R0],
864     digests_buf[digests_offset].digest_buf[DGST_R1],
865     digests_buf[digests_offset].digest_buf[DGST_R2],
866     digests_buf[digests_offset].digest_buf[DGST_R3]
867   };
868
869   /**
870    * loop
871    */
872
873   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
874   {
875     u32 w0[4];
876
877     w0[0] = pw_buf0[0];
878     w0[1] = pw_buf0[1];
879     w0[2] = pw_buf0[2];
880     w0[3] = pw_buf0[3];
881
882     u32 w1[4];
883
884     w1[0] = pw_buf1[0];
885     w1[1] = pw_buf1[1];
886     w1[2] = pw_buf1[2];
887     w1[3] = pw_buf1[3];
888
889     u32 w2[4];
890
891     w2[0] = 0;
892     w2[1] = 0;
893     w2[2] = 0;
894     w2[3] = 0;
895
896     u32 w3[4];
897
898     w3[0] = 0;
899     w3[1] = 0;
900     w3[2] = 0;
901     w3[3] = 0;
902
903     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
904
905     const u32 salt_word_len = (salt_len + out_len) * 2;
906
907     /**
908      * prepend salt
909      */
910
911     u32 w0_t[4];
912
913     w0_t[0] = w0[0];
914     w0_t[1] = w0[1];
915     w0_t[2] = w0[2];
916     w0_t[3] = w0[3];
917
918     u32 w1_t[4];
919
920     w1_t[0] = w1[0];
921     w1_t[1] = w1[1];
922     w1_t[2] = w1[2];
923     w1_t[3] = w1[3];
924
925     u32 w2_t[4];
926
927     w2_t[0] = w2[0];
928     w2_t[1] = w2[1];
929     w2_t[2] = w2[2];
930     w2_t[3] = w2[3];
931
932     u32 w3_t[4];
933
934     w3_t[0] = w3[0];
935     w3_t[1] = w3[1];
936     w3_t[2] = w3[2];
937     w3_t[3] = w3[3];
938
939     switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, salt_len);
940
941     w0_t[0] |= salt_buf0[0];
942     w0_t[1] |= salt_buf0[1];
943     w0_t[2] |= salt_buf0[2];
944     w0_t[3] |= salt_buf0[3];
945     w1_t[0] |= salt_buf1[0];
946     w1_t[1] |= salt_buf1[1];
947     w1_t[2] |= salt_buf1[2];
948     w1_t[3] |= salt_buf1[3];
949
950     u32 dst[16];
951
952     dst[ 0] = w0_t[0];
953     dst[ 1] = w0_t[1];
954     dst[ 2] = w0_t[2];
955     dst[ 3] = w0_t[3];
956     dst[ 4] = w1_t[0];
957     dst[ 5] = w1_t[1];
958     dst[ 6] = w1_t[2];
959     dst[ 7] = w1_t[3];
960     dst[ 8] = w2_t[0];
961     dst[ 9] = w2_t[1];
962     dst[10] = w2_t[2];
963     dst[11] = w2_t[3];
964     dst[12] = 0;
965     dst[13] = 0;
966     dst[14] = 0;
967     dst[15] = 0;
968
969     /**
970      * precompute key1 since key is static: 0x0123456789abcdef
971      * plus LEFT_ROTATE by 2
972      */
973
974     u32 Kc[16];
975
976     Kc[ 0] = 0x64649040;
977     Kc[ 1] = 0x14909858;
978     Kc[ 2] = 0xc4b44888;
979     Kc[ 3] = 0x9094e438;
980     Kc[ 4] = 0xd8a004f0;
981     Kc[ 5] = 0xa8f02810;
982     Kc[ 6] = 0xc84048d8;
983     Kc[ 7] = 0x68d804a8;
984     Kc[ 8] = 0x0490e40c;
985     Kc[ 9] = 0xac183024;
986     Kc[10] = 0x24c07c10;
987     Kc[11] = 0x8c88c038;
988     Kc[12] = 0xc048c824;
989     Kc[13] = 0x4c0470a8;
990     Kc[14] = 0x584020b4;
991     Kc[15] = 0x00742c4c;
992
993     u32 Kd[16];
994
995     Kd[ 0] = 0xa42ce40c;
996     Kd[ 1] = 0x64689858;
997     Kd[ 2] = 0x484050b8;
998     Kd[ 3] = 0xe8184814;
999     Kd[ 4] = 0x405cc070;
1000     Kd[ 5] = 0xa010784c;
1001     Kd[ 6] = 0x6074a800;
1002     Kd[ 7] = 0x80701c1c;
1003     Kd[ 8] = 0x9cd49430;
1004     Kd[ 9] = 0x4c8ce078;
1005     Kd[10] = 0x5c18c088;
1006     Kd[11] = 0x28a8a4c8;
1007     Kd[12] = 0x3c180838;
1008     Kd[13] = 0xb0b86c20;
1009     Kd[14] = 0xac84a094;
1010     Kd[15] = 0x4ce0c0c4;
1011
1012     /**
1013      * key1 (generate key)
1014      */
1015
1016     u32 iv[2];
1017
1018     iv[0] = 0;
1019     iv[1] = 0;
1020
1021     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
1022     {
1023       u32 data[2];
1024
1025       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
1026       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
1027
1028       data[0] ^= iv[0];
1029       data[1] ^= iv[1];
1030
1031       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
1032     }
1033
1034     /**
1035      * key2 (generate hash)
1036      */
1037
1038     _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb);
1039
1040     iv[0] = 0;
1041     iv[1] = 0;
1042
1043     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
1044     {
1045       u32 data[2];
1046
1047       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
1048       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
1049
1050       data[0] ^= iv[0];
1051       data[1] ^= iv[1];
1052
1053       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
1054     }
1055
1056     /**
1057      * cmp
1058      */
1059
1060     const u32 r0 = iv[0];
1061     const u32 r1 = iv[1];
1062     const u32 r2 = 0;
1063     const u32 r3 = 0;
1064
1065     #include COMPARE_S
1066   }
1067 }
1068
1069 __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)
1070 {
1071 }
1072
1073 __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)
1074 {
1075 }