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