Revert "Workaround buggy NV OpenCL runtime"
[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 "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 __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 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     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
729
730     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
731
732     u32 iv2[2];
733
734     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
735
736     /**
737      * compare
738      */
739
740     const u32 r0 = iv1[0];
741     const u32 r1 = iv1[1];
742     const u32 r2 = iv2[0];
743     const u32 r3 = iv2[1];
744
745     #include COMPARE_M
746   }
747 }
748
749 __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 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)
750 {
751 }
752
753 __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 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)
754 {
755 }
756
757 __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 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)
758 {
759   /**
760    * modifier
761    */
762
763   const u32 lid = get_local_id (0);
764
765   /**
766    * base
767    */
768
769   const u32 gid = get_global_id (0);
770
771   u32 wordl0[4];
772
773   wordl0[0] = pws[gid].i[ 0];
774   wordl0[1] = pws[gid].i[ 1];
775   wordl0[2] = pws[gid].i[ 2];
776   wordl0[3] = pws[gid].i[ 3];
777
778   u32 wordl1[4];
779
780   wordl1[0] = pws[gid].i[ 4];
781   wordl1[1] = pws[gid].i[ 5];
782   wordl1[2] = pws[gid].i[ 6];
783   wordl1[3] = pws[gid].i[ 7];
784
785   u32 wordl2[4];
786
787   wordl2[0] = 0;
788   wordl2[1] = 0;
789   wordl2[2] = 0;
790   wordl2[3] = 0;
791
792   u32 wordl3[4];
793
794   wordl3[0] = 0;
795   wordl3[1] = 0;
796   wordl3[2] = 0;
797   wordl3[3] = 0;
798
799   const u32 pw_l_len = pws[gid].pw_len;
800
801   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
802   {
803     append_0x80_2x4 (wordl0, wordl1, pw_l_len);
804
805     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
806   }
807
808   /**
809    * sbox, kbox
810    */
811
812   __local u32 s_SPtrans[8][64];
813   __local u32 s_skb[8][64];
814
815   s_SPtrans[0][lid] = c_SPtrans[0][lid];
816   s_SPtrans[1][lid] = c_SPtrans[1][lid];
817   s_SPtrans[2][lid] = c_SPtrans[2][lid];
818   s_SPtrans[3][lid] = c_SPtrans[3][lid];
819   s_SPtrans[4][lid] = c_SPtrans[4][lid];
820   s_SPtrans[5][lid] = c_SPtrans[5][lid];
821   s_SPtrans[6][lid] = c_SPtrans[6][lid];
822   s_SPtrans[7][lid] = c_SPtrans[7][lid];
823
824   s_skb[0][lid] = c_skb[0][lid];
825   s_skb[1][lid] = c_skb[1][lid];
826   s_skb[2][lid] = c_skb[2][lid];
827   s_skb[3][lid] = c_skb[3][lid];
828   s_skb[4][lid] = c_skb[4][lid];
829   s_skb[5][lid] = c_skb[5][lid];
830   s_skb[6][lid] = c_skb[6][lid];
831   s_skb[7][lid] = c_skb[7][lid];
832
833   barrier (CLK_LOCAL_MEM_FENCE);
834
835   if (gid >= gid_max) return;
836
837   /**
838    * salt
839    */
840
841   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
842   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
843   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
844
845   u32 data[2];
846
847   data[0] = s0;
848   data[1] = s1;
849
850   /**
851    * digest
852    */
853
854   const u32 search[4] =
855   {
856     digests_buf[digests_offset].digest_buf[DGST_R0],
857     digests_buf[digests_offset].digest_buf[DGST_R1],
858     digests_buf[digests_offset].digest_buf[DGST_R2],
859     digests_buf[digests_offset].digest_buf[DGST_R3]
860   };
861
862   /**
863    * loop
864    */
865
866   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
867   {
868     const u32 pw_r_len = combs_buf[il_pos].pw_len;
869
870     const u32 pw_len = pw_l_len + pw_r_len;
871
872     u32 wordr0[4];
873
874     wordr0[0] = combs_buf[il_pos].i[0];
875     wordr0[1] = combs_buf[il_pos].i[1];
876     wordr0[2] = combs_buf[il_pos].i[2];
877     wordr0[3] = combs_buf[il_pos].i[3];
878
879     u32 wordr1[4];
880
881     wordr1[0] = combs_buf[il_pos].i[4];
882     wordr1[1] = combs_buf[il_pos].i[5];
883     wordr1[2] = combs_buf[il_pos].i[6];
884     wordr1[3] = combs_buf[il_pos].i[7];
885
886     u32 wordr2[4];
887
888     wordr2[0] = 0;
889     wordr2[1] = 0;
890     wordr2[2] = 0;
891     wordr2[3] = 0;
892
893     u32 wordr3[4];
894
895     wordr3[0] = 0;
896     wordr3[1] = 0;
897     wordr3[2] = 0;
898     wordr3[3] = 0;
899
900     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
901     {
902       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
903     }
904
905     u32 w0[4];
906
907     w0[0] = wordl0[0] | wordr0[0];
908     w0[1] = wordl0[1] | wordr0[1];
909     w0[2] = wordl0[2] | wordr0[2];
910     w0[3] = wordl0[3] | wordr0[3];
911
912     u32 w1[4];
913
914     w1[0] = wordl1[0] | wordr1[0];
915     w1[1] = wordl1[1] | wordr1[1];
916     w1[2] = wordl1[2] | wordr1[2];
917     w1[3] = wordl1[3] | wordr1[3];
918
919     u32 w2[4];
920
921     w2[0] = 0;
922     w2[1] = 0;
923     w2[2] = 0;
924     w2[3] = 0;
925
926     u32 w3[4];
927
928     w3[0] = 0;
929     w3[1] = 0;
930     w3[2] = 0;
931     w3[3] = 0;
932
933     u32 w0_t[4];
934     u32 w1_t[4];
935     u32 w2_t[4];
936     u32 w3_t[4];
937
938     make_unicode (w0, w0_t, w1_t);
939     make_unicode (w1, w2_t, w3_t);
940
941     w3_t[2] = pw_len * 8 * 2;
942
943     u32 a = MD4M_A;
944     u32 b = MD4M_B;
945     u32 c = MD4M_C;
946     u32 d = MD4M_D;
947
948     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
949     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
950     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
951     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
952     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
953     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
954     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
955     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
956     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
957     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
958     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
959     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
960     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
961     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
962     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
963     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
964
965     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
966     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
967     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
968     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
969     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
970     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
971     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
972     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
973     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
974     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
975     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
976     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
977     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
978     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
979     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
980     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
981
982     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
983     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
984     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
985     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
986     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
987     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
988     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
989     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
990     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
991     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
992     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
993     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
994     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
995     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
996
997     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
998
999     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
1000     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
1001
1002     a += MD4M_A;
1003     b += MD4M_B;
1004     c += MD4M_C;
1005     d += MD4M_D;
1006
1007     /**
1008      * DES1
1009      */
1010
1011     u32 key[2];
1012
1013     transform_netntlmv1_key (a, b, key);
1014
1015     u32 Kc[16];
1016     u32 Kd[16];
1017
1018     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1019
1020     u32 iv1[2];
1021
1022     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
1023
1024     /**
1025      * DES2
1026      */
1027
1028     /*
1029     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
1030
1031     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1032
1033     u32 iv2[2];
1034
1035     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
1036     */
1037
1038     u32 iv2[2];
1039
1040     iv2[0] = search[2];
1041     iv2[1] = search[3];
1042
1043     /**
1044      * compare
1045      */
1046
1047     const u32 r0 = iv1[0];
1048     const u32 r1 = iv1[1];
1049     const u32 r2 = iv2[0];
1050     const u32 r3 = iv2[1];
1051
1052     #include COMPARE_S
1053   }
1054 }
1055
1056 __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 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)
1057 {
1058 }
1059
1060 __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 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)
1061 {
1062 }