Merge branch 'GetRidOfCUDA'
[hashcat.git] / OpenCL / m05500_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MD4_
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     0x00090820, 0x00090830, 0x20090820, 0x20090830,
210   },
211   {
212     0x00000000, 0x02000000, 0x00002000, 0x02002000,
213     0x00200000, 0x02200000, 0x00202000, 0x02202000,
214     0x00000004, 0x02000004, 0x00002004, 0x02002004,
215     0x00200004, 0x02200004, 0x00202004, 0x02202004,
216     0x00000400, 0x02000400, 0x00002400, 0x02002400,
217     0x00200400, 0x02200400, 0x00202400, 0x02202400,
218     0x00000404, 0x02000404, 0x00002404, 0x02002404,
219     0x00200404, 0x02200404, 0x00202404, 0x02202404,
220     0x10000000, 0x12000000, 0x10002000, 0x12002000,
221     0x10200000, 0x12200000, 0x10202000, 0x12202000,
222     0x10000004, 0x12000004, 0x10002004, 0x12002004,
223     0x10200004, 0x12200004, 0x10202004, 0x12202004,
224     0x10000400, 0x12000400, 0x10002400, 0x12002400,
225     0x10200400, 0x12200400, 0x10202400, 0x12202400,
226     0x10000404, 0x12000404, 0x10002404, 0x12002404,
227     0x10200404, 0x12200404, 0x10202404, 0x12202404,
228   },
229   {
230     0x00000000, 0x00000001, 0x00040000, 0x00040001,
231     0x01000000, 0x01000001, 0x01040000, 0x01040001,
232     0x00000002, 0x00000003, 0x00040002, 0x00040003,
233     0x01000002, 0x01000003, 0x01040002, 0x01040003,
234     0x00000200, 0x00000201, 0x00040200, 0x00040201,
235     0x01000200, 0x01000201, 0x01040200, 0x01040201,
236     0x00000202, 0x00000203, 0x00040202, 0x00040203,
237     0x01000202, 0x01000203, 0x01040202, 0x01040203,
238     0x08000000, 0x08000001, 0x08040000, 0x08040001,
239     0x09000000, 0x09000001, 0x09040000, 0x09040001,
240     0x08000002, 0x08000003, 0x08040002, 0x08040003,
241     0x09000002, 0x09000003, 0x09040002, 0x09040003,
242     0x08000200, 0x08000201, 0x08040200, 0x08040201,
243     0x09000200, 0x09000201, 0x09040200, 0x09040201,
244     0x08000202, 0x08000203, 0x08040202, 0x08040203,
245     0x09000202, 0x09000203, 0x09040202, 0x09040203,
246   },
247   {
248     0x00000000, 0x00100000, 0x00000100, 0x00100100,
249     0x00000008, 0x00100008, 0x00000108, 0x00100108,
250     0x00001000, 0x00101000, 0x00001100, 0x00101100,
251     0x00001008, 0x00101008, 0x00001108, 0x00101108,
252     0x04000000, 0x04100000, 0x04000100, 0x04100100,
253     0x04000008, 0x04100008, 0x04000108, 0x04100108,
254     0x04001000, 0x04101000, 0x04001100, 0x04101100,
255     0x04001008, 0x04101008, 0x04001108, 0x04101108,
256     0x00020000, 0x00120000, 0x00020100, 0x00120100,
257     0x00020008, 0x00120008, 0x00020108, 0x00120108,
258     0x00021000, 0x00121000, 0x00021100, 0x00121100,
259     0x00021008, 0x00121008, 0x00021108, 0x00121108,
260     0x04020000, 0x04120000, 0x04020100, 0x04120100,
261     0x04020008, 0x04120008, 0x04020108, 0x04120108,
262     0x04021000, 0x04121000, 0x04021100, 0x04121100,
263     0x04021008, 0x04121008, 0x04021108, 0x04121108,
264   },
265   {
266     0x00000000, 0x10000000, 0x00010000, 0x10010000,
267     0x00000004, 0x10000004, 0x00010004, 0x10010004,
268     0x20000000, 0x30000000, 0x20010000, 0x30010000,
269     0x20000004, 0x30000004, 0x20010004, 0x30010004,
270     0x00100000, 0x10100000, 0x00110000, 0x10110000,
271     0x00100004, 0x10100004, 0x00110004, 0x10110004,
272     0x20100000, 0x30100000, 0x20110000, 0x30110000,
273     0x20100004, 0x30100004, 0x20110004, 0x30110004,
274     0x00001000, 0x10001000, 0x00011000, 0x10011000,
275     0x00001004, 0x10001004, 0x00011004, 0x10011004,
276     0x20001000, 0x30001000, 0x20011000, 0x30011000,
277     0x20001004, 0x30001004, 0x20011004, 0x30011004,
278     0x00101000, 0x10101000, 0x00111000, 0x10111000,
279     0x00101004, 0x10101004, 0x00111004, 0x10111004,
280     0x20101000, 0x30101000, 0x20111000, 0x30111000,
281     0x20101004, 0x30101004, 0x20111004, 0x30111004,
282   },
283   {
284     0x00000000, 0x08000000, 0x00000008, 0x08000008,
285     0x00000400, 0x08000400, 0x00000408, 0x08000408,
286     0x00020000, 0x08020000, 0x00020008, 0x08020008,
287     0x00020400, 0x08020400, 0x00020408, 0x08020408,
288     0x00000001, 0x08000001, 0x00000009, 0x08000009,
289     0x00000401, 0x08000401, 0x00000409, 0x08000409,
290     0x00020001, 0x08020001, 0x00020009, 0x08020009,
291     0x00020401, 0x08020401, 0x00020409, 0x08020409,
292     0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
293     0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
294     0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
295     0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
296     0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
297     0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
298     0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
299     0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
300   },
301   {
302     0x00000000, 0x00000100, 0x00080000, 0x00080100,
303     0x01000000, 0x01000100, 0x01080000, 0x01080100,
304     0x00000010, 0x00000110, 0x00080010, 0x00080110,
305     0x01000010, 0x01000110, 0x01080010, 0x01080110,
306     0x00200000, 0x00200100, 0x00280000, 0x00280100,
307     0x01200000, 0x01200100, 0x01280000, 0x01280100,
308     0x00200010, 0x00200110, 0x00280010, 0x00280110,
309     0x01200010, 0x01200110, 0x01280010, 0x01280110,
310     0x00000200, 0x00000300, 0x00080200, 0x00080300,
311     0x01000200, 0x01000300, 0x01080200, 0x01080300,
312     0x00000210, 0x00000310, 0x00080210, 0x00080310,
313     0x01000210, 0x01000310, 0x01080210, 0x01080310,
314     0x00200200, 0x00200300, 0x00280200, 0x00280300,
315     0x01200200, 0x01200300, 0x01280200, 0x01280300,
316     0x00200210, 0x00200310, 0x00280210, 0x00280310,
317     0x01200210, 0x01200310, 0x01280210, 0x01280310,
318   },
319   {
320     0x00000000, 0x04000000, 0x00040000, 0x04040000,
321     0x00000002, 0x04000002, 0x00040002, 0x04040002,
322     0x00002000, 0x04002000, 0x00042000, 0x04042000,
323     0x00002002, 0x04002002, 0x00042002, 0x04042002,
324     0x00000020, 0x04000020, 0x00040020, 0x04040020,
325     0x00000022, 0x04000022, 0x00040022, 0x04040022,
326     0x00002020, 0x04002020, 0x00042020, 0x04042020,
327     0x00002022, 0x04002022, 0x00042022, 0x04042022,
328     0x00000800, 0x04000800, 0x00040800, 0x04040800,
329     0x00000802, 0x04000802, 0x00040802, 0x04040802,
330     0x00002800, 0x04002800, 0x00042800, 0x04042800,
331     0x00002802, 0x04002802, 0x00042802, 0x04042802,
332     0x00000820, 0x04000820, 0x00040820, 0x04040820,
333     0x00000822, 0x04000822, 0x00040822, 0x04040822,
334     0x00002820, 0x04002820, 0x00042820, 0x04042820,
335     0x00002822, 0x04002822, 0x00042822, 0x04042822
336   }
337 };
338
339 #define BOX(i,n,S) (S)[(n)][(i)]
340
341 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
342 {
343   u32 r = data[0];
344   u32 l = data[1];
345
346   #pragma unroll 16
347   for (u32 i = 0; i < 16; i += 2)
348   {
349     u32 u;
350     u32 t;
351
352     u = Kc[i + 0] ^ rotl32 (r, 30u);
353     t = Kd[i + 0] ^ rotl32 (r, 26u);
354
355     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
356        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
357        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
358        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
359        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
360        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
361        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
362        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
363
364     u = Kc[i + 1] ^ rotl32 (l, 30u);
365     t = Kd[i + 1] ^ rotl32 (l, 26u);
366
367     r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
368        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
369        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
370        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
371        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
372        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
373        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
374        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
375   }
376
377   iv[0] = l;
378   iv[1] = r;
379 }
380
381 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
382 {
383   u32 tt;
384
385   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
386   HPERM_OP (c,    tt, 2, 0xcccc0000);
387   HPERM_OP (d,    tt, 2, 0xcccc0000);
388   PERM_OP  (d, c, tt, 1, 0x55555555);
389   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
390   PERM_OP  (d, c, tt, 1, 0x55555555);
391
392   d = ((d & 0x000000ff) << 16)
393     | ((d & 0x0000ff00) <<  0)
394     | ((d & 0x00ff0000) >> 16)
395     | ((c & 0xf0000000) >>  4);
396
397   c = c & 0x0fffffff;
398
399   #pragma unroll 16
400   for (u32 i = 0; i < 16; i++)
401   {
402     if ((i < 2) || (i == 8) || (i == 15))
403     {
404       c = ((c >> 1) | (c << 27));
405       d = ((d >> 1) | (d << 27));
406     }
407     else
408     {
409       c = ((c >> 2) | (c << 26));
410       d = ((d >> 2) | (d << 26));
411     }
412
413     c = c & 0x0fffffff;
414     d = d & 0x0fffffff;
415
416     const u32 c00 = (c >>  0) & 0x0000003f;
417     const u32 c06 = (c >>  6) & 0x00383003;
418     const u32 c07 = (c >>  7) & 0x0000003c;
419     const u32 c13 = (c >> 13) & 0x0000060f;
420     const u32 c20 = (c >> 20) & 0x00000001;
421
422     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
423           | BOX (((c06 >>  0) & 0xff)
424                 |((c07 >>  0) & 0xff), 1, s_skb)
425           | BOX (((c13 >>  0) & 0xff)
426                 |((c06 >>  8) & 0xff), 2, s_skb)
427           | BOX (((c20 >>  0) & 0xff)
428                 |((c13 >>  8) & 0xff)
429                 |((c06 >> 16) & 0xff), 3, s_skb);
430
431     const u32 d00 = (d >>  0) & 0x00003c3f;
432     const u32 d07 = (d >>  7) & 0x00003f03;
433     const u32 d21 = (d >> 21) & 0x0000000f;
434     const u32 d22 = (d >> 22) & 0x00000030;
435
436     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
437           | BOX (((d07 >>  0) & 0xff)
438                 |((d00 >>  8) & 0xff), 5, s_skb)
439           | BOX (((d07 >>  8) & 0xff), 6, s_skb)
440           | BOX (((d21 >>  0) & 0xff)
441                 |((d22 >>  0) & 0xff), 7, s_skb);
442
443     Kc[i] = ((t << 16) | (s & 0x0000ffff));
444     Kd[i] = ((s >> 16) | (t & 0xffff0000));
445   }
446 }
447
448 static void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2])
449 {
450   const uchar4 t0 = as_uchar4 (w0);
451   const uchar4 t1 = as_uchar4 (w1);
452
453   uchar4 k0;
454   uchar4 k1;
455
456   k0.s0 =                (t0.s0 >> 0);
457   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
458   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
459   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
460   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
461   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
462   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
463   k1.s3 = (t1.s2 << 1);
464
465   out[0] = as_uint (k0);
466   out[1] = as_uint (k1);
467 }
468
469 static void m05500m (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
470 {
471   /**
472    * modifier
473    */
474
475   const u32 gid = get_global_id (0);
476   const u32 lid = get_local_id (0);
477
478   /**
479    * salt
480    */
481
482   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
483   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
484   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
485
486   u32 data[2];
487
488   data[0] = s0;
489   data[1] = s1;
490
491   /**
492    * loop
493    */
494
495   u32 w0l = w[0];
496
497   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
498   {
499     const u32 w0r = words_buf_r[il_pos];
500
501     const u32 w0 = w0l | w0r;
502
503     u32 a = MD4M_A;
504     u32 b = MD4M_B;
505     u32 c = MD4M_C;
506     u32 d = MD4M_D;
507
508     #define w0_t w0
509     #define w1_t w[ 1]
510     #define w2_t w[ 2]
511     #define w3_t w[ 3]
512     #define w4_t w[ 4]
513     #define w5_t w[ 5]
514     #define w6_t w[ 6]
515     #define w7_t w[ 7]
516     #define w8_t w[ 8]
517     #define w9_t w[ 9]
518     #define wa_t w[10]
519     #define wb_t w[11]
520     #define wc_t w[12]
521     #define wd_t w[13]
522     #define we_t w[14]
523     #define wf_t w[15]
524
525     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
526     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
527     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
528     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
529     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
530     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
531     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
532     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
533     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
534     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
535     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
536     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
537     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
538     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
539     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
540     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
541
542     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
543     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
544     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
545     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
546     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
547     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
548     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
549     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
550     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
551     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
552     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
553     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
554     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
555     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
556     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
557     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
558
559     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
560     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
561     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
562     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
563     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
564     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
565     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
566     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
567     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
568     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
569     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
570     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
571     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
572     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
573
574     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
575
576     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
577     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
578
579     a += MD4M_A;
580     b += MD4M_B;
581     c += MD4M_C;
582     d += MD4M_D;
583
584     /**
585      * DES1
586      */
587
588     u32 key[2];
589
590     transform_netntlmv1_key (a, b, key);
591
592     u32 Kc[16];
593     u32 Kd[16];
594
595     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
596
597     u32 iv1[2];
598
599     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
600
601     /**
602      * DES2
603      */
604
605     volatile const u32 bc = (b >> 24) | (c << 8);
606     volatile const u32 cd = (c >> 24) | (d << 8);
607
608     transform_netntlmv1_key (bc, cd, key);
609
610     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
611
612     u32 iv2[2];
613
614     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
615
616     /**
617      * compare
618      */
619
620     const u32 r0 = iv1[0];
621     const u32 r1 = iv1[1];
622     const u32 r2 = iv2[0];
623     const u32 r3 = iv2[1];
624
625     #include COMPARE_M
626   }
627 }
628
629 static void m05500s (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
630 {
631   /**
632    * modifier
633    */
634
635   const u32 gid = get_global_id (0);
636   const u32 lid = get_local_id (0);
637
638   /**
639    * salt
640    */
641
642   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
643   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
644   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
645
646   u32 data[2];
647
648   data[0] = s0;
649   data[1] = s1;
650
651   /**
652    * digest
653    */
654
655   const u32 search[4] =
656   {
657     digests_buf[digests_offset].digest_buf[DGST_R0],
658     digests_buf[digests_offset].digest_buf[DGST_R1],
659     digests_buf[digests_offset].digest_buf[DGST_R2],
660     digests_buf[digests_offset].digest_buf[DGST_R3]
661   };
662
663   /**
664    * loop
665    */
666
667   u32 w0l = w[0];
668
669   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
670   {
671     const u32 w0r = words_buf_r[il_pos];
672
673     const u32 w0 = w0l | w0r;
674
675     u32 a = MD4M_A;
676     u32 b = MD4M_B;
677     u32 c = MD4M_C;
678     u32 d = MD4M_D;
679
680     #define w0_t w0
681     #define w1_t w[ 1]
682     #define w2_t w[ 2]
683     #define w3_t w[ 3]
684     #define w4_t w[ 4]
685     #define w5_t w[ 5]
686     #define w6_t w[ 6]
687     #define w7_t w[ 7]
688     #define w8_t w[ 8]
689     #define w9_t w[ 9]
690     #define wa_t w[10]
691     #define wb_t w[11]
692     #define wc_t w[12]
693     #define wd_t w[13]
694     #define we_t w[14]
695     #define wf_t w[15]
696
697     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
698     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
699     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
700     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
701     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
702     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
703     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
704     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
705     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
706     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
707     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
708     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
709     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
710     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
711     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
712     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
713
714     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
715     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
716     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
717     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
718     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
719     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
720     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
721     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
722     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
723     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
724     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
725     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
726     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
727     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
728     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
729     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
730
731     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
732     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
733     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
734     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
735     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
736     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
737     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
738     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
739     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
740     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
741     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
742     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
743     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
744     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
745
746     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
747
748     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
749     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
750
751     a += MD4M_A;
752     b += MD4M_B;
753     c += MD4M_C;
754     d += MD4M_D;
755
756     /**
757      * DES1
758      */
759
760     u32 key[2];
761
762     transform_netntlmv1_key (a, b, key);
763
764     u32 Kc[16];
765     u32 Kd[16];
766
767     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
768
769     u32 iv1[2];
770
771     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
772
773     /**
774      * DES2
775      */
776
777     /*
778     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
779
780     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
781
782     u32 iv2[2];
783
784     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
785     */
786
787     u32 iv2[2];
788
789     iv2[0] = search[2];
790     iv2[1] = search[3];
791
792     /**
793      * compare
794      */
795
796     const u32 r0 = iv1[0];
797     const u32 r1 = iv1[1];
798     const u32 r2 = iv2[0];
799     const u32 r3 = iv2[1];
800
801     #include COMPARE_S
802   }
803 }
804
805 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
806 {
807   /**
808    * base
809    */
810
811   const u32 gid = get_global_id (0);
812   const u32 lid = get_local_id (0);
813
814   u32 w[16];
815
816   w[ 0] = pws[gid].i[ 0];
817   w[ 1] = pws[gid].i[ 1];
818   w[ 2] = pws[gid].i[ 2];
819   w[ 3] = pws[gid].i[ 3];
820   w[ 4] = 0;
821   w[ 5] = 0;
822   w[ 6] = 0;
823   w[ 7] = 0;
824   w[ 8] = 0;
825   w[ 9] = 0;
826   w[10] = 0;
827   w[11] = 0;
828   w[12] = 0;
829   w[13] = 0;
830   w[14] = pws[gid].i[14];
831   w[15] = 0;
832
833   const u32 pw_len = pws[gid].pw_len;
834
835   /**
836    * sbox, kbox
837    */
838
839   __local u32 s_SPtrans[8][64];
840   __local u32 s_skb[8][64];
841
842   s_SPtrans[0][lid] = c_SPtrans[0][lid];
843   s_SPtrans[1][lid] = c_SPtrans[1][lid];
844   s_SPtrans[2][lid] = c_SPtrans[2][lid];
845   s_SPtrans[3][lid] = c_SPtrans[3][lid];
846   s_SPtrans[4][lid] = c_SPtrans[4][lid];
847   s_SPtrans[5][lid] = c_SPtrans[5][lid];
848   s_SPtrans[6][lid] = c_SPtrans[6][lid];
849   s_SPtrans[7][lid] = c_SPtrans[7][lid];
850
851   s_skb[0][lid] = c_skb[0][lid];
852   s_skb[1][lid] = c_skb[1][lid];
853   s_skb[2][lid] = c_skb[2][lid];
854   s_skb[3][lid] = c_skb[3][lid];
855   s_skb[4][lid] = c_skb[4][lid];
856   s_skb[5][lid] = c_skb[5][lid];
857   s_skb[6][lid] = c_skb[6][lid];
858   s_skb[7][lid] = c_skb[7][lid];
859
860   barrier (CLK_LOCAL_MEM_FENCE);
861
862   if (gid >= gid_max) return;
863
864   /**
865    * main
866    */
867
868   m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
869 }
870
871 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
872 {
873   /**
874    * base
875    */
876
877   const u32 gid = get_global_id (0);
878   const u32 lid = get_local_id (0);
879
880   u32 w[16];
881
882   w[ 0] = pws[gid].i[ 0];
883   w[ 1] = pws[gid].i[ 1];
884   w[ 2] = pws[gid].i[ 2];
885   w[ 3] = pws[gid].i[ 3];
886   w[ 4] = pws[gid].i[ 4];
887   w[ 5] = pws[gid].i[ 5];
888   w[ 6] = pws[gid].i[ 6];
889   w[ 7] = pws[gid].i[ 7];
890   w[ 8] = 0;
891   w[ 9] = 0;
892   w[10] = 0;
893   w[11] = 0;
894   w[12] = 0;
895   w[13] = 0;
896   w[14] = pws[gid].i[14];
897   w[15] = 0;
898
899   const u32 pw_len = pws[gid].pw_len;
900
901   /**
902    * sbox, kbox
903    */
904
905   __local u32 s_SPtrans[8][64];
906   __local u32 s_skb[8][64];
907
908   s_SPtrans[0][lid] = c_SPtrans[0][lid];
909   s_SPtrans[1][lid] = c_SPtrans[1][lid];
910   s_SPtrans[2][lid] = c_SPtrans[2][lid];
911   s_SPtrans[3][lid] = c_SPtrans[3][lid];
912   s_SPtrans[4][lid] = c_SPtrans[4][lid];
913   s_SPtrans[5][lid] = c_SPtrans[5][lid];
914   s_SPtrans[6][lid] = c_SPtrans[6][lid];
915   s_SPtrans[7][lid] = c_SPtrans[7][lid];
916
917   s_skb[0][lid] = c_skb[0][lid];
918   s_skb[1][lid] = c_skb[1][lid];
919   s_skb[2][lid] = c_skb[2][lid];
920   s_skb[3][lid] = c_skb[3][lid];
921   s_skb[4][lid] = c_skb[4][lid];
922   s_skb[5][lid] = c_skb[5][lid];
923   s_skb[6][lid] = c_skb[6][lid];
924   s_skb[7][lid] = c_skb[7][lid];
925
926   barrier (CLK_LOCAL_MEM_FENCE);
927
928   if (gid >= gid_max) return;
929
930   /**
931    * main
932    */
933
934   m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
935 }
936
937 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
938 {
939 }
940
941 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
942 {
943   /**
944    * base
945    */
946
947   const u32 gid = get_global_id (0);
948   const u32 lid = get_local_id (0);
949
950   u32 w[16];
951
952   w[ 0] = pws[gid].i[ 0];
953   w[ 1] = pws[gid].i[ 1];
954   w[ 2] = pws[gid].i[ 2];
955   w[ 3] = pws[gid].i[ 3];
956   w[ 4] = 0;
957   w[ 5] = 0;
958   w[ 6] = 0;
959   w[ 7] = 0;
960   w[ 8] = 0;
961   w[ 9] = 0;
962   w[10] = 0;
963   w[11] = 0;
964   w[12] = 0;
965   w[13] = 0;
966   w[14] = pws[gid].i[14];
967   w[15] = 0;
968
969   const u32 pw_len = pws[gid].pw_len;
970
971   /**
972    * sbox, kbox
973    */
974
975   __local u32 s_SPtrans[8][64];
976   __local u32 s_skb[8][64];
977
978   s_SPtrans[0][lid] = c_SPtrans[0][lid];
979   s_SPtrans[1][lid] = c_SPtrans[1][lid];
980   s_SPtrans[2][lid] = c_SPtrans[2][lid];
981   s_SPtrans[3][lid] = c_SPtrans[3][lid];
982   s_SPtrans[4][lid] = c_SPtrans[4][lid];
983   s_SPtrans[5][lid] = c_SPtrans[5][lid];
984   s_SPtrans[6][lid] = c_SPtrans[6][lid];
985   s_SPtrans[7][lid] = c_SPtrans[7][lid];
986
987   s_skb[0][lid] = c_skb[0][lid];
988   s_skb[1][lid] = c_skb[1][lid];
989   s_skb[2][lid] = c_skb[2][lid];
990   s_skb[3][lid] = c_skb[3][lid];
991   s_skb[4][lid] = c_skb[4][lid];
992   s_skb[5][lid] = c_skb[5][lid];
993   s_skb[6][lid] = c_skb[6][lid];
994   s_skb[7][lid] = c_skb[7][lid];
995
996   barrier (CLK_LOCAL_MEM_FENCE);
997
998   if (gid >= gid_max) return;
999
1000   /**
1001    * main
1002    */
1003
1004   m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
1005 }
1006
1007 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1008 {
1009   /**
1010    * base
1011    */
1012
1013   const u32 gid = get_global_id (0);
1014   const u32 lid = get_local_id (0);
1015
1016   u32 w[16];
1017
1018   w[ 0] = pws[gid].i[ 0];
1019   w[ 1] = pws[gid].i[ 1];
1020   w[ 2] = pws[gid].i[ 2];
1021   w[ 3] = pws[gid].i[ 3];
1022   w[ 4] = pws[gid].i[ 4];
1023   w[ 5] = pws[gid].i[ 5];
1024   w[ 6] = pws[gid].i[ 6];
1025   w[ 7] = pws[gid].i[ 7];
1026   w[ 8] = 0;
1027   w[ 9] = 0;
1028   w[10] = 0;
1029   w[11] = 0;
1030   w[12] = 0;
1031   w[13] = 0;
1032   w[14] = pws[gid].i[14];
1033   w[15] = 0;
1034
1035   const u32 pw_len = pws[gid].pw_len;
1036
1037   /**
1038    * sbox, kbox
1039    */
1040
1041   __local u32 s_SPtrans[8][64];
1042   __local u32 s_skb[8][64];
1043
1044   s_SPtrans[0][lid] = c_SPtrans[0][lid];
1045   s_SPtrans[1][lid] = c_SPtrans[1][lid];
1046   s_SPtrans[2][lid] = c_SPtrans[2][lid];
1047   s_SPtrans[3][lid] = c_SPtrans[3][lid];
1048   s_SPtrans[4][lid] = c_SPtrans[4][lid];
1049   s_SPtrans[5][lid] = c_SPtrans[5][lid];
1050   s_SPtrans[6][lid] = c_SPtrans[6][lid];
1051   s_SPtrans[7][lid] = c_SPtrans[7][lid];
1052
1053   s_skb[0][lid] = c_skb[0][lid];
1054   s_skb[1][lid] = c_skb[1][lid];
1055   s_skb[2][lid] = c_skb[2][lid];
1056   s_skb[3][lid] = c_skb[3][lid];
1057   s_skb[4][lid] = c_skb[4][lid];
1058   s_skb[5][lid] = c_skb[5][lid];
1059   s_skb[6][lid] = c_skb[6][lid];
1060   s_skb[7][lid] = c_skb[7][lid];
1061
1062   barrier (CLK_LOCAL_MEM_FENCE);
1063
1064   if (gid >= gid_max) return;
1065
1066   /**
1067    * main
1068    */
1069
1070   m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
1071 }
1072
1073 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1074 {
1075 }