Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m03000_a0.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *               magnum <john.magnum@hushmail.com>
5  *
6  * License.....: MIT
7  */
8
9 #define _DES_
10
11 #define NEW_SIMD_CODE
12
13 #include "inc_vendor.cl"
14 #include "inc_hash_constants.h"
15 #include "inc_hash_functions.cl"
16 #include "inc_types.cl"
17 #include "inc_common.cl"
18 #include "inc_rp.h"
19 #include "inc_rp.cl"
20 #include "inc_simd.cl"
21
22 #define PERM_OP(a,b,tt,n,m) \
23 {                           \
24   tt = a >> n;              \
25   tt = tt ^ b;              \
26   tt = tt & m;              \
27   b = b ^ tt;               \
28   tt = tt << n;             \
29   a = a ^ tt;               \
30 }
31
32 #define HPERM_OP(a,tt,n,m)  \
33 {                           \
34   tt = a << (16 + n);       \
35   tt = tt ^ a;              \
36   tt = tt & m;              \
37   a  = a ^ tt;              \
38   tt = tt >> (16 + n);      \
39   a  = a ^ tt;              \
40 }
41
42 __constant u32 c_SPtrans[8][64] =
43 {
44   {
45     0x02080800, 0x00080000, 0x02000002, 0x02080802,
46     0x02000000, 0x00080802, 0x00080002, 0x02000002,
47     0x00080802, 0x02080800, 0x02080000, 0x00000802,
48     0x02000802, 0x02000000, 0x00000000, 0x00080002,
49     0x00080000, 0x00000002, 0x02000800, 0x00080800,
50     0x02080802, 0x02080000, 0x00000802, 0x02000800,
51     0x00000002, 0x00000800, 0x00080800, 0x02080002,
52     0x00000800, 0x02000802, 0x02080002, 0x00000000,
53     0x00000000, 0x02080802, 0x02000800, 0x00080002,
54     0x02080800, 0x00080000, 0x00000802, 0x02000800,
55     0x02080002, 0x00000800, 0x00080800, 0x02000002,
56     0x00080802, 0x00000002, 0x02000002, 0x02080000,
57     0x02080802, 0x00080800, 0x02080000, 0x02000802,
58     0x02000000, 0x00000802, 0x00080002, 0x00000000,
59     0x00080000, 0x02000000, 0x02000802, 0x02080800,
60     0x00000002, 0x02080002, 0x00000800, 0x00080802,
61   },
62   {
63     0x40108010, 0x00000000, 0x00108000, 0x40100000,
64     0x40000010, 0x00008010, 0x40008000, 0x00108000,
65     0x00008000, 0x40100010, 0x00000010, 0x40008000,
66     0x00100010, 0x40108000, 0x40100000, 0x00000010,
67     0x00100000, 0x40008010, 0x40100010, 0x00008000,
68     0x00108010, 0x40000000, 0x00000000, 0x00100010,
69     0x40008010, 0x00108010, 0x40108000, 0x40000010,
70     0x40000000, 0x00100000, 0x00008010, 0x40108010,
71     0x00100010, 0x40108000, 0x40008000, 0x00108010,
72     0x40108010, 0x00100010, 0x40000010, 0x00000000,
73     0x40000000, 0x00008010, 0x00100000, 0x40100010,
74     0x00008000, 0x40000000, 0x00108010, 0x40008010,
75     0x40108000, 0x00008000, 0x00000000, 0x40000010,
76     0x00000010, 0x40108010, 0x00108000, 0x40100000,
77     0x40100010, 0x00100000, 0x00008010, 0x40008000,
78     0x40008010, 0x00000010, 0x40100000, 0x00108000,
79   },
80   {
81     0x04000001, 0x04040100, 0x00000100, 0x04000101,
82     0x00040001, 0x04000000, 0x04000101, 0x00040100,
83     0x04000100, 0x00040000, 0x04040000, 0x00000001,
84     0x04040101, 0x00000101, 0x00000001, 0x04040001,
85     0x00000000, 0x00040001, 0x04040100, 0x00000100,
86     0x00000101, 0x04040101, 0x00040000, 0x04000001,
87     0x04040001, 0x04000100, 0x00040101, 0x04040000,
88     0x00040100, 0x00000000, 0x04000000, 0x00040101,
89     0x04040100, 0x00000100, 0x00000001, 0x00040000,
90     0x00000101, 0x00040001, 0x04040000, 0x04000101,
91     0x00000000, 0x04040100, 0x00040100, 0x04040001,
92     0x00040001, 0x04000000, 0x04040101, 0x00000001,
93     0x00040101, 0x04000001, 0x04000000, 0x04040101,
94     0x00040000, 0x04000100, 0x04000101, 0x00040100,
95     0x04000100, 0x00000000, 0x04040001, 0x00000101,
96     0x04000001, 0x00040101, 0x00000100, 0x04040000,
97   },
98   {
99     0x00401008, 0x10001000, 0x00000008, 0x10401008,
100     0x00000000, 0x10400000, 0x10001008, 0x00400008,
101     0x10401000, 0x10000008, 0x10000000, 0x00001008,
102     0x10000008, 0x00401008, 0x00400000, 0x10000000,
103     0x10400008, 0x00401000, 0x00001000, 0x00000008,
104     0x00401000, 0x10001008, 0x10400000, 0x00001000,
105     0x00001008, 0x00000000, 0x00400008, 0x10401000,
106     0x10001000, 0x10400008, 0x10401008, 0x00400000,
107     0x10400008, 0x00001008, 0x00400000, 0x10000008,
108     0x00401000, 0x10001000, 0x00000008, 0x10400000,
109     0x10001008, 0x00000000, 0x00001000, 0x00400008,
110     0x00000000, 0x10400008, 0x10401000, 0x00001000,
111     0x10000000, 0x10401008, 0x00401008, 0x00400000,
112     0x10401008, 0x00000008, 0x10001000, 0x00401008,
113     0x00400008, 0x00401000, 0x10400000, 0x10001008,
114     0x00001008, 0x10000000, 0x10000008, 0x10401000,
115   },
116   {
117     0x08000000, 0x00010000, 0x00000400, 0x08010420,
118     0x08010020, 0x08000400, 0x00010420, 0x08010000,
119     0x00010000, 0x00000020, 0x08000020, 0x00010400,
120     0x08000420, 0x08010020, 0x08010400, 0x00000000,
121     0x00010400, 0x08000000, 0x00010020, 0x00000420,
122     0x08000400, 0x00010420, 0x00000000, 0x08000020,
123     0x00000020, 0x08000420, 0x08010420, 0x00010020,
124     0x08010000, 0x00000400, 0x00000420, 0x08010400,
125     0x08010400, 0x08000420, 0x00010020, 0x08010000,
126     0x00010000, 0x00000020, 0x08000020, 0x08000400,
127     0x08000000, 0x00010400, 0x08010420, 0x00000000,
128     0x00010420, 0x08000000, 0x00000400, 0x00010020,
129     0x08000420, 0x00000400, 0x00000000, 0x08010420,
130     0x08010020, 0x08010400, 0x00000420, 0x00010000,
131     0x00010400, 0x08010020, 0x08000400, 0x00000420,
132     0x00000020, 0x00010420, 0x08010000, 0x08000020,
133   },
134   {
135     0x80000040, 0x00200040, 0x00000000, 0x80202000,
136     0x00200040, 0x00002000, 0x80002040, 0x00200000,
137     0x00002040, 0x80202040, 0x00202000, 0x80000000,
138     0x80002000, 0x80000040, 0x80200000, 0x00202040,
139     0x00200000, 0x80002040, 0x80200040, 0x00000000,
140     0x00002000, 0x00000040, 0x80202000, 0x80200040,
141     0x80202040, 0x80200000, 0x80000000, 0x00002040,
142     0x00000040, 0x00202000, 0x00202040, 0x80002000,
143     0x00002040, 0x80000000, 0x80002000, 0x00202040,
144     0x80202000, 0x00200040, 0x00000000, 0x80002000,
145     0x80000000, 0x00002000, 0x80200040, 0x00200000,
146     0x00200040, 0x80202040, 0x00202000, 0x00000040,
147     0x80202040, 0x00202000, 0x00200000, 0x80002040,
148     0x80000040, 0x80200000, 0x00202040, 0x00000000,
149     0x00002000, 0x80000040, 0x80002040, 0x80202000,
150     0x80200000, 0x00002040, 0x00000040, 0x80200040,
151   },
152   {
153     0x00004000, 0x00000200, 0x01000200, 0x01000004,
154     0x01004204, 0x00004004, 0x00004200, 0x00000000,
155     0x01000000, 0x01000204, 0x00000204, 0x01004000,
156     0x00000004, 0x01004200, 0x01004000, 0x00000204,
157     0x01000204, 0x00004000, 0x00004004, 0x01004204,
158     0x00000000, 0x01000200, 0x01000004, 0x00004200,
159     0x01004004, 0x00004204, 0x01004200, 0x00000004,
160     0x00004204, 0x01004004, 0x00000200, 0x01000000,
161     0x00004204, 0x01004000, 0x01004004, 0x00000204,
162     0x00004000, 0x00000200, 0x01000000, 0x01004004,
163     0x01000204, 0x00004204, 0x00004200, 0x00000000,
164     0x00000200, 0x01000004, 0x00000004, 0x01000200,
165     0x00000000, 0x01000204, 0x01000200, 0x00004200,
166     0x00000204, 0x00004000, 0x01004204, 0x01000000,
167     0x01004200, 0x00000004, 0x00004004, 0x01004204,
168     0x01000004, 0x01004200, 0x01004000, 0x00004004,
169   },
170   {
171     0x20800080, 0x20820000, 0x00020080, 0x00000000,
172     0x20020000, 0x00800080, 0x20800000, 0x20820080,
173     0x00000080, 0x20000000, 0x00820000, 0x00020080,
174     0x00820080, 0x20020080, 0x20000080, 0x20800000,
175     0x00020000, 0x00820080, 0x00800080, 0x20020000,
176     0x20820080, 0x20000080, 0x00000000, 0x00820000,
177     0x20000000, 0x00800000, 0x20020080, 0x20800080,
178     0x00800000, 0x00020000, 0x20820000, 0x00000080,
179     0x00800000, 0x00020000, 0x20000080, 0x20820080,
180     0x00020080, 0x20000000, 0x00000000, 0x00820000,
181     0x20800080, 0x20020080, 0x20020000, 0x00800080,
182     0x20820000, 0x00000080, 0x00800080, 0x20020000,
183     0x20820080, 0x00800000, 0x20800000, 0x20000080,
184     0x00820000, 0x00020080, 0x20020080, 0x20800000,
185     0x00000080, 0x20820000, 0x00820080, 0x00000000,
186     0x20000000, 0x20800080, 0x00020000, 0x00820080,
187   }
188 };
189
190 __constant u32 c_skb[8][64] =
191 {
192   {
193     0x00000000, 0x00000010, 0x20000000, 0x20000010,
194     0x00010000, 0x00010010, 0x20010000, 0x20010010,
195     0x00000800, 0x00000810, 0x20000800, 0x20000810,
196     0x00010800, 0x00010810, 0x20010800, 0x20010810,
197     0x00000020, 0x00000030, 0x20000020, 0x20000030,
198     0x00010020, 0x00010030, 0x20010020, 0x20010030,
199     0x00000820, 0x00000830, 0x20000820, 0x20000830,
200     0x00010820, 0x00010830, 0x20010820, 0x20010830,
201     0x00080000, 0x00080010, 0x20080000, 0x20080010,
202     0x00090000, 0x00090010, 0x20090000, 0x20090010,
203     0x00080800, 0x00080810, 0x20080800, 0x20080810,
204     0x00090800, 0x00090810, 0x20090800, 0x20090810,
205     0x00080020, 0x00080030, 0x20080020, 0x20080030,
206     0x00090020, 0x00090030, 0x20090020, 0x20090030,
207     0x00080820, 0x00080830, 0x20080820, 0x20080830,
208     0x00090820, 0x00090830, 0x20090820, 0x20090830,
209   },
210   {
211     0x00000000, 0x02000000, 0x00002000, 0x02002000,
212     0x00200000, 0x02200000, 0x00202000, 0x02202000,
213     0x00000004, 0x02000004, 0x00002004, 0x02002004,
214     0x00200004, 0x02200004, 0x00202004, 0x02202004,
215     0x00000400, 0x02000400, 0x00002400, 0x02002400,
216     0x00200400, 0x02200400, 0x00202400, 0x02202400,
217     0x00000404, 0x02000404, 0x00002404, 0x02002404,
218     0x00200404, 0x02200404, 0x00202404, 0x02202404,
219     0x10000000, 0x12000000, 0x10002000, 0x12002000,
220     0x10200000, 0x12200000, 0x10202000, 0x12202000,
221     0x10000004, 0x12000004, 0x10002004, 0x12002004,
222     0x10200004, 0x12200004, 0x10202004, 0x12202004,
223     0x10000400, 0x12000400, 0x10002400, 0x12002400,
224     0x10200400, 0x12200400, 0x10202400, 0x12202400,
225     0x10000404, 0x12000404, 0x10002404, 0x12002404,
226     0x10200404, 0x12200404, 0x10202404, 0x12202404,
227   },
228   {
229     0x00000000, 0x00000001, 0x00040000, 0x00040001,
230     0x01000000, 0x01000001, 0x01040000, 0x01040001,
231     0x00000002, 0x00000003, 0x00040002, 0x00040003,
232     0x01000002, 0x01000003, 0x01040002, 0x01040003,
233     0x00000200, 0x00000201, 0x00040200, 0x00040201,
234     0x01000200, 0x01000201, 0x01040200, 0x01040201,
235     0x00000202, 0x00000203, 0x00040202, 0x00040203,
236     0x01000202, 0x01000203, 0x01040202, 0x01040203,
237     0x08000000, 0x08000001, 0x08040000, 0x08040001,
238     0x09000000, 0x09000001, 0x09040000, 0x09040001,
239     0x08000002, 0x08000003, 0x08040002, 0x08040003,
240     0x09000002, 0x09000003, 0x09040002, 0x09040003,
241     0x08000200, 0x08000201, 0x08040200, 0x08040201,
242     0x09000200, 0x09000201, 0x09040200, 0x09040201,
243     0x08000202, 0x08000203, 0x08040202, 0x08040203,
244     0x09000202, 0x09000203, 0x09040202, 0x09040203,
245   },
246   {
247     0x00000000, 0x00100000, 0x00000100, 0x00100100,
248     0x00000008, 0x00100008, 0x00000108, 0x00100108,
249     0x00001000, 0x00101000, 0x00001100, 0x00101100,
250     0x00001008, 0x00101008, 0x00001108, 0x00101108,
251     0x04000000, 0x04100000, 0x04000100, 0x04100100,
252     0x04000008, 0x04100008, 0x04000108, 0x04100108,
253     0x04001000, 0x04101000, 0x04001100, 0x04101100,
254     0x04001008, 0x04101008, 0x04001108, 0x04101108,
255     0x00020000, 0x00120000, 0x00020100, 0x00120100,
256     0x00020008, 0x00120008, 0x00020108, 0x00120108,
257     0x00021000, 0x00121000, 0x00021100, 0x00121100,
258     0x00021008, 0x00121008, 0x00021108, 0x00121108,
259     0x04020000, 0x04120000, 0x04020100, 0x04120100,
260     0x04020008, 0x04120008, 0x04020108, 0x04120108,
261     0x04021000, 0x04121000, 0x04021100, 0x04121100,
262     0x04021008, 0x04121008, 0x04021108, 0x04121108,
263   },
264   {
265     0x00000000, 0x10000000, 0x00010000, 0x10010000,
266     0x00000004, 0x10000004, 0x00010004, 0x10010004,
267     0x20000000, 0x30000000, 0x20010000, 0x30010000,
268     0x20000004, 0x30000004, 0x20010004, 0x30010004,
269     0x00100000, 0x10100000, 0x00110000, 0x10110000,
270     0x00100004, 0x10100004, 0x00110004, 0x10110004,
271     0x20100000, 0x30100000, 0x20110000, 0x30110000,
272     0x20100004, 0x30100004, 0x20110004, 0x30110004,
273     0x00001000, 0x10001000, 0x00011000, 0x10011000,
274     0x00001004, 0x10001004, 0x00011004, 0x10011004,
275     0x20001000, 0x30001000, 0x20011000, 0x30011000,
276     0x20001004, 0x30001004, 0x20011004, 0x30011004,
277     0x00101000, 0x10101000, 0x00111000, 0x10111000,
278     0x00101004, 0x10101004, 0x00111004, 0x10111004,
279     0x20101000, 0x30101000, 0x20111000, 0x30111000,
280     0x20101004, 0x30101004, 0x20111004, 0x30111004,
281   },
282   {
283     0x00000000, 0x08000000, 0x00000008, 0x08000008,
284     0x00000400, 0x08000400, 0x00000408, 0x08000408,
285     0x00020000, 0x08020000, 0x00020008, 0x08020008,
286     0x00020400, 0x08020400, 0x00020408, 0x08020408,
287     0x00000001, 0x08000001, 0x00000009, 0x08000009,
288     0x00000401, 0x08000401, 0x00000409, 0x08000409,
289     0x00020001, 0x08020001, 0x00020009, 0x08020009,
290     0x00020401, 0x08020401, 0x00020409, 0x08020409,
291     0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
292     0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
293     0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
294     0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
295     0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
296     0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
297     0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
298     0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
299   },
300   {
301     0x00000000, 0x00000100, 0x00080000, 0x00080100,
302     0x01000000, 0x01000100, 0x01080000, 0x01080100,
303     0x00000010, 0x00000110, 0x00080010, 0x00080110,
304     0x01000010, 0x01000110, 0x01080010, 0x01080110,
305     0x00200000, 0x00200100, 0x00280000, 0x00280100,
306     0x01200000, 0x01200100, 0x01280000, 0x01280100,
307     0x00200010, 0x00200110, 0x00280010, 0x00280110,
308     0x01200010, 0x01200110, 0x01280010, 0x01280110,
309     0x00000200, 0x00000300, 0x00080200, 0x00080300,
310     0x01000200, 0x01000300, 0x01080200, 0x01080300,
311     0x00000210, 0x00000310, 0x00080210, 0x00080310,
312     0x01000210, 0x01000310, 0x01080210, 0x01080310,
313     0x00200200, 0x00200300, 0x00280200, 0x00280300,
314     0x01200200, 0x01200300, 0x01280200, 0x01280300,
315     0x00200210, 0x00200310, 0x00280210, 0x00280310,
316     0x01200210, 0x01200310, 0x01280210, 0x01280310,
317   },
318   {
319     0x00000000, 0x04000000, 0x00040000, 0x04040000,
320     0x00000002, 0x04000002, 0x00040002, 0x04040002,
321     0x00002000, 0x04002000, 0x00042000, 0x04042000,
322     0x00002002, 0x04002002, 0x00042002, 0x04042002,
323     0x00000020, 0x04000020, 0x00040020, 0x04040020,
324     0x00000022, 0x04000022, 0x00040022, 0x04040022,
325     0x00002020, 0x04002020, 0x00042020, 0x04042020,
326     0x00002022, 0x04002022, 0x00042022, 0x04042022,
327     0x00000800, 0x04000800, 0x00040800, 0x04040800,
328     0x00000802, 0x04000802, 0x00040802, 0x04040802,
329     0x00002800, 0x04002800, 0x00042800, 0x04042800,
330     0x00002802, 0x04002802, 0x00042802, 0x04042802,
331     0x00000820, 0x04000820, 0x00040820, 0x04040820,
332     0x00000822, 0x04000822, 0x00040822, 0x04040822,
333     0x00002820, 0x04002820, 0x00042820, 0x04042820,
334     0x00002822, 0x04002822, 0x00042822, 0x04042822
335   }
336 };
337
338 #define LM_IV_0_IP_RR3 0x2400b807
339 #define LM_IV_1_IP_RR3 0xaa190747
340
341 #if   VECT_SIZE == 1
342 #define BOX(i,n,S) (S)[(n)][(i)]
343 #elif VECT_SIZE == 2
344 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
345 #elif VECT_SIZE == 4
346 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
347 #elif VECT_SIZE == 8
348 #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])
349 #elif VECT_SIZE == 16
350 #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])
351 #endif
352
353 void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64])
354 {
355   u32x r = data[0];
356   u32x l = data[1];
357
358   #ifdef _unroll
359   #pragma unroll
360   #endif
361   for (u32 i = 0; i < 16; i += 2)
362   {
363     u32x u;
364     u32x t;
365
366     u = Kc[i + 0] ^ rotl32 (r, 30u);
367     t = Kd[i + 0] ^ rotl32 (r, 26u);
368
369     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
370        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
371        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
372        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
373        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
374        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
375        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
376        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
377
378     u = Kc[i + 1] ^ rotl32 (l, 30u);
379     t = Kd[i + 1] ^ rotl32 (l, 26u);
380
381     r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
382        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
383        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
384        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
385        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
386        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
387        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
388        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
389   }
390
391   iv[0] = rotl32 (l, 29);
392   iv[1] = rotl32 (r, 29);
393 }
394
395 void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64])
396 {
397   u32x tt;
398
399   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
400   HPERM_OP (c,    tt, 2, 0xcccc0000);
401   HPERM_OP (d,    tt, 2, 0xcccc0000);
402   PERM_OP  (d, c, tt, 1, 0x55555555);
403   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
404   PERM_OP  (d, c, tt, 1, 0x55555555);
405
406   d = ((d & 0x000000ff) << 16)
407     | ((d & 0x0000ff00) <<  0)
408     | ((d & 0x00ff0000) >> 16)
409     | ((c & 0xf0000000) >>  4);
410
411   c = c & 0x0fffffff;
412
413   #ifdef _unroll
414   #pragma unroll
415   #endif
416   for (u32 i = 0; i < 16; i++)
417   {
418     if ((i < 2) || (i == 8) || (i == 15))
419     {
420       c = ((c >> 1) | (c << 27));
421       d = ((d >> 1) | (d << 27));
422     }
423     else
424     {
425       c = ((c >> 2) | (c << 26));
426       d = ((d >> 2) | (d << 26));
427     }
428
429     c = c & 0x0fffffff;
430     d = d & 0x0fffffff;
431
432     const u32x c00 = (c >>  0) & 0x0000003f;
433     const u32x c06 = (c >>  6) & 0x00383003;
434     const u32x c07 = (c >>  7) & 0x0000003c;
435     const u32x c13 = (c >> 13) & 0x0000060f;
436     const u32x c20 = (c >> 20) & 0x00000001;
437
438     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
439            | BOX (((c06 >>  0) & 0xff)
440                  |((c07 >>  0) & 0xff), 1, s_skb)
441            | BOX (((c13 >>  0) & 0xff)
442                  |((c06 >>  8) & 0xff), 2, s_skb)
443            | BOX (((c20 >>  0) & 0xff)
444                  |((c13 >>  8) & 0xff)
445                  |((c06 >> 16) & 0xff), 3, s_skb);
446
447     const u32x d00 = (d >>  0) & 0x00003c3f;
448     const u32x d07 = (d >>  7) & 0x00003f03;
449     const u32x d21 = (d >> 21) & 0x0000000f;
450     const u32x d22 = (d >> 22) & 0x00000030;
451
452     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
453            | BOX (((d07 >>  0) & 0xff)
454                  |((d00 >>  8) & 0xff), 5, s_skb)
455            | BOX (((d07 >>  8) & 0xff), 6, s_skb)
456            | BOX (((d21 >>  0) & 0xff)
457                  |((d22 >>  0) & 0xff), 7, s_skb);
458
459     Kc[i] = ((t << 16) | (s & 0x0000ffff));
460     Kd[i] = ((s >> 16) | (t & 0xffff0000));
461   }
462 }
463
464 void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2])
465 {
466   u32x t[8];
467
468   t[0] = (w0 >>  0) & 0xff;
469   t[1] = (w0 >>  8) & 0xff;
470   t[2] = (w0 >> 16) & 0xff;
471   t[3] = (w0 >> 24) & 0xff;
472   t[4] = (w1 >>  0) & 0xff;
473   t[5] = (w1 >>  8) & 0xff;
474   t[6] = (w1 >> 16) & 0xff;
475   t[7] = (w1 >> 24) & 0xff;
476
477   u32x k[8];
478
479   k[0] =               (t[0] >> 0);
480   k[1] = (t[0] << 7) | (t[1] >> 1);
481   k[2] = (t[1] << 6) | (t[2] >> 2);
482   k[3] = (t[2] << 5) | (t[3] >> 3);
483   k[4] = (t[3] << 4) | (t[4] >> 4);
484   k[5] = (t[4] << 3) | (t[5] >> 5);
485   k[6] = (t[5] << 2) | (t[6] >> 6);
486   k[7] = (t[6] << 1);
487
488   out[0] = ((k[0] & 0xff) <<  0)
489          | ((k[1] & 0xff) <<  8)
490          | ((k[2] & 0xff) << 16)
491          | ((k[3] & 0xff) << 24);
492
493   out[1] = ((k[4] & 0xff) <<  0)
494          | ((k[5] & 0xff) <<  8)
495          | ((k[6] & 0xff) << 16)
496          | ((k[7] & 0xff) << 24);
497 }
498
499 __kernel void m03000_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)
500 {
501   /**
502    * modifier
503    */
504
505   const u32 gid = get_global_id (0);
506   const u32 lid = get_local_id (0);
507   const u32 lsz = get_local_size (0);
508
509   /**
510    * sbox, kbox
511    */
512
513   __local u32 s_SPtrans[8][64];
514   __local u32 s_skb[8][64];
515
516   for (u32 i = lid; i < 64; i += lsz)
517   {
518     s_SPtrans[0][i] = c_SPtrans[0][i];
519     s_SPtrans[1][i] = c_SPtrans[1][i];
520     s_SPtrans[2][i] = c_SPtrans[2][i];
521     s_SPtrans[3][i] = c_SPtrans[3][i];
522     s_SPtrans[4][i] = c_SPtrans[4][i];
523     s_SPtrans[5][i] = c_SPtrans[5][i];
524     s_SPtrans[6][i] = c_SPtrans[6][i];
525     s_SPtrans[7][i] = c_SPtrans[7][i];
526
527     s_skb[0][i] = c_skb[0][i];
528     s_skb[1][i] = c_skb[1][i];
529     s_skb[2][i] = c_skb[2][i];
530     s_skb[3][i] = c_skb[3][i];
531     s_skb[4][i] = c_skb[4][i];
532     s_skb[5][i] = c_skb[5][i];
533     s_skb[6][i] = c_skb[6][i];
534     s_skb[7][i] = c_skb[7][i];
535   }
536
537   barrier (CLK_LOCAL_MEM_FENCE);
538
539   if (gid >= gid_max) return;
540
541   /**
542    * base
543    */
544
545   u32 pw_buf0[4];
546   u32 pw_buf1[4];
547
548   pw_buf0[0] = pws[gid].i[0];
549   pw_buf0[1] = pws[gid].i[1];
550   pw_buf0[2] = pws[gid].i[2];
551   pw_buf0[3] = pws[gid].i[3];
552   pw_buf1[0] = pws[gid].i[4];
553   pw_buf1[1] = pws[gid].i[5];
554   pw_buf1[2] = pws[gid].i[6];
555   pw_buf1[3] = pws[gid].i[7];
556
557   const u32 pw_len = pws[gid].pw_len;
558
559   /**
560    * main
561    */
562
563   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
564   {
565     u32x w0[4] = { 0 };
566     u32x w1[4] = { 0 };
567     u32x w2[4] = { 0 };
568     u32x w3[4] = { 0 };
569
570     const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
571
572     u32x key[2];
573
574     transform_netntlmv1_key (w0[0], w0[1], key);
575
576     const u32x c = key[0];
577     const u32x d = key[1];
578
579     u32x Kc[16];
580     u32x Kd[16];
581
582     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
583
584     u32x data[2];
585
586     data[0] = LM_IV_0_IP_RR3;
587     data[1] = LM_IV_1_IP_RR3;
588
589     u32x iv[2];
590
591     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
592
593     u32x z = 0;
594
595     COMPARE_M_SIMD (iv[0], iv[1], z, z);
596   }
597 }
598
599 __kernel void m03000_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)
600 {
601 }
602
603 __kernel void m03000_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)
604 {
605 }
606
607 __kernel void m03000_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)
608 {
609   /**
610    * modifier
611    */
612
613   const u32 gid = get_global_id (0);
614   const u32 lid = get_local_id (0);
615   const u32 lsz = get_local_size (0);
616
617   /**
618    * sbox, kbox
619    */
620
621   __local u32 s_SPtrans[8][64];
622   __local u32 s_skb[8][64];
623
624   for (u32 i = lid; i < 64; i += lsz)
625   {
626     s_SPtrans[0][i] = c_SPtrans[0][i];
627     s_SPtrans[1][i] = c_SPtrans[1][i];
628     s_SPtrans[2][i] = c_SPtrans[2][i];
629     s_SPtrans[3][i] = c_SPtrans[3][i];
630     s_SPtrans[4][i] = c_SPtrans[4][i];
631     s_SPtrans[5][i] = c_SPtrans[5][i];
632     s_SPtrans[6][i] = c_SPtrans[6][i];
633     s_SPtrans[7][i] = c_SPtrans[7][i];
634
635     s_skb[0][i] = c_skb[0][i];
636     s_skb[1][i] = c_skb[1][i];
637     s_skb[2][i] = c_skb[2][i];
638     s_skb[3][i] = c_skb[3][i];
639     s_skb[4][i] = c_skb[4][i];
640     s_skb[5][i] = c_skb[5][i];
641     s_skb[6][i] = c_skb[6][i];
642     s_skb[7][i] = c_skb[7][i];
643   }
644
645   barrier (CLK_LOCAL_MEM_FENCE);
646
647   if (gid >= gid_max) return;
648
649   /**
650    * base
651    */
652
653   u32 pw_buf0[4];
654   u32 pw_buf1[4];
655
656   pw_buf0[0] = pws[gid].i[0];
657   pw_buf0[1] = pws[gid].i[1];
658   pw_buf0[2] = pws[gid].i[2];
659   pw_buf0[3] = pws[gid].i[3];
660   pw_buf1[0] = pws[gid].i[4];
661   pw_buf1[1] = pws[gid].i[5];
662   pw_buf1[2] = pws[gid].i[6];
663   pw_buf1[3] = pws[gid].i[7];
664
665   const u32 pw_len = pws[gid].pw_len;
666
667   /**
668    * digest
669    */
670
671   const u32 search[4] =
672   {
673     digests_buf[digests_offset].digest_buf[DGST_R0],
674     digests_buf[digests_offset].digest_buf[DGST_R1],
675     0,
676     0
677   };
678
679   /**
680    * main
681    */
682
683   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
684   {
685     u32x w0[4] = { 0 };
686     u32x w1[4] = { 0 };
687     u32x w2[4] = { 0 };
688     u32x w3[4] = { 0 };
689
690     const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
691
692     u32x key[2];
693
694     transform_netntlmv1_key (w0[0], w0[1], key);
695
696     const u32x c = key[0];
697     const u32x d = key[1];
698
699     u32x Kc[16];
700     u32x Kd[16];
701
702     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
703
704     u32x data[2];
705
706     data[0] = LM_IV_0_IP_RR3;
707     data[1] = LM_IV_1_IP_RR3;
708
709     u32x iv[2];
710
711     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
712
713     u32x z = 0;
714
715     COMPARE_S_SIMD (iv[0], iv[1], z, z);
716   }
717 }
718
719 __kernel void m03000_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)
720 {
721 }
722
723 __kernel void m03000_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)
724 {
725 }