fix -m 5500
[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 "types_ocl.c"
18 #include "common.c"
19
20 #define COMPARE_S "check_single_comp4.c"
21 #define COMPARE_M "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 gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
606
607     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
608
609     u32 iv2[2];
610
611     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
612
613     /**
614      * compare
615      */
616
617     const u32 r0 = iv1[0];
618     const u32 r1 = iv1[1];
619     const u32 r2 = iv2[0];
620     const u32 r3 = iv2[1];
621
622     #include COMPARE_M
623   }
624 }
625
626 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 gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
627 {
628   /**
629    * modifier
630    */
631
632   const u32 gid = get_global_id (0);
633   const u32 lid = get_local_id (0);
634
635   /**
636    * salt
637    */
638
639   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
640   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
641   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
642
643   u32 data[2];
644
645   data[0] = s0;
646   data[1] = s1;
647
648   /**
649    * digest
650    */
651
652   const u32 search[4] =
653   {
654     digests_buf[digests_offset].digest_buf[DGST_R0],
655     digests_buf[digests_offset].digest_buf[DGST_R1],
656     digests_buf[digests_offset].digest_buf[DGST_R2],
657     digests_buf[digests_offset].digest_buf[DGST_R3]
658   };
659
660   /**
661    * loop
662    */
663
664   u32 w0l = w[0];
665
666   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
667   {
668     const u32 w0r = words_buf_r[il_pos];
669
670     const u32 w0 = w0l | w0r;
671
672     u32 a = MD4M_A;
673     u32 b = MD4M_B;
674     u32 c = MD4M_C;
675     u32 d = MD4M_D;
676
677     #define w0_t w0
678     #define w1_t w[ 1]
679     #define w2_t w[ 2]
680     #define w3_t w[ 3]
681     #define w4_t w[ 4]
682     #define w5_t w[ 5]
683     #define w6_t w[ 6]
684     #define w7_t w[ 7]
685     #define w8_t w[ 8]
686     #define w9_t w[ 9]
687     #define wa_t w[10]
688     #define wb_t w[11]
689     #define wc_t w[12]
690     #define wd_t w[13]
691     #define we_t w[14]
692     #define wf_t w[15]
693
694     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
695     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
696     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
697     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
698     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
699     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
700     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
701     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
702     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
703     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
704     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
705     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
706     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
707     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
708     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
709     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
710
711     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
712     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
713     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
714     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
715     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
716     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
717     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
718     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
719     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
720     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
721     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
722     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
723     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
724     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
725     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
726     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
727
728     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
729     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
730     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
731     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
732     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
733     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
734     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
735     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
736     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
737     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
738     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
739     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
740     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
741     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
742
743     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
744
745     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
746     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
747
748     a += MD4M_A;
749     b += MD4M_B;
750     c += MD4M_C;
751     d += MD4M_D;
752
753     /**
754      * DES1
755      */
756
757     u32 key[2];
758
759     transform_netntlmv1_key (a, b, key);
760
761     u32 Kc[16];
762     u32 Kd[16];
763
764     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
765
766     u32 iv1[2];
767
768     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
769
770     /**
771      * DES2
772      */
773
774     /*
775     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
776
777     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
778
779     u32 iv2[2];
780
781     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
782     */
783
784     u32 iv2[2];
785
786     iv2[0] = search[2];
787     iv2[1] = search[3];
788
789     /**
790      * compare
791      */
792
793     const u32 r0 = iv1[0];
794     const u32 r1 = iv1[1];
795     const u32 r2 = iv2[0];
796     const u32 r3 = iv2[1];
797
798     #include COMPARE_S
799   }
800 }
801
802 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
803 {
804   /**
805    * base
806    */
807
808   const u32 gid = get_global_id (0);
809   const u32 lid = get_local_id (0);
810
811   u32 w[16];
812
813   w[ 0] = pws[gid].i[ 0];
814   w[ 1] = pws[gid].i[ 1];
815   w[ 2] = pws[gid].i[ 2];
816   w[ 3] = pws[gid].i[ 3];
817   w[ 4] = 0;
818   w[ 5] = 0;
819   w[ 6] = 0;
820   w[ 7] = 0;
821   w[ 8] = 0;
822   w[ 9] = 0;
823   w[10] = 0;
824   w[11] = 0;
825   w[12] = 0;
826   w[13] = 0;
827   w[14] = pws[gid].i[14];
828   w[15] = 0;
829
830   const u32 pw_len = pws[gid].pw_len;
831
832   /**
833    * sbox, kbox
834    */
835
836   __local u32 s_SPtrans[8][64];
837   __local u32 s_skb[8][64];
838
839   s_SPtrans[0][lid] = c_SPtrans[0][lid];
840   s_SPtrans[1][lid] = c_SPtrans[1][lid];
841   s_SPtrans[2][lid] = c_SPtrans[2][lid];
842   s_SPtrans[3][lid] = c_SPtrans[3][lid];
843   s_SPtrans[4][lid] = c_SPtrans[4][lid];
844   s_SPtrans[5][lid] = c_SPtrans[5][lid];
845   s_SPtrans[6][lid] = c_SPtrans[6][lid];
846   s_SPtrans[7][lid] = c_SPtrans[7][lid];
847
848   s_skb[0][lid] = c_skb[0][lid];
849   s_skb[1][lid] = c_skb[1][lid];
850   s_skb[2][lid] = c_skb[2][lid];
851   s_skb[3][lid] = c_skb[3][lid];
852   s_skb[4][lid] = c_skb[4][lid];
853   s_skb[5][lid] = c_skb[5][lid];
854   s_skb[6][lid] = c_skb[6][lid];
855   s_skb[7][lid] = c_skb[7][lid];
856
857   barrier (CLK_LOCAL_MEM_FENCE);
858
859   if (gid >= gid_max) return;
860
861   /**
862    * main
863    */
864
865   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);
866 }
867
868 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
869 {
870   /**
871    * base
872    */
873
874   const u32 gid = get_global_id (0);
875   const u32 lid = get_local_id (0);
876
877   u32 w[16];
878
879   w[ 0] = pws[gid].i[ 0];
880   w[ 1] = pws[gid].i[ 1];
881   w[ 2] = pws[gid].i[ 2];
882   w[ 3] = pws[gid].i[ 3];
883   w[ 4] = pws[gid].i[ 4];
884   w[ 5] = pws[gid].i[ 5];
885   w[ 6] = pws[gid].i[ 6];
886   w[ 7] = pws[gid].i[ 7];
887   w[ 8] = 0;
888   w[ 9] = 0;
889   w[10] = 0;
890   w[11] = 0;
891   w[12] = 0;
892   w[13] = 0;
893   w[14] = pws[gid].i[14];
894   w[15] = 0;
895
896   const u32 pw_len = pws[gid].pw_len;
897
898   /**
899    * sbox, kbox
900    */
901
902   __local u32 s_SPtrans[8][64];
903   __local u32 s_skb[8][64];
904
905   s_SPtrans[0][lid] = c_SPtrans[0][lid];
906   s_SPtrans[1][lid] = c_SPtrans[1][lid];
907   s_SPtrans[2][lid] = c_SPtrans[2][lid];
908   s_SPtrans[3][lid] = c_SPtrans[3][lid];
909   s_SPtrans[4][lid] = c_SPtrans[4][lid];
910   s_SPtrans[5][lid] = c_SPtrans[5][lid];
911   s_SPtrans[6][lid] = c_SPtrans[6][lid];
912   s_SPtrans[7][lid] = c_SPtrans[7][lid];
913
914   s_skb[0][lid] = c_skb[0][lid];
915   s_skb[1][lid] = c_skb[1][lid];
916   s_skb[2][lid] = c_skb[2][lid];
917   s_skb[3][lid] = c_skb[3][lid];
918   s_skb[4][lid] = c_skb[4][lid];
919   s_skb[5][lid] = c_skb[5][lid];
920   s_skb[6][lid] = c_skb[6][lid];
921   s_skb[7][lid] = c_skb[7][lid];
922
923   barrier (CLK_LOCAL_MEM_FENCE);
924
925   if (gid >= gid_max) return;
926
927   /**
928    * main
929    */
930
931   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);
932 }
933
934 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
935 {
936 }
937
938 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
939 {
940   /**
941    * base
942    */
943
944   const u32 gid = get_global_id (0);
945   const u32 lid = get_local_id (0);
946
947   u32 w[16];
948
949   w[ 0] = pws[gid].i[ 0];
950   w[ 1] = pws[gid].i[ 1];
951   w[ 2] = pws[gid].i[ 2];
952   w[ 3] = pws[gid].i[ 3];
953   w[ 4] = 0;
954   w[ 5] = 0;
955   w[ 6] = 0;
956   w[ 7] = 0;
957   w[ 8] = 0;
958   w[ 9] = 0;
959   w[10] = 0;
960   w[11] = 0;
961   w[12] = 0;
962   w[13] = 0;
963   w[14] = pws[gid].i[14];
964   w[15] = 0;
965
966   const u32 pw_len = pws[gid].pw_len;
967
968   /**
969    * sbox, kbox
970    */
971
972   __local u32 s_SPtrans[8][64];
973   __local u32 s_skb[8][64];
974
975   s_SPtrans[0][lid] = c_SPtrans[0][lid];
976   s_SPtrans[1][lid] = c_SPtrans[1][lid];
977   s_SPtrans[2][lid] = c_SPtrans[2][lid];
978   s_SPtrans[3][lid] = c_SPtrans[3][lid];
979   s_SPtrans[4][lid] = c_SPtrans[4][lid];
980   s_SPtrans[5][lid] = c_SPtrans[5][lid];
981   s_SPtrans[6][lid] = c_SPtrans[6][lid];
982   s_SPtrans[7][lid] = c_SPtrans[7][lid];
983
984   s_skb[0][lid] = c_skb[0][lid];
985   s_skb[1][lid] = c_skb[1][lid];
986   s_skb[2][lid] = c_skb[2][lid];
987   s_skb[3][lid] = c_skb[3][lid];
988   s_skb[4][lid] = c_skb[4][lid];
989   s_skb[5][lid] = c_skb[5][lid];
990   s_skb[6][lid] = c_skb[6][lid];
991   s_skb[7][lid] = c_skb[7][lid];
992
993   barrier (CLK_LOCAL_MEM_FENCE);
994
995   if (gid >= gid_max) return;
996
997   /**
998    * main
999    */
1000
1001   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);
1002 }
1003
1004 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
1005 {
1006   /**
1007    * base
1008    */
1009
1010   const u32 gid = get_global_id (0);
1011   const u32 lid = get_local_id (0);
1012
1013   u32 w[16];
1014
1015   w[ 0] = pws[gid].i[ 0];
1016   w[ 1] = pws[gid].i[ 1];
1017   w[ 2] = pws[gid].i[ 2];
1018   w[ 3] = pws[gid].i[ 3];
1019   w[ 4] = pws[gid].i[ 4];
1020   w[ 5] = pws[gid].i[ 5];
1021   w[ 6] = pws[gid].i[ 6];
1022   w[ 7] = pws[gid].i[ 7];
1023   w[ 8] = 0;
1024   w[ 9] = 0;
1025   w[10] = 0;
1026   w[11] = 0;
1027   w[12] = 0;
1028   w[13] = 0;
1029   w[14] = pws[gid].i[14];
1030   w[15] = 0;
1031
1032   const u32 pw_len = pws[gid].pw_len;
1033
1034   /**
1035    * sbox, kbox
1036    */
1037
1038   __local u32 s_SPtrans[8][64];
1039   __local u32 s_skb[8][64];
1040
1041   s_SPtrans[0][lid] = c_SPtrans[0][lid];
1042   s_SPtrans[1][lid] = c_SPtrans[1][lid];
1043   s_SPtrans[2][lid] = c_SPtrans[2][lid];
1044   s_SPtrans[3][lid] = c_SPtrans[3][lid];
1045   s_SPtrans[4][lid] = c_SPtrans[4][lid];
1046   s_SPtrans[5][lid] = c_SPtrans[5][lid];
1047   s_SPtrans[6][lid] = c_SPtrans[6][lid];
1048   s_SPtrans[7][lid] = c_SPtrans[7][lid];
1049
1050   s_skb[0][lid] = c_skb[0][lid];
1051   s_skb[1][lid] = c_skb[1][lid];
1052   s_skb[2][lid] = c_skb[2][lid];
1053   s_skb[3][lid] = c_skb[3][lid];
1054   s_skb[4][lid] = c_skb[4][lid];
1055   s_skb[5][lid] = c_skb[5][lid];
1056   s_skb[6][lid] = c_skb[6][lid];
1057   s_skb[7][lid] = c_skb[7][lid];
1058
1059   barrier (CLK_LOCAL_MEM_FENCE);
1060
1061   if (gid >= gid_max) return;
1062
1063   /**
1064    * main
1065    */
1066
1067   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);
1068 }
1069
1070 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global 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)
1071 {
1072 }