6b9a4cdca27fa37c80232b91479c4543aed1b2ff
[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 "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 static 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 static 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 static 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_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)
495 {
496   /**
497    * modifier
498    */
499
500   const u32 gid = get_global_id (0);
501   const u32 lid = get_local_id (0);
502
503   /**
504    * salt
505    */
506
507   u32 salt_buf0[4];
508   u32 salt_buf1[4];
509
510   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
511   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
512   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
513   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
514   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
515   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
516   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
517   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
518
519   const u32 salt_len = salt_bufs[salt_pos].salt_len;
520
521   const u32 salt_word_len = (salt_len + pw_len) * 2;
522
523   /**
524    * prepend salt
525    */
526
527   u32 w0_t[4];
528   u32 w1_t[4];
529   u32 w2_t[4];
530   u32 w3_t[4];
531
532   w0_t[0] = w[ 0];
533   w0_t[1] = w[ 1];
534   w0_t[2] = w[ 2];
535   w0_t[3] = w[ 3];
536   w1_t[0] = w[ 4];
537   w1_t[1] = w[ 5];
538   w1_t[2] = w[ 6];
539   w1_t[3] = w[ 7];
540   w2_t[0] = w[ 8];
541   w2_t[1] = w[ 9];
542   w2_t[2] = w[10];
543   w2_t[3] = w[11];
544   w3_t[0] = w[12];
545   w3_t[1] = w[13];
546   w3_t[2] = w[14];
547   w3_t[3] = w[15];
548
549   switch_buffer_by_offset_le_S (w0_t, w1_t, w2_t, w3_t, salt_len);
550
551   w0_t[0] |= salt_buf0[0];
552   w0_t[1] |= salt_buf0[1];
553   w0_t[2] |= salt_buf0[2];
554   w0_t[3] |= salt_buf0[3];
555   w1_t[0] |= salt_buf1[0];
556   w1_t[1] |= salt_buf1[1];
557   w1_t[2] |= salt_buf1[2];
558   w1_t[3] |= salt_buf1[3];
559
560   u32x dst[16];
561
562   dst[ 0] = w0_t[0];
563   dst[ 1] = w0_t[1];
564   dst[ 2] = w0_t[2];
565   dst[ 3] = w0_t[3];
566   dst[ 4] = w1_t[0];
567   dst[ 5] = w1_t[1];
568   dst[ 6] = w1_t[2];
569   dst[ 7] = w1_t[3];
570   dst[ 8] = w2_t[0];
571   dst[ 9] = w2_t[1];
572   dst[10] = w2_t[2];
573   dst[11] = w2_t[3];
574   dst[12] = w3_t[0];
575   dst[13] = w3_t[1];
576   dst[14] = w3_t[2];
577   dst[15] = w3_t[3];
578
579   /**
580    * loop
581    */
582
583   u32 w0l = w[0];
584
585   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
586   {
587     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
588
589     const u32x w0 = w0l | w0r;
590
591     overwrite_at_le (dst, w0, salt_len);
592
593     /**
594      * precompute key1 since key is static: 0x0123456789abcdef
595      * plus LEFT_ROTATE by 2
596      */
597
598     u32x Kc[16];
599
600     Kc[ 0] = 0x64649040;
601     Kc[ 1] = 0x14909858;
602     Kc[ 2] = 0xc4b44888;
603     Kc[ 3] = 0x9094e438;
604     Kc[ 4] = 0xd8a004f0;
605     Kc[ 5] = 0xa8f02810;
606     Kc[ 6] = 0xc84048d8;
607     Kc[ 7] = 0x68d804a8;
608     Kc[ 8] = 0x0490e40c;
609     Kc[ 9] = 0xac183024;
610     Kc[10] = 0x24c07c10;
611     Kc[11] = 0x8c88c038;
612     Kc[12] = 0xc048c824;
613     Kc[13] = 0x4c0470a8;
614     Kc[14] = 0x584020b4;
615     Kc[15] = 0x00742c4c;
616
617     u32x Kd[16];
618
619     Kd[ 0] = 0xa42ce40c;
620     Kd[ 1] = 0x64689858;
621     Kd[ 2] = 0x484050b8;
622     Kd[ 3] = 0xe8184814;
623     Kd[ 4] = 0x405cc070;
624     Kd[ 5] = 0xa010784c;
625     Kd[ 6] = 0x6074a800;
626     Kd[ 7] = 0x80701c1c;
627     Kd[ 8] = 0x9cd49430;
628     Kd[ 9] = 0x4c8ce078;
629     Kd[10] = 0x5c18c088;
630     Kd[11] = 0x28a8a4c8;
631     Kd[12] = 0x3c180838;
632     Kd[13] = 0xb0b86c20;
633     Kd[14] = 0xac84a094;
634     Kd[15] = 0x4ce0c0c4;
635
636     /**
637      * key1 (generate key)
638      */
639
640     u32x iv[2];
641
642     iv[0] = 0;
643     iv[1] = 0;
644
645     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
646     {
647       u32x data[2];
648
649       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
650       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
651
652       data[0] ^= iv[0];
653       data[1] ^= iv[1];
654
655       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
656     }
657
658     /**
659      * key2 (generate hash)
660      */
661
662     _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb);
663
664     iv[0] = 0;
665     iv[1] = 0;
666
667     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
668     {
669       u32x data[2];
670
671       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
672       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
673
674       data[0] ^= iv[0];
675       data[1] ^= iv[1];
676
677       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
678     }
679
680     /**
681      * cmp
682      */
683
684     const u32x r0 = iv[0];
685     const u32x r1 = iv[1];
686     const u32x r2 = 0;
687     const u32x r3 = 0;
688
689     COMPARE_M_SIMD (r0, r1, r2, r3);
690   }
691 }
692
693 static 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_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)
694 {
695   /**
696    * modifier
697    */
698
699   const u32 gid = get_global_id (0);
700   const u32 lid = get_local_id (0);
701
702   /**
703    * salt
704    */
705
706   u32 salt_buf0[4];
707   u32 salt_buf1[4];
708
709   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
710   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
711   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
712   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
713   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
714   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
715   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
716   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
717
718   const u32 salt_len = salt_bufs[salt_pos].salt_len;
719
720   const u32 salt_word_len = (salt_len + pw_len) * 2;
721
722   /**
723    * prepend salt
724    */
725
726   u32 w0_t[4];
727   u32 w1_t[4];
728   u32 w2_t[4];
729   u32 w3_t[4];
730
731   w0_t[0] = w[ 0];
732   w0_t[1] = w[ 1];
733   w0_t[2] = w[ 2];
734   w0_t[3] = w[ 3];
735   w1_t[0] = w[ 4];
736   w1_t[1] = w[ 5];
737   w1_t[2] = w[ 6];
738   w1_t[3] = w[ 7];
739   w2_t[0] = w[ 8];
740   w2_t[1] = w[ 9];
741   w2_t[2] = w[10];
742   w2_t[3] = w[11];
743   w3_t[0] = w[12];
744   w3_t[1] = w[13];
745   w3_t[2] = w[14];
746   w3_t[3] = w[15];
747
748   switch_buffer_by_offset_le_S (w0_t, w1_t, w2_t, w3_t, salt_len);
749
750   w0_t[0] |= salt_buf0[0];
751   w0_t[1] |= salt_buf0[1];
752   w0_t[2] |= salt_buf0[2];
753   w0_t[3] |= salt_buf0[3];
754   w1_t[0] |= salt_buf1[0];
755   w1_t[1] |= salt_buf1[1];
756   w1_t[2] |= salt_buf1[2];
757   w1_t[3] |= salt_buf1[3];
758
759   u32x dst[16];
760
761   dst[ 0] = w0_t[0];
762   dst[ 1] = w0_t[1];
763   dst[ 2] = w0_t[2];
764   dst[ 3] = w0_t[3];
765   dst[ 4] = w1_t[0];
766   dst[ 5] = w1_t[1];
767   dst[ 6] = w1_t[2];
768   dst[ 7] = w1_t[3];
769   dst[ 8] = w2_t[0];
770   dst[ 9] = w2_t[1];
771   dst[10] = w2_t[2];
772   dst[11] = w2_t[3];
773   dst[12] = w3_t[0];
774   dst[13] = w3_t[1];
775   dst[14] = w3_t[2];
776   dst[15] = w3_t[3];
777
778   /**
779    * digest
780    */
781
782   const u32 search[4] =
783   {
784     digests_buf[digests_offset].digest_buf[DGST_R0],
785     digests_buf[digests_offset].digest_buf[DGST_R1],
786     digests_buf[digests_offset].digest_buf[DGST_R2],
787     digests_buf[digests_offset].digest_buf[DGST_R3]
788   };
789
790   /**
791    * loop
792    */
793
794   u32 w0l = w[0];
795
796   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
797   {
798     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
799
800     const u32x w0 = w0l | w0r;
801
802     overwrite_at_le (dst, w0, salt_len);
803
804     /**
805      * precompute key1 since key is static: 0x0123456789abcdef
806      * plus LEFT_ROTATE by 2
807      */
808
809     u32x Kc[16];
810
811     Kc[ 0] = 0x64649040;
812     Kc[ 1] = 0x14909858;
813     Kc[ 2] = 0xc4b44888;
814     Kc[ 3] = 0x9094e438;
815     Kc[ 4] = 0xd8a004f0;
816     Kc[ 5] = 0xa8f02810;
817     Kc[ 6] = 0xc84048d8;
818     Kc[ 7] = 0x68d804a8;
819     Kc[ 8] = 0x0490e40c;
820     Kc[ 9] = 0xac183024;
821     Kc[10] = 0x24c07c10;
822     Kc[11] = 0x8c88c038;
823     Kc[12] = 0xc048c824;
824     Kc[13] = 0x4c0470a8;
825     Kc[14] = 0x584020b4;
826     Kc[15] = 0x00742c4c;
827
828     u32x Kd[16];
829
830     Kd[ 0] = 0xa42ce40c;
831     Kd[ 1] = 0x64689858;
832     Kd[ 2] = 0x484050b8;
833     Kd[ 3] = 0xe8184814;
834     Kd[ 4] = 0x405cc070;
835     Kd[ 5] = 0xa010784c;
836     Kd[ 6] = 0x6074a800;
837     Kd[ 7] = 0x80701c1c;
838     Kd[ 8] = 0x9cd49430;
839     Kd[ 9] = 0x4c8ce078;
840     Kd[10] = 0x5c18c088;
841     Kd[11] = 0x28a8a4c8;
842     Kd[12] = 0x3c180838;
843     Kd[13] = 0xb0b86c20;
844     Kd[14] = 0xac84a094;
845     Kd[15] = 0x4ce0c0c4;
846
847     /**
848      * key1 (generate key)
849      */
850
851     u32x iv[2];
852
853     iv[0] = 0;
854     iv[1] = 0;
855
856     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
857     {
858       u32x data[2];
859
860       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
861       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
862
863       data[0] ^= iv[0];
864       data[1] ^= iv[1];
865
866       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
867     }
868
869     /**
870      * key2 (generate hash)
871      */
872
873     _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb);
874
875     iv[0] = 0;
876     iv[1] = 0;
877
878     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
879     {
880       u32x data[2];
881
882       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
883       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
884
885       data[0] ^= iv[0];
886       data[1] ^= iv[1];
887
888       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
889     }
890
891     /**
892      * cmp
893      */
894
895     const u32x r0 = iv[0];
896     const u32x r1 = iv[1];
897     const u32x r2 = 0;
898     const u32x r3 = 0;
899
900     COMPARE_S_SIMD (r0, r1, r2, r3);
901   }
902 }
903
904 __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_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)
905 {
906   /**
907    * modifier
908    */
909
910   const u32 gid = get_global_id (0);
911   const u32 lid = get_local_id (0);
912   const u32 lsz = get_local_size (0);
913
914   /**
915    * base
916    */
917
918   u32 w[16];
919
920   w[ 0] = pws[gid].i[ 0];
921   w[ 1] = pws[gid].i[ 1];
922   w[ 2] = pws[gid].i[ 2];
923   w[ 3] = pws[gid].i[ 3];
924   w[ 4] = 0;
925   w[ 5] = 0;
926   w[ 6] = 0;
927   w[ 7] = 0;
928   w[ 8] = 0;
929   w[ 9] = 0;
930   w[10] = 0;
931   w[11] = 0;
932   w[12] = 0;
933   w[13] = 0;
934   w[14] = 0;
935   w[15] = 0;
936
937   const u32 pw_len = pws[gid].pw_len;
938
939   /**
940    * sbox, kbox
941    */
942
943   __local u32 s_SPtrans[8][64];
944   __local u32 s_skb[8][64];
945
946   for (u32 i = lid; i < 64; i += lsz)
947   {
948     s_SPtrans[0][i] = c_SPtrans[0][i];
949     s_SPtrans[1][i] = c_SPtrans[1][i];
950     s_SPtrans[2][i] = c_SPtrans[2][i];
951     s_SPtrans[3][i] = c_SPtrans[3][i];
952     s_SPtrans[4][i] = c_SPtrans[4][i];
953     s_SPtrans[5][i] = c_SPtrans[5][i];
954     s_SPtrans[6][i] = c_SPtrans[6][i];
955     s_SPtrans[7][i] = c_SPtrans[7][i];
956
957     s_skb[0][i] = c_skb[0][i];
958     s_skb[1][i] = c_skb[1][i];
959     s_skb[2][i] = c_skb[2][i];
960     s_skb[3][i] = c_skb[3][i];
961     s_skb[4][i] = c_skb[4][i];
962     s_skb[5][i] = c_skb[5][i];
963     s_skb[6][i] = c_skb[6][i];
964     s_skb[7][i] = c_skb[7][i];
965   }
966
967   barrier (CLK_LOCAL_MEM_FENCE);
968
969   if (gid >= gid_max) return;
970
971   /**
972    * main
973    */
974
975   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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
976 }
977
978 __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_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)
979 {
980   /**
981    * modifier
982    */
983
984   const u32 gid = get_global_id (0);
985   const u32 lid = get_local_id (0);
986   const u32 lsz = get_local_size (0);
987
988   /**
989    * base
990    */
991
992   u32 w[16];
993
994   w[ 0] = pws[gid].i[ 0];
995   w[ 1] = pws[gid].i[ 1];
996   w[ 2] = pws[gid].i[ 2];
997   w[ 3] = pws[gid].i[ 3];
998   w[ 4] = pws[gid].i[ 4];
999   w[ 5] = pws[gid].i[ 5];
1000   w[ 6] = pws[gid].i[ 6];
1001   w[ 7] = pws[gid].i[ 7];
1002   w[ 8] = 0;
1003   w[ 9] = 0;
1004   w[10] = 0;
1005   w[11] = 0;
1006   w[12] = 0;
1007   w[13] = 0;
1008   w[14] = 0;
1009   w[15] = 0;
1010
1011   const u32 pw_len = pws[gid].pw_len;
1012
1013   /**
1014    * sbox, kbox
1015    */
1016
1017   __local u32 s_SPtrans[8][64];
1018   __local u32 s_skb[8][64];
1019
1020   for (u32 i = lid; i < 64; i += lsz)
1021   {
1022     s_SPtrans[0][i] = c_SPtrans[0][i];
1023     s_SPtrans[1][i] = c_SPtrans[1][i];
1024     s_SPtrans[2][i] = c_SPtrans[2][i];
1025     s_SPtrans[3][i] = c_SPtrans[3][i];
1026     s_SPtrans[4][i] = c_SPtrans[4][i];
1027     s_SPtrans[5][i] = c_SPtrans[5][i];
1028     s_SPtrans[6][i] = c_SPtrans[6][i];
1029     s_SPtrans[7][i] = c_SPtrans[7][i];
1030
1031     s_skb[0][i] = c_skb[0][i];
1032     s_skb[1][i] = c_skb[1][i];
1033     s_skb[2][i] = c_skb[2][i];
1034     s_skb[3][i] = c_skb[3][i];
1035     s_skb[4][i] = c_skb[4][i];
1036     s_skb[5][i] = c_skb[5][i];
1037     s_skb[6][i] = c_skb[6][i];
1038     s_skb[7][i] = c_skb[7][i];
1039   }
1040
1041   barrier (CLK_LOCAL_MEM_FENCE);
1042
1043   if (gid >= gid_max) return;
1044
1045   /**
1046    * main
1047    */
1048
1049   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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1050 }
1051
1052 __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_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)
1053 {
1054 }
1055
1056 __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_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)
1057 {
1058   /**
1059    * modifier
1060    */
1061
1062   const u32 gid = get_global_id (0);
1063   const u32 lid = get_local_id (0);
1064   const u32 lsz = get_local_size (0);
1065
1066   /**
1067    * base
1068    */
1069
1070   u32 w[16];
1071
1072   w[ 0] = pws[gid].i[ 0];
1073   w[ 1] = pws[gid].i[ 1];
1074   w[ 2] = pws[gid].i[ 2];
1075   w[ 3] = pws[gid].i[ 3];
1076   w[ 4] = 0;
1077   w[ 5] = 0;
1078   w[ 6] = 0;
1079   w[ 7] = 0;
1080   w[ 8] = 0;
1081   w[ 9] = 0;
1082   w[10] = 0;
1083   w[11] = 0;
1084   w[12] = 0;
1085   w[13] = 0;
1086   w[14] = 0;
1087   w[15] = 0;
1088
1089   const u32 pw_len = pws[gid].pw_len;
1090
1091   /**
1092    * sbox, kbox
1093    */
1094
1095   __local u32 s_SPtrans[8][64];
1096   __local u32 s_skb[8][64];
1097
1098   for (u32 i = lid; i < 64; i += lsz)
1099   {
1100     s_SPtrans[0][i] = c_SPtrans[0][i];
1101     s_SPtrans[1][i] = c_SPtrans[1][i];
1102     s_SPtrans[2][i] = c_SPtrans[2][i];
1103     s_SPtrans[3][i] = c_SPtrans[3][i];
1104     s_SPtrans[4][i] = c_SPtrans[4][i];
1105     s_SPtrans[5][i] = c_SPtrans[5][i];
1106     s_SPtrans[6][i] = c_SPtrans[6][i];
1107     s_SPtrans[7][i] = c_SPtrans[7][i];
1108
1109     s_skb[0][i] = c_skb[0][i];
1110     s_skb[1][i] = c_skb[1][i];
1111     s_skb[2][i] = c_skb[2][i];
1112     s_skb[3][i] = c_skb[3][i];
1113     s_skb[4][i] = c_skb[4][i];
1114     s_skb[5][i] = c_skb[5][i];
1115     s_skb[6][i] = c_skb[6][i];
1116     s_skb[7][i] = c_skb[7][i];
1117   }
1118
1119   barrier (CLK_LOCAL_MEM_FENCE);
1120
1121   if (gid >= gid_max) return;
1122
1123   /**
1124    * main
1125    */
1126
1127   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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1128 }
1129
1130 __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_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)
1131 {
1132   /**
1133    * modifier
1134    */
1135
1136   const u32 gid = get_global_id (0);
1137   const u32 lid = get_local_id (0);
1138   const u32 lsz = get_local_size (0);
1139
1140   /**
1141    * base
1142    */
1143
1144   u32 w[16];
1145
1146   w[ 0] = pws[gid].i[ 0];
1147   w[ 1] = pws[gid].i[ 1];
1148   w[ 2] = pws[gid].i[ 2];
1149   w[ 3] = pws[gid].i[ 3];
1150   w[ 4] = pws[gid].i[ 4];
1151   w[ 5] = pws[gid].i[ 5];
1152   w[ 6] = pws[gid].i[ 6];
1153   w[ 7] = pws[gid].i[ 7];
1154   w[ 8] = 0;
1155   w[ 9] = 0;
1156   w[10] = 0;
1157   w[11] = 0;
1158   w[12] = 0;
1159   w[13] = 0;
1160   w[14] = 0;
1161   w[15] = 0;
1162
1163   const u32 pw_len = pws[gid].pw_len;
1164
1165   /**
1166    * sbox, kbox
1167    */
1168
1169   __local u32 s_SPtrans[8][64];
1170   __local u32 s_skb[8][64];
1171
1172   for (u32 i = lid; i < 64; i += lsz)
1173   {
1174     s_SPtrans[0][i] = c_SPtrans[0][i];
1175     s_SPtrans[1][i] = c_SPtrans[1][i];
1176     s_SPtrans[2][i] = c_SPtrans[2][i];
1177     s_SPtrans[3][i] = c_SPtrans[3][i];
1178     s_SPtrans[4][i] = c_SPtrans[4][i];
1179     s_SPtrans[5][i] = c_SPtrans[5][i];
1180     s_SPtrans[6][i] = c_SPtrans[6][i];
1181     s_SPtrans[7][i] = c_SPtrans[7][i];
1182
1183     s_skb[0][i] = c_skb[0][i];
1184     s_skb[1][i] = c_skb[1][i];
1185     s_skb[2][i] = c_skb[2][i];
1186     s_skb[3][i] = c_skb[3][i];
1187     s_skb[4][i] = c_skb[4][i];
1188     s_skb[5][i] = c_skb[5][i];
1189     s_skb[6][i] = c_skb[6][i];
1190     s_skb[7][i] = c_skb[7][i];
1191   }
1192
1193   barrier (CLK_LOCAL_MEM_FENCE);
1194
1195   if (gid >= gid_max) return;
1196
1197   /**
1198    * main
1199    */
1200
1201   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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1202 }
1203
1204 __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_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)
1205 {
1206 }