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