Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m03000_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 _DES_
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 #define LM_IV_0_IP_RR3 0x2400b807
336 #define LM_IV_1_IP_RR3 0xaa190747
337
338 #if   VECT_SIZE == 1
339 #define BOX(i,n,S) (S)[(n)][(i)]
340 #elif VECT_SIZE == 2
341 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
342 #elif VECT_SIZE == 4
343 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
344 #elif VECT_SIZE == 8
345 #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])
346 #elif VECT_SIZE == 16
347 #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])
348 #endif
349
350 void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 (*s_SPtrans)[64])
351 {
352   u32x r = data[0];
353   u32x l = data[1];
354
355   #ifdef _unroll
356   #pragma unroll
357   #endif
358   for (u32 i = 0; i < 16; i += 2)
359   {
360     u32x u;
361     u32x t;
362
363     u = Kc[i + 0] ^ rotl32 (r, 30u);
364     t = Kd[i + 0] ^ rotl32 (r, 26u);
365
366     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
367        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
368        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
369        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
370        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
371        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
372        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
373        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
374
375     u = Kc[i + 1] ^ rotl32 (l, 30u);
376     t = Kd[i + 1] ^ rotl32 (l, 26u);
377
378     r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
379        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
380        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
381        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
382        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
383        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
384        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
385        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
386   }
387
388   iv[0] = rotl32 (l, 29);
389   iv[1] = rotl32 (r, 29);
390 }
391
392 void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 (*s_skb)[64])
393 {
394   u32x tt;
395
396   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
397   HPERM_OP (c,    tt, 2, 0xcccc0000);
398   HPERM_OP (d,    tt, 2, 0xcccc0000);
399   PERM_OP  (d, c, tt, 1, 0x55555555);
400   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
401   PERM_OP  (d, c, tt, 1, 0x55555555);
402
403   d = ((d & 0x000000ff) << 16)
404     | ((d & 0x0000ff00) <<  0)
405     | ((d & 0x00ff0000) >> 16)
406     | ((c & 0xf0000000) >>  4);
407
408   c = c & 0x0fffffff;
409
410   #ifdef _unroll
411   #pragma unroll
412   #endif
413   for (u32 i = 0; i < 16; i++)
414   {
415     if ((i < 2) || (i == 8) || (i == 15))
416     {
417       c = ((c >> 1) | (c << 27));
418       d = ((d >> 1) | (d << 27));
419     }
420     else
421     {
422       c = ((c >> 2) | (c << 26));
423       d = ((d >> 2) | (d << 26));
424     }
425
426     c = c & 0x0fffffff;
427     d = d & 0x0fffffff;
428
429     const u32x c00 = (c >>  0) & 0x0000003f;
430     const u32x c06 = (c >>  6) & 0x00383003;
431     const u32x c07 = (c >>  7) & 0x0000003c;
432     const u32x c13 = (c >> 13) & 0x0000060f;
433     const u32x c20 = (c >> 20) & 0x00000001;
434
435     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
436            | BOX (((c06 >>  0) & 0xff)
437                  |((c07 >>  0) & 0xff), 1, s_skb)
438            | BOX (((c13 >>  0) & 0xff)
439                  |((c06 >>  8) & 0xff), 2, s_skb)
440            | BOX (((c20 >>  0) & 0xff)
441                  |((c13 >>  8) & 0xff)
442                  |((c06 >> 16) & 0xff), 3, s_skb);
443
444     const u32x d00 = (d >>  0) & 0x00003c3f;
445     const u32x d07 = (d >>  7) & 0x00003f03;
446     const u32x d21 = (d >> 21) & 0x0000000f;
447     const u32x d22 = (d >> 22) & 0x00000030;
448
449     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
450            | BOX (((d07 >>  0) & 0xff)
451                  |((d00 >>  8) & 0xff), 5, s_skb)
452            | BOX (((d07 >>  8) & 0xff), 6, s_skb)
453            | BOX (((d21 >>  0) & 0xff)
454                  |((d22 >>  0) & 0xff), 7, s_skb);
455
456     Kc[i] = ((t << 16) | (s & 0x0000ffff));
457     Kd[i] = ((s >> 16) | (t & 0xffff0000));
458   }
459 }
460
461 void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2])
462 {
463   u32x t[8];
464
465   t[0] = (w0 >>  0) & 0xff;
466   t[1] = (w0 >>  8) & 0xff;
467   t[2] = (w0 >> 16) & 0xff;
468   t[3] = (w0 >> 24) & 0xff;
469   t[4] = (w1 >>  0) & 0xff;
470   t[5] = (w1 >>  8) & 0xff;
471   t[6] = (w1 >> 16) & 0xff;
472   t[7] = (w1 >> 24) & 0xff;
473
474   u32x k[8];
475
476   k[0] =               (t[0] >> 0);
477   k[1] = (t[0] << 7) | (t[1] >> 1);
478   k[2] = (t[1] << 6) | (t[2] >> 2);
479   k[3] = (t[2] << 5) | (t[3] >> 3);
480   k[4] = (t[3] << 4) | (t[4] >> 4);
481   k[5] = (t[4] << 3) | (t[5] >> 5);
482   k[6] = (t[5] << 2) | (t[6] >> 6);
483   k[7] = (t[6] << 1);
484
485   out[0] = ((k[0] & 0xff) <<  0)
486          | ((k[1] & 0xff) <<  8)
487          | ((k[2] & 0xff) << 16)
488          | ((k[3] & 0xff) << 24);
489
490   out[1] = ((k[4] & 0xff) <<  0)
491          | ((k[5] & 0xff) <<  8)
492          | ((k[6] & 0xff) << 16)
493          | ((k[7] & 0xff) << 24);
494 }
495
496 __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)
497 {
498   /**
499    * modifier
500    */
501
502   const u32 gid = get_global_id (0);
503   const u32 lid = get_local_id (0);
504   const u32 lsz = get_local_size (0);
505
506   /**
507    * sbox, kbox
508    */
509
510   __local u32 s_SPtrans[8][64];
511   __local u32 s_skb[8][64];
512
513   for (u32 i = lid; i < 64; i += lsz)
514   {
515     s_SPtrans[0][i] = c_SPtrans[0][i];
516     s_SPtrans[1][i] = c_SPtrans[1][i];
517     s_SPtrans[2][i] = c_SPtrans[2][i];
518     s_SPtrans[3][i] = c_SPtrans[3][i];
519     s_SPtrans[4][i] = c_SPtrans[4][i];
520     s_SPtrans[5][i] = c_SPtrans[5][i];
521     s_SPtrans[6][i] = c_SPtrans[6][i];
522     s_SPtrans[7][i] = c_SPtrans[7][i];
523
524     s_skb[0][i] = c_skb[0][i];
525     s_skb[1][i] = c_skb[1][i];
526     s_skb[2][i] = c_skb[2][i];
527     s_skb[3][i] = c_skb[3][i];
528     s_skb[4][i] = c_skb[4][i];
529     s_skb[5][i] = c_skb[5][i];
530     s_skb[6][i] = c_skb[6][i];
531     s_skb[7][i] = c_skb[7][i];
532   }
533
534   barrier (CLK_LOCAL_MEM_FENCE);
535
536   if (gid >= gid_max) return;
537
538   /**
539    * base
540    */
541
542   u32 pw_buf0[4];
543   u32 pw_buf1[4];
544
545   pw_buf0[0] = pws[gid].i[0];
546   pw_buf0[1] = pws[gid].i[1];
547   pw_buf0[2] = pws[gid].i[2];
548   pw_buf0[3] = pws[gid].i[3];
549   pw_buf1[0] = pws[gid].i[4];
550   pw_buf1[1] = pws[gid].i[5];
551   pw_buf1[2] = pws[gid].i[6];
552   pw_buf1[3] = pws[gid].i[7];
553
554   const u32 pw_l_len = pws[gid].pw_len;
555
556   /**
557    * loop
558    */
559
560   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
561   {
562     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
563
564     const u32x pw_len = pw_l_len + pw_r_len;
565
566     /**
567      * concat password candidate
568      */
569
570     u32x wordl0[4] = { 0 };
571     u32x wordl1[4] = { 0 };
572     u32x wordl2[4] = { 0 };
573     u32x wordl3[4] = { 0 };
574
575     wordl0[0] = pw_buf0[0];
576     wordl0[1] = pw_buf0[1];
577     wordl0[2] = pw_buf0[2];
578     wordl0[3] = pw_buf0[3];
579     wordl1[0] = pw_buf1[0];
580     wordl1[1] = pw_buf1[1];
581     wordl1[2] = pw_buf1[2];
582     wordl1[3] = pw_buf1[3];
583
584     u32x wordr0[4] = { 0 };
585     u32x wordr1[4] = { 0 };
586     u32x wordr2[4] = { 0 };
587     u32x wordr3[4] = { 0 };
588
589     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
590     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
591     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
592     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
593     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
594     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
595     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
596     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
597
598     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
599     {
600       switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
601     }
602     else
603     {
604       switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
605     }
606
607     u32x w0[4];
608     u32x w1[4];
609     u32x w2[4];
610     u32x w3[4];
611
612     w0[0] = wordl0[0] | wordr0[0];
613     w0[1] = wordl0[1] | wordr0[1];
614     w0[2] = wordl0[2] | wordr0[2];
615     w0[3] = wordl0[3] | wordr0[3];
616     w1[0] = wordl1[0] | wordr1[0];
617     w1[1] = wordl1[1] | wordr1[1];
618     w1[2] = wordl1[2] | wordr1[2];
619     w1[3] = wordl1[3] | wordr1[3];
620     w2[0] = wordl2[0] | wordr2[0];
621     w2[1] = wordl2[1] | wordr2[1];
622     w2[2] = wordl2[2] | wordr2[2];
623     w2[3] = wordl2[3] | wordr2[3];
624     w3[0] = wordl3[0] | wordr3[0];
625     w3[1] = wordl3[1] | wordr3[1];
626     w3[2] = wordl3[2] | wordr3[2];
627     w3[3] = wordl3[3] | wordr3[3];
628
629     /**
630      * DES
631      */
632
633     u32x key[2];
634
635     transform_netntlmv1_key (w0[0], w0[1], key);
636
637     const u32x c = key[0];
638     const u32x d = key[1];
639
640     u32x Kc[16];
641     u32x Kd[16];
642
643     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
644
645     u32x data[2];
646
647     data[0] = LM_IV_0_IP_RR3;
648     data[1] = LM_IV_1_IP_RR3;
649
650     u32x iv[2];
651
652     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
653
654     u32x z = 0;
655
656     COMPARE_M_SIMD (iv[0], iv[1], z, z);
657   }
658 }
659
660 __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)
661 {
662 }
663
664 __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)
665 {
666 }
667
668 __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)
669 {
670   /**
671    * modifier
672    */
673
674   const u32 gid = get_global_id (0);
675   const u32 lid = get_local_id (0);
676   const u32 lsz = get_local_size (0);
677
678   /**
679    * sbox, kbox
680    */
681
682   __local u32 s_SPtrans[8][64];
683   __local u32 s_skb[8][64];
684
685   for (u32 i = lid; i < 64; i += lsz)
686   {
687     s_SPtrans[0][i] = c_SPtrans[0][i];
688     s_SPtrans[1][i] = c_SPtrans[1][i];
689     s_SPtrans[2][i] = c_SPtrans[2][i];
690     s_SPtrans[3][i] = c_SPtrans[3][i];
691     s_SPtrans[4][i] = c_SPtrans[4][i];
692     s_SPtrans[5][i] = c_SPtrans[5][i];
693     s_SPtrans[6][i] = c_SPtrans[6][i];
694     s_SPtrans[7][i] = c_SPtrans[7][i];
695
696     s_skb[0][i] = c_skb[0][i];
697     s_skb[1][i] = c_skb[1][i];
698     s_skb[2][i] = c_skb[2][i];
699     s_skb[3][i] = c_skb[3][i];
700     s_skb[4][i] = c_skb[4][i];
701     s_skb[5][i] = c_skb[5][i];
702     s_skb[6][i] = c_skb[6][i];
703     s_skb[7][i] = c_skb[7][i];
704   }
705
706   barrier (CLK_LOCAL_MEM_FENCE);
707
708   if (gid >= gid_max) return;
709
710   /**
711    * base
712    */
713
714   u32 pw_buf0[4];
715   u32 pw_buf1[4];
716
717   pw_buf0[0] = pws[gid].i[0];
718   pw_buf0[1] = pws[gid].i[1];
719   pw_buf0[2] = pws[gid].i[2];
720   pw_buf0[3] = pws[gid].i[3];
721   pw_buf1[0] = pws[gid].i[4];
722   pw_buf1[1] = pws[gid].i[5];
723   pw_buf1[2] = pws[gid].i[6];
724   pw_buf1[3] = pws[gid].i[7];
725
726   const u32 pw_l_len = pws[gid].pw_len;
727
728   /**
729    * digest
730    */
731
732   const u32 search[4] =
733   {
734     digests_buf[digests_offset].digest_buf[DGST_R0],
735     digests_buf[digests_offset].digest_buf[DGST_R1],
736     0,
737     0
738   };
739
740   /**
741    * loop
742    */
743
744   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
745   {
746     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
747
748     const u32x pw_len = pw_l_len + pw_r_len;
749
750     /**
751      * concat password candidate
752      */
753
754     u32x wordl0[4] = { 0 };
755     u32x wordl1[4] = { 0 };
756     u32x wordl2[4] = { 0 };
757     u32x wordl3[4] = { 0 };
758
759     wordl0[0] = pw_buf0[0];
760     wordl0[1] = pw_buf0[1];
761     wordl0[2] = pw_buf0[2];
762     wordl0[3] = pw_buf0[3];
763     wordl1[0] = pw_buf1[0];
764     wordl1[1] = pw_buf1[1];
765     wordl1[2] = pw_buf1[2];
766     wordl1[3] = pw_buf1[3];
767
768     u32x wordr0[4] = { 0 };
769     u32x wordr1[4] = { 0 };
770     u32x wordr2[4] = { 0 };
771     u32x wordr3[4] = { 0 };
772
773     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
774     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
775     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
776     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
777     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
778     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
779     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
780     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
781
782     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
783     {
784       switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
785     }
786     else
787     {
788       switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
789     }
790
791     u32x w0[4];
792     u32x w1[4];
793     u32x w2[4];
794     u32x w3[4];
795
796     w0[0] = wordl0[0] | wordr0[0];
797     w0[1] = wordl0[1] | wordr0[1];
798     w0[2] = wordl0[2] | wordr0[2];
799     w0[3] = wordl0[3] | wordr0[3];
800     w1[0] = wordl1[0] | wordr1[0];
801     w1[1] = wordl1[1] | wordr1[1];
802     w1[2] = wordl1[2] | wordr1[2];
803     w1[3] = wordl1[3] | wordr1[3];
804     w2[0] = wordl2[0] | wordr2[0];
805     w2[1] = wordl2[1] | wordr2[1];
806     w2[2] = wordl2[2] | wordr2[2];
807     w2[3] = wordl2[3] | wordr2[3];
808     w3[0] = wordl3[0] | wordr3[0];
809     w3[1] = wordl3[1] | wordr3[1];
810     w3[2] = wordl3[2] | wordr3[2];
811     w3[3] = wordl3[3] | wordr3[3];
812
813     /**
814      * DES
815      */
816
817     u32x key[2];
818
819     transform_netntlmv1_key (w0[0], w0[1], key);
820
821     const u32x c = key[0];
822     const u32x d = key[1];
823
824     u32x Kc[16];
825     u32x Kd[16];
826
827     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
828
829     u32x data[2];
830
831     data[0] = LM_IV_0_IP_RR3;
832     data[1] = LM_IV_1_IP_RR3;
833
834     u32x iv[2];
835
836     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
837
838     u32x z = 0;
839
840     COMPARE_S_SIMD (iv[0], iv[1], z, z);
841   }
842 }
843
844 __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)
845 {
846 }
847
848 __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)
849 {
850 }