Fix -m 3000 kernel
[hashcat.git] / OpenCL / m03000_a1.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _DES_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 0
12 #define DGST_R1 1
13 #define DGST_R2 2
14 #define DGST_R3 3
15
16 #include "include/kernel_functions.c"
17 #include "types_ocl.c"
18 #include "common.c"
19
20 #define COMPARE_S "check_single_comp4.c"
21 #define COMPARE_M "check_multi_comp4.c"
22
23 #define PERM_OP(a,b,tt,n,m) \
24 {                           \
25   tt = a >> n;              \
26   tt = tt ^ b;              \
27   tt = tt & m;              \
28   b = b ^ tt;               \
29   tt = tt << n;             \
30   a = a ^ tt;               \
31 }
32
33 #define HPERM_OP(a,tt,n,m)  \
34 {                           \
35   tt = a << (16 + n);       \
36   tt = tt ^ a;              \
37   tt = tt & m;              \
38   a  = a ^ tt;              \
39   tt = tt >> (16 + n);      \
40   a  = a ^ tt;              \
41 }
42
43 __constant u32 c_SPtrans[8][64] =
44 {
45   {
46     0x02080800, 0x00080000, 0x02000002, 0x02080802,
47     0x02000000, 0x00080802, 0x00080002, 0x02000002,
48     0x00080802, 0x02080800, 0x02080000, 0x00000802,
49     0x02000802, 0x02000000, 0x00000000, 0x00080002,
50     0x00080000, 0x00000002, 0x02000800, 0x00080800,
51     0x02080802, 0x02080000, 0x00000802, 0x02000800,
52     0x00000002, 0x00000800, 0x00080800, 0x02080002,
53     0x00000800, 0x02000802, 0x02080002, 0x00000000,
54     0x00000000, 0x02080802, 0x02000800, 0x00080002,
55     0x02080800, 0x00080000, 0x00000802, 0x02000800,
56     0x02080002, 0x00000800, 0x00080800, 0x02000002,
57     0x00080802, 0x00000002, 0x02000002, 0x02080000,
58     0x02080802, 0x00080800, 0x02080000, 0x02000802,
59     0x02000000, 0x00000802, 0x00080002, 0x00000000,
60     0x00080000, 0x02000000, 0x02000802, 0x02080800,
61     0x00000002, 0x02080002, 0x00000800, 0x00080802,
62   },
63   {
64     0x40108010, 0x00000000, 0x00108000, 0x40100000,
65     0x40000010, 0x00008010, 0x40008000, 0x00108000,
66     0x00008000, 0x40100010, 0x00000010, 0x40008000,
67     0x00100010, 0x40108000, 0x40100000, 0x00000010,
68     0x00100000, 0x40008010, 0x40100010, 0x00008000,
69     0x00108010, 0x40000000, 0x00000000, 0x00100010,
70     0x40008010, 0x00108010, 0x40108000, 0x40000010,
71     0x40000000, 0x00100000, 0x00008010, 0x40108010,
72     0x00100010, 0x40108000, 0x40008000, 0x00108010,
73     0x40108010, 0x00100010, 0x40000010, 0x00000000,
74     0x40000000, 0x00008010, 0x00100000, 0x40100010,
75     0x00008000, 0x40000000, 0x00108010, 0x40008010,
76     0x40108000, 0x00008000, 0x00000000, 0x40000010,
77     0x00000010, 0x40108010, 0x00108000, 0x40100000,
78     0x40100010, 0x00100000, 0x00008010, 0x40008000,
79     0x40008010, 0x00000010, 0x40100000, 0x00108000,
80   },
81   {
82     0x04000001, 0x04040100, 0x00000100, 0x04000101,
83     0x00040001, 0x04000000, 0x04000101, 0x00040100,
84     0x04000100, 0x00040000, 0x04040000, 0x00000001,
85     0x04040101, 0x00000101, 0x00000001, 0x04040001,
86     0x00000000, 0x00040001, 0x04040100, 0x00000100,
87     0x00000101, 0x04040101, 0x00040000, 0x04000001,
88     0x04040001, 0x04000100, 0x00040101, 0x04040000,
89     0x00040100, 0x00000000, 0x04000000, 0x00040101,
90     0x04040100, 0x00000100, 0x00000001, 0x00040000,
91     0x00000101, 0x00040001, 0x04040000, 0x04000101,
92     0x00000000, 0x04040100, 0x00040100, 0x04040001,
93     0x00040001, 0x04000000, 0x04040101, 0x00000001,
94     0x00040101, 0x04000001, 0x04000000, 0x04040101,
95     0x00040000, 0x04000100, 0x04000101, 0x00040100,
96     0x04000100, 0x00000000, 0x04040001, 0x00000101,
97     0x04000001, 0x00040101, 0x00000100, 0x04040000,
98   },
99   {
100     0x00401008, 0x10001000, 0x00000008, 0x10401008,
101     0x00000000, 0x10400000, 0x10001008, 0x00400008,
102     0x10401000, 0x10000008, 0x10000000, 0x00001008,
103     0x10000008, 0x00401008, 0x00400000, 0x10000000,
104     0x10400008, 0x00401000, 0x00001000, 0x00000008,
105     0x00401000, 0x10001008, 0x10400000, 0x00001000,
106     0x00001008, 0x00000000, 0x00400008, 0x10401000,
107     0x10001000, 0x10400008, 0x10401008, 0x00400000,
108     0x10400008, 0x00001008, 0x00400000, 0x10000008,
109     0x00401000, 0x10001000, 0x00000008, 0x10400000,
110     0x10001008, 0x00000000, 0x00001000, 0x00400008,
111     0x00000000, 0x10400008, 0x10401000, 0x00001000,
112     0x10000000, 0x10401008, 0x00401008, 0x00400000,
113     0x10401008, 0x00000008, 0x10001000, 0x00401008,
114     0x00400008, 0x00401000, 0x10400000, 0x10001008,
115     0x00001008, 0x10000000, 0x10000008, 0x10401000,
116   },
117   {
118     0x08000000, 0x00010000, 0x00000400, 0x08010420,
119     0x08010020, 0x08000400, 0x00010420, 0x08010000,
120     0x00010000, 0x00000020, 0x08000020, 0x00010400,
121     0x08000420, 0x08010020, 0x08010400, 0x00000000,
122     0x00010400, 0x08000000, 0x00010020, 0x00000420,
123     0x08000400, 0x00010420, 0x00000000, 0x08000020,
124     0x00000020, 0x08000420, 0x08010420, 0x00010020,
125     0x08010000, 0x00000400, 0x00000420, 0x08010400,
126     0x08010400, 0x08000420, 0x00010020, 0x08010000,
127     0x00010000, 0x00000020, 0x08000020, 0x08000400,
128     0x08000000, 0x00010400, 0x08010420, 0x00000000,
129     0x00010420, 0x08000000, 0x00000400, 0x00010020,
130     0x08000420, 0x00000400, 0x00000000, 0x08010420,
131     0x08010020, 0x08010400, 0x00000420, 0x00010000,
132     0x00010400, 0x08010020, 0x08000400, 0x00000420,
133     0x00000020, 0x00010420, 0x08010000, 0x08000020,
134   },
135   {
136     0x80000040, 0x00200040, 0x00000000, 0x80202000,
137     0x00200040, 0x00002000, 0x80002040, 0x00200000,
138     0x00002040, 0x80202040, 0x00202000, 0x80000000,
139     0x80002000, 0x80000040, 0x80200000, 0x00202040,
140     0x00200000, 0x80002040, 0x80200040, 0x00000000,
141     0x00002000, 0x00000040, 0x80202000, 0x80200040,
142     0x80202040, 0x80200000, 0x80000000, 0x00002040,
143     0x00000040, 0x00202000, 0x00202040, 0x80002000,
144     0x00002040, 0x80000000, 0x80002000, 0x00202040,
145     0x80202000, 0x00200040, 0x00000000, 0x80002000,
146     0x80000000, 0x00002000, 0x80200040, 0x00200000,
147     0x00200040, 0x80202040, 0x00202000, 0x00000040,
148     0x80202040, 0x00202000, 0x00200000, 0x80002040,
149     0x80000040, 0x80200000, 0x00202040, 0x00000000,
150     0x00002000, 0x80000040, 0x80002040, 0x80202000,
151     0x80200000, 0x00002040, 0x00000040, 0x80200040,
152   },
153   {
154     0x00004000, 0x00000200, 0x01000200, 0x01000004,
155     0x01004204, 0x00004004, 0x00004200, 0x00000000,
156     0x01000000, 0x01000204, 0x00000204, 0x01004000,
157     0x00000004, 0x01004200, 0x01004000, 0x00000204,
158     0x01000204, 0x00004000, 0x00004004, 0x01004204,
159     0x00000000, 0x01000200, 0x01000004, 0x00004200,
160     0x01004004, 0x00004204, 0x01004200, 0x00000004,
161     0x00004204, 0x01004004, 0x00000200, 0x01000000,
162     0x00004204, 0x01004000, 0x01004004, 0x00000204,
163     0x00004000, 0x00000200, 0x01000000, 0x01004004,
164     0x01000204, 0x00004204, 0x00004200, 0x00000000,
165     0x00000200, 0x01000004, 0x00000004, 0x01000200,
166     0x00000000, 0x01000204, 0x01000200, 0x00004200,
167     0x00000204, 0x00004000, 0x01004204, 0x01000000,
168     0x01004200, 0x00000004, 0x00004004, 0x01004204,
169     0x01000004, 0x01004200, 0x01004000, 0x00004004,
170   },
171   {
172     0x20800080, 0x20820000, 0x00020080, 0x00000000,
173     0x20020000, 0x00800080, 0x20800000, 0x20820080,
174     0x00000080, 0x20000000, 0x00820000, 0x00020080,
175     0x00820080, 0x20020080, 0x20000080, 0x20800000,
176     0x00020000, 0x00820080, 0x00800080, 0x20020000,
177     0x20820080, 0x20000080, 0x00000000, 0x00820000,
178     0x20000000, 0x00800000, 0x20020080, 0x20800080,
179     0x00800000, 0x00020000, 0x20820000, 0x00000080,
180     0x00800000, 0x00020000, 0x20000080, 0x20820080,
181     0x00020080, 0x20000000, 0x00000000, 0x00820000,
182     0x20800080, 0x20020080, 0x20020000, 0x00800080,
183     0x20820000, 0x00000080, 0x00800080, 0x20020000,
184     0x20820080, 0x00800000, 0x20800000, 0x20000080,
185     0x00820000, 0x00020080, 0x20020080, 0x20800000,
186     0x00000080, 0x20820000, 0x00820080, 0x00000000,
187     0x20000000, 0x20800080, 0x00020000, 0x00820080,
188   },
189 };
190
191 __constant u32 c_skb[8][64] =
192 {
193   {
194     0x00000000, 0x00000010, 0x20000000, 0x20000010,
195     0x00010000, 0x00010010, 0x20010000, 0x20010010,
196     0x00000800, 0x00000810, 0x20000800, 0x20000810,
197     0x00010800, 0x00010810, 0x20010800, 0x20010810,
198     0x00000020, 0x00000030, 0x20000020, 0x20000030,
199     0x00010020, 0x00010030, 0x20010020, 0x20010030,
200     0x00000820, 0x00000830, 0x20000820, 0x20000830,
201     0x00010820, 0x00010830, 0x20010820, 0x20010830,
202     0x00080000, 0x00080010, 0x20080000, 0x20080010,
203     0x00090000, 0x00090010, 0x20090000, 0x20090010,
204     0x00080800, 0x00080810, 0x20080800, 0x20080810,
205     0x00090800, 0x00090810, 0x20090800, 0x20090810,
206     0x00080020, 0x00080030, 0x20080020, 0x20080030,
207     0x00090020, 0x00090030, 0x20090020, 0x20090030,
208     0x00080820, 0x00080830, 0x20080820, 0x20080830,
209   },
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 #define BOX(i,n,S) (S)[(n)][(i)]
342
343 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
344 {
345   u32 r = data[0];
346   u32 l = data[1];
347
348   #pragma unroll 16
349   for (u32 i = 0; i < 16; i += 2)
350   {
351     u32 u;
352     u32 t;
353
354     u = Kc[i + 0] ^ rotl32 (r, 30u);
355     t = Kd[i + 0] ^ rotl32 (r, 26u);
356
357     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
358        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
359        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
360        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
361        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
362        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
363        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
364        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
365
366     u = Kc[i + 1] ^ rotl32 (l, 30u);
367     t = Kd[i + 1] ^ rotl32 (l, 26u);
368
369     r ^= 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
379   iv[0] = rotl32 (l, 29);
380   iv[1] = rotl32 (r, 29);
381 }
382
383 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
384 {
385   u32 tt;
386
387   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
388   HPERM_OP (c,    tt, 2, 0xcccc0000);
389   HPERM_OP (d,    tt, 2, 0xcccc0000);
390   PERM_OP  (d, c, tt, 1, 0x55555555);
391   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
392   PERM_OP  (d, c, tt, 1, 0x55555555);
393
394   d = ((d & 0x000000ff) << 16)
395     | ((d & 0x0000ff00) <<  0)
396     | ((d & 0x00ff0000) >> 16)
397     | ((c & 0xf0000000) >>  4);
398
399   c = c & 0x0fffffff;
400
401   #pragma unroll 16
402   for (u32 i = 0; i < 16; i++)
403   {
404     if ((i < 2) || (i == 8) || (i == 15))
405     {
406       c = ((c >> 1) | (c << 27));
407       d = ((d >> 1) | (d << 27));
408     }
409     else
410     {
411       c = ((c >> 2) | (c << 26));
412       d = ((d >> 2) | (d << 26));
413     }
414
415     c = c & 0x0fffffff;
416     d = d & 0x0fffffff;
417
418     const u32 c00 = (c >>  0) & 0x0000003f;
419     const u32 c06 = (c >>  6) & 0x00383003;
420     const u32 c07 = (c >>  7) & 0x0000003c;
421     const u32 c13 = (c >> 13) & 0x0000060f;
422     const u32 c20 = (c >> 20) & 0x00000001;
423
424     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
425           | BOX (((c06 >>  0) & 0xff)
426                 |((c07 >>  0) & 0xff), 1, s_skb)
427           | BOX (((c13 >>  0) & 0xff)
428                 |((c06 >>  8) & 0xff), 2, s_skb)
429           | BOX (((c20 >>  0) & 0xff)
430                 |((c13 >>  8) & 0xff)
431                 |((c06 >> 16) & 0xff), 3, s_skb);
432
433     const u32 d00 = (d >>  0) & 0x00003c3f;
434     const u32 d07 = (d >>  7) & 0x00003f03;
435     const u32 d21 = (d >> 21) & 0x0000000f;
436     const u32 d22 = (d >> 22) & 0x00000030;
437
438     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
439           | BOX (((d07 >>  0) & 0xff)
440                 |((d00 >>  8) & 0xff), 5, s_skb)
441           | BOX (((d07 >>  8) & 0xff), 6, s_skb)
442           | BOX (((d21 >>  0) & 0xff)
443                 |((d22 >>  0) & 0xff), 7, s_skb);
444
445     Kc[i] = ((t << 16) | (s & 0x0000ffff));
446     Kd[i] = ((s >> 16) | (t & 0xffff0000));
447   }
448 }
449
450 static void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2])
451 {
452   const uchar4 t0 = as_uchar4 (w0);
453   const uchar4 t1 = as_uchar4 (w1);
454
455   uchar4 k0;
456   uchar4 k1;
457
458   k0.s0 =                (t0.s0 >> 0);
459   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
460   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
461   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
462   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
463   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
464   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
465   k1.s3 = (t1.s2 << 1);
466
467   out[0] = as_uint (k0);
468   out[1] = as_uint (k1);
469 }
470
471 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
472 {
473   /**
474    * modifier
475    */
476
477   const u32 lid = get_local_id (0);
478
479   /**
480    * base
481    */
482
483   const u32 gid = get_global_id (0);
484
485   u32 wordl0[4];
486
487   wordl0[0] = pws[gid].i[ 0];
488   wordl0[1] = pws[gid].i[ 1];
489   wordl0[2] = 0;
490   wordl0[3] = 0;
491
492   u32 wordl1[4];
493
494   wordl1[0] = 0;
495   wordl1[1] = 0;
496   wordl1[2] = 0;
497   wordl1[3] = 0;
498
499   u32 wordl2[4];
500
501   wordl2[0] = 0;
502   wordl2[1] = 0;
503   wordl2[2] = 0;
504   wordl2[3] = 0;
505
506   u32 wordl3[4];
507
508   wordl3[0] = 0;
509   wordl3[1] = 0;
510   wordl3[2] = 0;
511   wordl3[3] = 0;
512
513   const u32 pw_l_len = pws[gid].pw_len;
514
515   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
516   {
517     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
518   }
519
520   /**
521    * sbox, kbox
522    */
523
524   __local u32 s_SPtrans[8][64];
525
526   __local u32 s_skb[8][64];
527
528   s_SPtrans[0][lid] = c_SPtrans[0][lid];
529   s_SPtrans[1][lid] = c_SPtrans[1][lid];
530   s_SPtrans[2][lid] = c_SPtrans[2][lid];
531   s_SPtrans[3][lid] = c_SPtrans[3][lid];
532   s_SPtrans[4][lid] = c_SPtrans[4][lid];
533   s_SPtrans[5][lid] = c_SPtrans[5][lid];
534   s_SPtrans[6][lid] = c_SPtrans[6][lid];
535   s_SPtrans[7][lid] = c_SPtrans[7][lid];
536
537   s_skb[0][lid] = c_skb[0][lid];
538   s_skb[1][lid] = c_skb[1][lid];
539   s_skb[2][lid] = c_skb[2][lid];
540   s_skb[3][lid] = c_skb[3][lid];
541   s_skb[4][lid] = c_skb[4][lid];
542   s_skb[5][lid] = c_skb[5][lid];
543   s_skb[6][lid] = c_skb[6][lid];
544   s_skb[7][lid] = c_skb[7][lid];
545
546   barrier (CLK_LOCAL_MEM_FENCE);
547
548   if (gid >= gid_max) return;
549
550   /**
551    * main
552    */
553
554   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
555   {
556     const u32 pw_r_len = combs_buf[il_pos].pw_len;
557
558     u32 pw_len = pw_l_len + pw_r_len;
559
560     pw_len = (pw_len >= 7) ? 7 : pw_len;
561
562     u32 wordr0[4];
563
564     wordr0[0] = combs_buf[il_pos].i[0];
565     wordr0[1] = combs_buf[il_pos].i[1];
566     wordr0[2] = 0;
567     wordr0[3] = 0;
568
569     u32 wordr1[4];
570
571     wordr1[0] = 0;
572     wordr1[1] = 0;
573     wordr1[2] = 0;
574     wordr1[3] = 0;
575
576     u32 wordr2[4];
577
578     wordr2[0] = 0;
579     wordr2[1] = 0;
580     wordr2[2] = 0;
581     wordr2[3] = 0;
582
583     u32 wordr3[4];
584
585     wordr3[0] = 0;
586     wordr3[1] = 0;
587     wordr3[2] = 0;
588     wordr3[3] = 0;
589
590     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
591     {
592       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
593     }
594
595     u32 w0[4];
596
597     w0[0] = wordl0[0] | wordr0[0];
598     w0[1] = wordl0[1] | wordr0[1];
599     w0[2] = 0;
600     w0[3] = 0;
601
602     u32 w1[4];
603
604     w1[0] = 0;
605     w1[1] = 0;
606     w1[2] = 0;
607     w1[3] = 0;
608
609     u32 w2[4];
610
611     w2[0] = 0;
612     w2[1] = 0;
613     w2[2] = 0;
614     w2[3] = 0;
615
616     u32 w3[4];
617
618     w3[0] = 0;
619     w3[1] = 0;
620     w3[2] = 0;
621     w3[3] = 0;
622
623     u32 key[2];
624
625     transform_netntlmv1_key (w0[0], w0[1], key);
626
627     const u32 c = key[0];
628     const u32 d = key[1];
629
630     u32 Kc[16];
631     u32 Kd[16];
632
633     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
634
635     u32 data[2];
636
637     data[0] = LM_IV_0_IP_RR3;
638     data[1] = LM_IV_1_IP_RR3;
639
640     u32 iv[2];
641
642     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
643
644     const u32 r0 = iv[0];
645     const u32 r1 = iv[1];
646     const u32 r2 = 0;
647     const u32 r3 = 0;
648
649     #include COMPARE_M
650   }
651 }
652
653 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
654 {
655 }
656
657 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
658 {
659 }
660
661 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
662 {
663   /**
664    * modifier
665    */
666
667   const u32 lid = get_local_id (0);
668
669   /**
670    * base
671    */
672
673   const u32 gid = get_global_id (0);
674
675   u32 wordl0[4];
676
677   wordl0[0] = pws[gid].i[ 0];
678   wordl0[1] = pws[gid].i[ 1];
679   wordl0[2] = 0;
680   wordl0[3] = 0;
681
682   u32 wordl1[4];
683
684   wordl1[0] = 0;
685   wordl1[1] = 0;
686   wordl1[2] = 0;
687   wordl1[3] = 0;
688
689   u32 wordl2[4];
690
691   wordl2[0] = 0;
692   wordl2[1] = 0;
693   wordl2[2] = 0;
694   wordl2[3] = 0;
695
696   u32 wordl3[4];
697
698   wordl3[0] = 0;
699   wordl3[1] = 0;
700   wordl3[2] = 0;
701   wordl3[3] = 0;
702
703   const u32 pw_l_len = pws[gid].pw_len;
704
705   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
706   {
707     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
708   }
709
710   /**
711    * sbox, kbox
712    */
713
714   __local u32 s_SPtrans[8][64];
715
716   __local u32 s_skb[8][64];
717
718   s_SPtrans[0][lid] = c_SPtrans[0][lid];
719   s_SPtrans[1][lid] = c_SPtrans[1][lid];
720   s_SPtrans[2][lid] = c_SPtrans[2][lid];
721   s_SPtrans[3][lid] = c_SPtrans[3][lid];
722   s_SPtrans[4][lid] = c_SPtrans[4][lid];
723   s_SPtrans[5][lid] = c_SPtrans[5][lid];
724   s_SPtrans[6][lid] = c_SPtrans[6][lid];
725   s_SPtrans[7][lid] = c_SPtrans[7][lid];
726
727   s_skb[0][lid] = c_skb[0][lid];
728   s_skb[1][lid] = c_skb[1][lid];
729   s_skb[2][lid] = c_skb[2][lid];
730   s_skb[3][lid] = c_skb[3][lid];
731   s_skb[4][lid] = c_skb[4][lid];
732   s_skb[5][lid] = c_skb[5][lid];
733   s_skb[6][lid] = c_skb[6][lid];
734   s_skb[7][lid] = c_skb[7][lid];
735
736   barrier (CLK_LOCAL_MEM_FENCE);
737
738   if (gid >= gid_max) return;
739
740   /**
741    * digest
742    */
743
744   const u32 search[4] =
745   {
746     digests_buf[digests_offset].digest_buf[DGST_R0],
747     digests_buf[digests_offset].digest_buf[DGST_R1],
748     digests_buf[digests_offset].digest_buf[DGST_R2],
749     digests_buf[digests_offset].digest_buf[DGST_R3]
750   };
751
752   /**
753    * main
754    */
755
756   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
757   {
758     const u32 pw_r_len = combs_buf[il_pos].pw_len;
759
760     u32 pw_len = pw_l_len + pw_r_len;
761
762     pw_len = (pw_len >= 7) ? 7 : pw_len;
763
764     u32 wordr0[4];
765
766     wordr0[0] = combs_buf[il_pos].i[0];
767     wordr0[1] = combs_buf[il_pos].i[1];
768     wordr0[2] = 0;
769     wordr0[3] = 0;
770
771     u32 wordr1[4];
772
773     wordr1[0] = 0;
774     wordr1[1] = 0;
775     wordr1[2] = 0;
776     wordr1[3] = 0;
777
778     u32 wordr2[4];
779
780     wordr2[0] = 0;
781     wordr2[1] = 0;
782     wordr2[2] = 0;
783     wordr2[3] = 0;
784
785     u32 wordr3[4];
786
787     wordr3[0] = 0;
788     wordr3[1] = 0;
789     wordr3[2] = 0;
790     wordr3[3] = 0;
791
792     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
793     {
794       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
795     }
796
797     u32 w0[4];
798
799     w0[0] = wordl0[0] | wordr0[0];
800     w0[1] = wordl0[1] | wordr0[1];
801     w0[2] = 0;
802     w0[3] = 0;
803
804     u32 w1[4];
805
806     w1[0] = 0;
807     w1[1] = 0;
808     w1[2] = 0;
809     w1[3] = 0;
810
811     u32 w2[4];
812
813     w2[0] = 0;
814     w2[1] = 0;
815     w2[2] = 0;
816     w2[3] = 0;
817
818     u32 w3[4];
819
820     w3[0] = 0;
821     w3[1] = 0;
822     w3[2] = 0;
823     w3[3] = 0;
824
825     u32 key[2];
826
827     transform_netntlmv1_key (w0[0], w0[1], key);
828
829     const u32 c = key[0];
830     const u32 d = key[1];
831
832     u32 Kc[16];
833     u32 Kd[16];
834
835     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
836
837     u32 data[2];
838
839     data[0] = LM_IV_0_IP_RR3;
840     data[1] = LM_IV_1_IP_RR3;
841
842     u32 iv[2];
843
844     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
845
846     const u32 r0 = iv[0];
847     const u32 r1 = iv[1];
848     const u32 r2 = 0;
849     const u32 r3 = 0;
850
851     #include COMPARE_S
852   }
853 }
854
855 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
856 {
857 }
858
859 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
860 {
861 }