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