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