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