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