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