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