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