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