Started optimizing some of the OpenCL kernel for latest AMD Catalyst 15.12:
[hashcat.git] / OpenCL / m05500_a1.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 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
470 {
471   /**
472    * modifier
473    */
474
475   const u32 lid = get_local_id (0);
476
477   /**
478    * base
479    */
480
481   const u32 gid = get_global_id (0);
482
483   u32 wordl0[4];
484
485   wordl0[0] = pws[gid].i[ 0];
486   wordl0[1] = pws[gid].i[ 1];
487   wordl0[2] = pws[gid].i[ 2];
488   wordl0[3] = pws[gid].i[ 3];
489
490   u32 wordl1[4];
491
492   wordl1[0] = pws[gid].i[ 4];
493   wordl1[1] = pws[gid].i[ 5];
494   wordl1[2] = pws[gid].i[ 6];
495   wordl1[3] = pws[gid].i[ 7];
496
497   u32 wordl2[4];
498
499   wordl2[0] = 0;
500   wordl2[1] = 0;
501   wordl2[2] = 0;
502   wordl2[3] = 0;
503
504   u32 wordl3[4];
505
506   wordl3[0] = 0;
507   wordl3[1] = 0;
508   wordl3[2] = 0;
509   wordl3[3] = 0;
510
511   const u32 pw_l_len = pws[gid].pw_len;
512
513   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
514   {
515     append_0x80_2x4 (wordl0, wordl1, pw_l_len);
516
517     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
518   }
519
520   /**
521    * sbox, kbox
522    */
523
524   __local u32 s_SPtrans[8][64];
525   __local u32 s_skb[8][64];
526
527   s_SPtrans[0][lid] = c_SPtrans[0][lid];
528   s_SPtrans[1][lid] = c_SPtrans[1][lid];
529   s_SPtrans[2][lid] = c_SPtrans[2][lid];
530   s_SPtrans[3][lid] = c_SPtrans[3][lid];
531   s_SPtrans[4][lid] = c_SPtrans[4][lid];
532   s_SPtrans[5][lid] = c_SPtrans[5][lid];
533   s_SPtrans[6][lid] = c_SPtrans[6][lid];
534   s_SPtrans[7][lid] = c_SPtrans[7][lid];
535
536   s_skb[0][lid] = c_skb[0][lid];
537   s_skb[1][lid] = c_skb[1][lid];
538   s_skb[2][lid] = c_skb[2][lid];
539   s_skb[3][lid] = c_skb[3][lid];
540   s_skb[4][lid] = c_skb[4][lid];
541   s_skb[5][lid] = c_skb[5][lid];
542   s_skb[6][lid] = c_skb[6][lid];
543   s_skb[7][lid] = c_skb[7][lid];
544
545   barrier (CLK_LOCAL_MEM_FENCE);
546
547   if (gid >= gid_max) return;
548
549   /**
550    * salt
551    */
552
553   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
554   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
555   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
556
557   u32 data[2];
558
559   data[0] = s0;
560   data[1] = s1;
561
562   /**
563    * loop
564    */
565
566   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
567   {
568     const u32 pw_r_len = combs_buf[il_pos].pw_len;
569
570     const u32 pw_len = pw_l_len + pw_r_len;
571
572     u32 wordr0[4];
573
574     wordr0[0] = combs_buf[il_pos].i[0];
575     wordr0[1] = combs_buf[il_pos].i[1];
576     wordr0[2] = combs_buf[il_pos].i[2];
577     wordr0[3] = combs_buf[il_pos].i[3];
578
579     u32 wordr1[4];
580
581     wordr1[0] = combs_buf[il_pos].i[4];
582     wordr1[1] = combs_buf[il_pos].i[5];
583     wordr1[2] = combs_buf[il_pos].i[6];
584     wordr1[3] = combs_buf[il_pos].i[7];
585
586     u32 wordr2[4];
587
588     wordr2[0] = 0;
589     wordr2[1] = 0;
590     wordr2[2] = 0;
591     wordr2[3] = 0;
592
593     u32 wordr3[4];
594
595     wordr3[0] = 0;
596     wordr3[1] = 0;
597     wordr3[2] = 0;
598     wordr3[3] = 0;
599
600     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
601     {
602       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
603     }
604
605     u32 w0[4];
606
607     w0[0] = wordl0[0] | wordr0[0];
608     w0[1] = wordl0[1] | wordr0[1];
609     w0[2] = wordl0[2] | wordr0[2];
610     w0[3] = wordl0[3] | wordr0[3];
611
612     u32 w1[4];
613
614     w1[0] = wordl1[0] | wordr1[0];
615     w1[1] = wordl1[1] | wordr1[1];
616     w1[2] = wordl1[2] | wordr1[2];
617     w1[3] = wordl1[3] | wordr1[3];
618
619     u32 w2[4];
620
621     w2[0] = 0;
622     w2[1] = 0;
623     w2[2] = 0;
624     w2[3] = 0;
625
626     u32 w3[4];
627
628     w3[0] = 0;
629     w3[1] = 0;
630     w3[2] = 0;
631     w3[3] = 0;
632
633     u32 w0_t[4];
634     u32 w1_t[4];
635     u32 w2_t[4];
636     u32 w3_t[4];
637
638     make_unicode (w0, w0_t, w1_t);
639     make_unicode (w1, w2_t, w3_t);
640
641     w3_t[2] = pw_len * 8 * 2;
642
643     u32 a = MD4M_A;
644     u32 b = MD4M_B;
645     u32 c = MD4M_C;
646     u32 d = MD4M_D;
647
648     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
649     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
650     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
651     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
652     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
653     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
654     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
655     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
656     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
657     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
658     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
659     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
660     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
661     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
662     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
663     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
664
665     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
666     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
667     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
668     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
669     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
670     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
671     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
672     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
673     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
674     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
675     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
676     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
677     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
678     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
679     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
680     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
681
682     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
683     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
684     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
685     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
686     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
687     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
688     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
689     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
690     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
691     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
692     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
693     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
694     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
695     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
696
697     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
698
699     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
700     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
701
702     a += MD4M_A;
703     b += MD4M_B;
704     c += MD4M_C;
705     d += MD4M_D;
706
707     /**
708      * DES1
709      */
710
711     u32 key[2];
712
713     transform_netntlmv1_key (a, b, key);
714
715     u32 Kc[16];
716     u32 Kd[16];
717
718     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
719
720     u32 iv1[2];
721
722     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
723
724     /**
725      * DES2
726      */
727
728     const u32 bc = (b >> 24) | (c << 8);
729     const u32 cd = (c >> 24) | (d << 8);
730
731     transform_netntlmv1_key (bc, cd, key);
732
733     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
734
735     u32 iv2[2];
736
737     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
738
739     /**
740      * compare
741      */
742
743     const u32 r0 = iv1[0];
744     const u32 r1 = iv1[1];
745     const u32 r2 = iv2[0];
746     const u32 r3 = iv2[1];
747
748     #include COMPARE_M
749   }
750 }
751
752 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
753 {
754 }
755
756 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
757 {
758 }
759
760 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
761 {
762   /**
763    * modifier
764    */
765
766   const u32 lid = get_local_id (0);
767
768   /**
769    * base
770    */
771
772   const u32 gid = get_global_id (0);
773
774   u32 wordl0[4];
775
776   wordl0[0] = pws[gid].i[ 0];
777   wordl0[1] = pws[gid].i[ 1];
778   wordl0[2] = pws[gid].i[ 2];
779   wordl0[3] = pws[gid].i[ 3];
780
781   u32 wordl1[4];
782
783   wordl1[0] = pws[gid].i[ 4];
784   wordl1[1] = pws[gid].i[ 5];
785   wordl1[2] = pws[gid].i[ 6];
786   wordl1[3] = pws[gid].i[ 7];
787
788   u32 wordl2[4];
789
790   wordl2[0] = 0;
791   wordl2[1] = 0;
792   wordl2[2] = 0;
793   wordl2[3] = 0;
794
795   u32 wordl3[4];
796
797   wordl3[0] = 0;
798   wordl3[1] = 0;
799   wordl3[2] = 0;
800   wordl3[3] = 0;
801
802   const u32 pw_l_len = pws[gid].pw_len;
803
804   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
805   {
806     append_0x80_2x4 (wordl0, wordl1, pw_l_len);
807
808     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
809   }
810
811   /**
812    * sbox, kbox
813    */
814
815   __local u32 s_SPtrans[8][64];
816   __local u32 s_skb[8][64];
817
818   s_SPtrans[0][lid] = c_SPtrans[0][lid];
819   s_SPtrans[1][lid] = c_SPtrans[1][lid];
820   s_SPtrans[2][lid] = c_SPtrans[2][lid];
821   s_SPtrans[3][lid] = c_SPtrans[3][lid];
822   s_SPtrans[4][lid] = c_SPtrans[4][lid];
823   s_SPtrans[5][lid] = c_SPtrans[5][lid];
824   s_SPtrans[6][lid] = c_SPtrans[6][lid];
825   s_SPtrans[7][lid] = c_SPtrans[7][lid];
826
827   s_skb[0][lid] = c_skb[0][lid];
828   s_skb[1][lid] = c_skb[1][lid];
829   s_skb[2][lid] = c_skb[2][lid];
830   s_skb[3][lid] = c_skb[3][lid];
831   s_skb[4][lid] = c_skb[4][lid];
832   s_skb[5][lid] = c_skb[5][lid];
833   s_skb[6][lid] = c_skb[6][lid];
834   s_skb[7][lid] = c_skb[7][lid];
835
836   barrier (CLK_LOCAL_MEM_FENCE);
837
838   if (gid >= gid_max) return;
839
840   /**
841    * salt
842    */
843
844   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
845   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
846   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
847
848   u32 data[2];
849
850   data[0] = s0;
851   data[1] = s1;
852
853   /**
854    * digest
855    */
856
857   const u32 search[4] =
858   {
859     digests_buf[digests_offset].digest_buf[DGST_R0],
860     digests_buf[digests_offset].digest_buf[DGST_R1],
861     digests_buf[digests_offset].digest_buf[DGST_R2],
862     digests_buf[digests_offset].digest_buf[DGST_R3]
863   };
864
865   /**
866    * loop
867    */
868
869   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
870   {
871     const u32 pw_r_len = combs_buf[il_pos].pw_len;
872
873     const u32 pw_len = pw_l_len + pw_r_len;
874
875     u32 wordr0[4];
876
877     wordr0[0] = combs_buf[il_pos].i[0];
878     wordr0[1] = combs_buf[il_pos].i[1];
879     wordr0[2] = combs_buf[il_pos].i[2];
880     wordr0[3] = combs_buf[il_pos].i[3];
881
882     u32 wordr1[4];
883
884     wordr1[0] = combs_buf[il_pos].i[4];
885     wordr1[1] = combs_buf[il_pos].i[5];
886     wordr1[2] = combs_buf[il_pos].i[6];
887     wordr1[3] = combs_buf[il_pos].i[7];
888
889     u32 wordr2[4];
890
891     wordr2[0] = 0;
892     wordr2[1] = 0;
893     wordr2[2] = 0;
894     wordr2[3] = 0;
895
896     u32 wordr3[4];
897
898     wordr3[0] = 0;
899     wordr3[1] = 0;
900     wordr3[2] = 0;
901     wordr3[3] = 0;
902
903     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
904     {
905       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
906     }
907
908     u32 w0[4];
909
910     w0[0] = wordl0[0] | wordr0[0];
911     w0[1] = wordl0[1] | wordr0[1];
912     w0[2] = wordl0[2] | wordr0[2];
913     w0[3] = wordl0[3] | wordr0[3];
914
915     u32 w1[4];
916
917     w1[0] = wordl1[0] | wordr1[0];
918     w1[1] = wordl1[1] | wordr1[1];
919     w1[2] = wordl1[2] | wordr1[2];
920     w1[3] = wordl1[3] | wordr1[3];
921
922     u32 w2[4];
923
924     w2[0] = 0;
925     w2[1] = 0;
926     w2[2] = 0;
927     w2[3] = 0;
928
929     u32 w3[4];
930
931     w3[0] = 0;
932     w3[1] = 0;
933     w3[2] = 0;
934     w3[3] = 0;
935
936     u32 w0_t[4];
937     u32 w1_t[4];
938     u32 w2_t[4];
939     u32 w3_t[4];
940
941     make_unicode (w0, w0_t, w1_t);
942     make_unicode (w1, w2_t, w3_t);
943
944     w3_t[2] = pw_len * 8 * 2;
945
946     u32 a = MD4M_A;
947     u32 b = MD4M_B;
948     u32 c = MD4M_C;
949     u32 d = MD4M_D;
950
951     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
952     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
953     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
954     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
955     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
956     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
957     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
958     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
959     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
960     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
961     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
962     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
963     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
964     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
965     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
966     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
967
968     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
969     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
970     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
971     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
972     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
973     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
974     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
975     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
976     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
977     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
978     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
979     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
980     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
981     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
982     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
983     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
984
985     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
986     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
987     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
988     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
989     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
990     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
991     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
992     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
993     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
994     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
995     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
996     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
997     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
998     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
999
1000     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
1001
1002     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
1003     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
1004
1005     a += MD4M_A;
1006     b += MD4M_B;
1007     c += MD4M_C;
1008     d += MD4M_D;
1009
1010     /**
1011      * DES1
1012      */
1013
1014     u32 key[2];
1015
1016     transform_netntlmv1_key (a, b, key);
1017
1018     u32 Kc[16];
1019     u32 Kd[16];
1020
1021     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1022
1023     u32 iv1[2];
1024
1025     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
1026
1027     /**
1028      * DES2
1029      */
1030
1031     /*
1032     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
1033
1034     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1035
1036     u32 iv2[2];
1037
1038     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
1039     */
1040
1041     u32 iv2[2];
1042
1043     iv2[0] = search[2];
1044     iv2[1] = search[3];
1045
1046     /**
1047      * compare
1048      */
1049
1050     const u32 r0 = iv1[0];
1051     const u32 r1 = iv1[1];
1052     const u32 r2 = iv2[0];
1053     const u32 r3 = iv2[1];
1054
1055     #include COMPARE_S
1056   }
1057 }
1058
1059 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1060 {
1061 }
1062
1063 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1064 {
1065 }