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