Converted _a3 kernels, use SIMD for CPU and GPU
[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 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21 #include "OpenCL/simd.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 #if   VECT_SIZE == 1
340 #define BOX(i,n,S) (S)[(n)][(i)]
341 #elif VECT_SIZE == 2
342 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
343 #elif VECT_SIZE == 4
344 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
345 #elif VECT_SIZE == 8
346 #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])
347 #endif
348
349 static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64])
350 {
351   u32x r = data[0];
352   u32x l = data[1];
353
354   #pragma unroll 16
355   for (u32 i = 0; i < 16; i += 2)
356   {
357     u32x u;
358     u32x t;
359
360     u = Kc[i + 0] ^ rotl32 (r, 30u);
361     t = Kd[i + 0] ^ rotl32 (r, 26u);
362
363     l ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
364        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
365        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
366        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
367        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
368        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
369        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
370        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
371
372     u = Kc[i + 1] ^ rotl32 (l, 30u);
373     t = Kd[i + 1] ^ rotl32 (l, 26u);
374
375     r ^= BOX (((u >>  0) & 0x3f), 0, s_SPtrans)
376        | BOX (((u >>  8) & 0x3f), 2, s_SPtrans)
377        | BOX (((u >> 16) & 0x3f), 4, s_SPtrans)
378        | BOX (((u >> 24) & 0x3f), 6, s_SPtrans)
379        | BOX (((t >>  0) & 0x3f), 1, s_SPtrans)
380        | BOX (((t >>  8) & 0x3f), 3, s_SPtrans)
381        | BOX (((t >> 16) & 0x3f), 5, s_SPtrans)
382        | BOX (((t >> 24) & 0x3f), 7, s_SPtrans);
383   }
384
385   iv[0] = l;
386   iv[1] = r;
387 }
388
389 static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64])
390 {
391   u32x tt;
392
393   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
394   HPERM_OP (c,    tt, 2, 0xcccc0000);
395   HPERM_OP (d,    tt, 2, 0xcccc0000);
396   PERM_OP  (d, c, tt, 1, 0x55555555);
397   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
398   PERM_OP  (d, c, tt, 1, 0x55555555);
399
400   d = ((d & 0x000000ff) << 16)
401     | ((d & 0x0000ff00) <<  0)
402     | ((d & 0x00ff0000) >> 16)
403     | ((c & 0xf0000000) >>  4);
404
405   c = c & 0x0fffffff;
406
407   #pragma unroll 16
408   for (u32 i = 0; i < 16; i++)
409   {
410     if ((i < 2) || (i == 8) || (i == 15))
411     {
412       c = ((c >> 1) | (c << 27));
413       d = ((d >> 1) | (d << 27));
414     }
415     else
416     {
417       c = ((c >> 2) | (c << 26));
418       d = ((d >> 2) | (d << 26));
419     }
420
421     c = c & 0x0fffffff;
422     d = d & 0x0fffffff;
423
424     const u32x c00 = (c >>  0) & 0x0000003f;
425     const u32x c06 = (c >>  6) & 0x00383003;
426     const u32x c07 = (c >>  7) & 0x0000003c;
427     const u32x c13 = (c >> 13) & 0x0000060f;
428     const u32x c20 = (c >> 20) & 0x00000001;
429
430     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
431            | BOX (((c06 >>  0) & 0xff)
432                  |((c07 >>  0) & 0xff), 1, s_skb)
433            | BOX (((c13 >>  0) & 0xff)
434                  |((c06 >>  8) & 0xff), 2, s_skb)
435            | BOX (((c20 >>  0) & 0xff)
436                  |((c13 >>  8) & 0xff)
437                  |((c06 >> 16) & 0xff), 3, s_skb);
438
439     const u32x d00 = (d >>  0) & 0x00003c3f;
440     const u32x d07 = (d >>  7) & 0x00003f03;
441     const u32x d21 = (d >> 21) & 0x0000000f;
442     const u32x d22 = (d >> 22) & 0x00000030;
443
444     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
445            | BOX (((d07 >>  0) & 0xff)
446                  |((d00 >>  8) & 0xff), 5, s_skb)
447            | BOX (((d07 >>  8) & 0xff), 6, s_skb)
448            | BOX (((d21 >>  0) & 0xff)
449                  |((d22 >>  0) & 0xff), 7, s_skb);
450
451     Kc[i] = ((t << 16) | (s & 0x0000ffff));
452     Kd[i] = ((s >> 16) | (t & 0xffff0000));
453   }
454 }
455
456 static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2])
457 {
458   u32x t[8];
459
460   t[0] = (w0 >>  0) & 0xff;
461   t[1] = (w0 >>  8) & 0xff;
462   t[2] = (w0 >> 16) & 0xff;
463   t[3] = (w0 >> 24) & 0xff;
464   t[4] = (w1 >>  0) & 0xff;
465   t[5] = (w1 >>  8) & 0xff;
466   t[6] = (w1 >> 16) & 0xff;
467   t[7] = (w1 >> 24) & 0xff;
468
469   u32x k[8];
470
471   k[0] =               (t[0] >> 0);
472   k[1] = (t[0] << 7) | (t[1] >> 1);
473   k[2] = (t[1] << 6) | (t[2] >> 2);
474   k[3] = (t[2] << 5) | (t[3] >> 3);
475   k[4] = (t[3] << 4) | (t[4] >> 4);
476   k[5] = (t[4] << 3) | (t[5] >> 5);
477   k[6] = (t[5] << 2) | (t[6] >> 6);
478   k[7] = (t[6] << 1);
479
480   out[0] = ((k[0] & 0xff) <<  0)
481          | ((k[1] & 0xff) <<  8)
482          | ((k[2] & 0xff) << 16)
483          | ((k[3] & 0xff) << 24);
484
485   out[1] = ((k[4] & 0xff) <<  0)
486          | ((k[5] & 0xff) <<  8)
487          | ((k[6] & 0xff) << 16)
488          | ((k[7] & 0xff) << 24);
489 }
490
491 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 kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
492 {
493   /**
494    * modifier
495    */
496
497   const u32 gid = get_global_id (0);
498   const u32 lid = get_local_id (0);
499
500   /**
501    * salt
502    */
503
504   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
505   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
506   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
507
508   /**
509    * loop
510    */
511
512   u32 w0l = w[0];
513
514   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
515   {
516     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
517
518     const u32x w0 = w0l | w0r;
519
520     u32x a = MD4M_A;
521     u32x b = MD4M_B;
522     u32x c = MD4M_C;
523     u32x d = MD4M_D;
524
525     #define w0_t w0
526     #define w1_t w[ 1]
527     #define w2_t w[ 2]
528     #define w3_t w[ 3]
529     #define w4_t w[ 4]
530     #define w5_t w[ 5]
531     #define w6_t w[ 6]
532     #define w7_t w[ 7]
533     #define w8_t w[ 8]
534     #define w9_t w[ 9]
535     #define wa_t w[10]
536     #define wb_t w[11]
537     #define wc_t w[12]
538     #define wd_t w[13]
539     #define we_t w[14]
540     #define wf_t w[15]
541
542     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
543     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
544     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
545     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
546     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
547     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
548     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
549     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
550     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
551     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
552     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
553     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
554     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
555     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
556     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
557     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
558
559     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
560     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
561     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
562     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
563     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
564     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
565     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
566     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
567     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
568     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
569     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
570     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
571     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
572     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
573     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
574     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
575
576     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
577     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
578     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
579     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
580     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
581     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
582     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
583     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
584     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
585     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
586     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
587     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
588     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
589     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
590
591     if (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) continue;
592
593     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
594     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
595
596     a += MD4M_A;
597     b += MD4M_B;
598     c += MD4M_C;
599     d += MD4M_D;
600
601     /**
602      * DES1
603      */
604
605     u32x key[2];
606
607     transform_netntlmv1_key (a, b, key);
608
609     u32x Kc[16];
610     u32x Kd[16];
611
612     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
613
614     u32x data[2];
615
616     data[0] = s0;
617     data[1] = s1;
618
619     u32x iv1[2];
620
621     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
622
623     /**
624      * DES2
625      */
626
627     const u32x bc = (b >> 24) | (c << 8);
628     const u32x cd = (c >> 24) | (d << 8);
629
630     transform_netntlmv1_key (bc, cd, key);
631
632     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
633
634     u32x iv2[2];
635
636     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
637
638     /**
639      * compare
640      */
641
642     COMPARE_M_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]);
643   }
644 }
645
646 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 kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
647 {
648   /**
649    * modifier
650    */
651
652   const u32 gid = get_global_id (0);
653   const u32 lid = get_local_id (0);
654
655   /**
656    * salt
657    */
658
659   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
660   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
661   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
662
663   /**
664    * digest
665    */
666
667   const u32 search[4] =
668   {
669     digests_buf[digests_offset].digest_buf[DGST_R0],
670     digests_buf[digests_offset].digest_buf[DGST_R1],
671     digests_buf[digests_offset].digest_buf[DGST_R2],
672     digests_buf[digests_offset].digest_buf[DGST_R3]
673   };
674
675   /**
676    * loop
677    */
678
679   u32 w0l = w[0];
680
681   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
682   {
683     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
684
685     const u32x w0 = w0l | w0r;
686
687     u32x a = MD4M_A;
688     u32x b = MD4M_B;
689     u32x c = MD4M_C;
690     u32x d = MD4M_D;
691
692     #define w0_t w0
693     #define w1_t w[ 1]
694     #define w2_t w[ 2]
695     #define w3_t w[ 3]
696     #define w4_t w[ 4]
697     #define w5_t w[ 5]
698     #define w6_t w[ 6]
699     #define w7_t w[ 7]
700     #define w8_t w[ 8]
701     #define w9_t w[ 9]
702     #define wa_t w[10]
703     #define wb_t w[11]
704     #define wc_t w[12]
705     #define wd_t w[13]
706     #define we_t w[14]
707     #define wf_t w[15]
708
709     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
710     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
711     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
712     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
713     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
714     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
715     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
716     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
717     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
718     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
719     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
720     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
721     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
722     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
723     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
724     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
725
726     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
727     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
728     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
729     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
730     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
731     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
732     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
733     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
734     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
735     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
736     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
737     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
738     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
739     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
740     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
741     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
742
743     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
744     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
745     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
746     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
747     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
748     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
749     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
750     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
751     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
752     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
753     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
754     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
755     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
756     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
757
758     if (MATCHES_NONE_VS (((d + MD4M_D) >> 16), s2)) continue;
759
760     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
761     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
762
763     a += MD4M_A;
764     b += MD4M_B;
765     c += MD4M_C;
766     d += MD4M_D;
767
768     /**
769      * DES1
770      */
771
772     u32x key[2];
773
774     transform_netntlmv1_key (a, b, key);
775
776     u32x Kc[16];
777     u32x Kd[16];
778
779     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
780
781     u32x data[2];
782
783     data[0] = s0;
784     data[1] = s1;
785
786     u32x iv1[2];
787
788     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
789
790     /**
791      * DES2
792      */
793
794     /*
795     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
796
797     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
798
799     u32x iv2[2];
800
801     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
802     */
803
804     u32x iv2[2];
805
806     iv2[0] = search[2];
807     iv2[1] = search[3];
808
809     /**
810      * compare
811      */
812
813     COMPARE_S_SIMD (iv1[0], iv1[1], iv2[0], iv2[1]);
814   }
815 }
816
817 __kernel void m05500_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
818 {
819   /**
820    * modifier
821    */
822
823   const u32 gid = get_global_id (0);
824   const u32 lid = get_local_id (0);
825   const u32 lsz = get_local_size (0);
826
827   /**
828    * sbox, kbox
829    */
830
831   __local u32 s_SPtrans[8][64];
832   __local u32 s_skb[8][64];
833
834   for (u32 i = lid; i < 64; i += lsz)
835   {
836     s_SPtrans[0][i] = c_SPtrans[0][i];
837     s_SPtrans[1][i] = c_SPtrans[1][i];
838     s_SPtrans[2][i] = c_SPtrans[2][i];
839     s_SPtrans[3][i] = c_SPtrans[3][i];
840     s_SPtrans[4][i] = c_SPtrans[4][i];
841     s_SPtrans[5][i] = c_SPtrans[5][i];
842     s_SPtrans[6][i] = c_SPtrans[6][i];
843     s_SPtrans[7][i] = c_SPtrans[7][i];
844
845     s_skb[0][i] = c_skb[0][i];
846     s_skb[1][i] = c_skb[1][i];
847     s_skb[2][i] = c_skb[2][i];
848     s_skb[3][i] = c_skb[3][i];
849     s_skb[4][i] = c_skb[4][i];
850     s_skb[5][i] = c_skb[5][i];
851     s_skb[6][i] = c_skb[6][i];
852     s_skb[7][i] = c_skb[7][i];
853   }
854
855   barrier (CLK_LOCAL_MEM_FENCE);
856
857   if (gid >= gid_max) return;
858
859   /**
860    * base
861    */
862
863   u32 w[16];
864
865   w[ 0] = pws[gid].i[ 0];
866   w[ 1] = pws[gid].i[ 1];
867   w[ 2] = pws[gid].i[ 2];
868   w[ 3] = pws[gid].i[ 3];
869   w[ 4] = 0;
870   w[ 5] = 0;
871   w[ 6] = 0;
872   w[ 7] = 0;
873   w[ 8] = 0;
874   w[ 9] = 0;
875   w[10] = 0;
876   w[11] = 0;
877   w[12] = 0;
878   w[13] = 0;
879   w[14] = pws[gid].i[14];
880   w[15] = 0;
881
882   const u32 pw_len = pws[gid].pw_len;
883
884   /**
885    * main
886    */
887
888   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);
889 }
890
891 __kernel void m05500_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
892 {
893   /**
894    * modifier
895    */
896
897   const u32 gid = get_global_id (0);
898   const u32 lid = get_local_id (0);
899   const u32 lsz = get_local_size (0);
900
901   /**
902    * sbox, kbox
903    */
904
905   __local u32 s_SPtrans[8][64];
906   __local u32 s_skb[8][64];
907
908   for (u32 i = lid; i < 64; i += lsz)
909   {
910     s_SPtrans[0][i] = c_SPtrans[0][i];
911     s_SPtrans[1][i] = c_SPtrans[1][i];
912     s_SPtrans[2][i] = c_SPtrans[2][i];
913     s_SPtrans[3][i] = c_SPtrans[3][i];
914     s_SPtrans[4][i] = c_SPtrans[4][i];
915     s_SPtrans[5][i] = c_SPtrans[5][i];
916     s_SPtrans[6][i] = c_SPtrans[6][i];
917     s_SPtrans[7][i] = c_SPtrans[7][i];
918
919     s_skb[0][i] = c_skb[0][i];
920     s_skb[1][i] = c_skb[1][i];
921     s_skb[2][i] = c_skb[2][i];
922     s_skb[3][i] = c_skb[3][i];
923     s_skb[4][i] = c_skb[4][i];
924     s_skb[5][i] = c_skb[5][i];
925     s_skb[6][i] = c_skb[6][i];
926     s_skb[7][i] = c_skb[7][i];
927   }
928
929   barrier (CLK_LOCAL_MEM_FENCE);
930
931   if (gid >= gid_max) return;
932
933   /**
934    * base
935    */
936
937   u32 w[16];
938
939   w[ 0] = pws[gid].i[ 0];
940   w[ 1] = pws[gid].i[ 1];
941   w[ 2] = pws[gid].i[ 2];
942   w[ 3] = pws[gid].i[ 3];
943   w[ 4] = pws[gid].i[ 4];
944   w[ 5] = pws[gid].i[ 5];
945   w[ 6] = pws[gid].i[ 6];
946   w[ 7] = pws[gid].i[ 7];
947   w[ 8] = 0;
948   w[ 9] = 0;
949   w[10] = 0;
950   w[11] = 0;
951   w[12] = 0;
952   w[13] = 0;
953   w[14] = pws[gid].i[14];
954   w[15] = 0;
955
956   const u32 pw_len = pws[gid].pw_len;
957
958   /**
959    * main
960    */
961
962   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);
963 }
964
965 __kernel void m05500_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
966 {
967 }
968
969 __kernel void m05500_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
970 {
971   /**
972    * modifier
973    */
974
975   const u32 gid = get_global_id (0);
976   const u32 lid = get_local_id (0);
977   const u32 lsz = get_local_size (0);
978
979   /**
980    * sbox, kbox
981    */
982
983   __local u32 s_SPtrans[8][64];
984   __local u32 s_skb[8][64];
985
986   for (u32 i = lid; i < 64; i += lsz)
987   {
988     s_SPtrans[0][i] = c_SPtrans[0][i];
989     s_SPtrans[1][i] = c_SPtrans[1][i];
990     s_SPtrans[2][i] = c_SPtrans[2][i];
991     s_SPtrans[3][i] = c_SPtrans[3][i];
992     s_SPtrans[4][i] = c_SPtrans[4][i];
993     s_SPtrans[5][i] = c_SPtrans[5][i];
994     s_SPtrans[6][i] = c_SPtrans[6][i];
995     s_SPtrans[7][i] = c_SPtrans[7][i];
996
997     s_skb[0][i] = c_skb[0][i];
998     s_skb[1][i] = c_skb[1][i];
999     s_skb[2][i] = c_skb[2][i];
1000     s_skb[3][i] = c_skb[3][i];
1001     s_skb[4][i] = c_skb[4][i];
1002     s_skb[5][i] = c_skb[5][i];
1003     s_skb[6][i] = c_skb[6][i];
1004     s_skb[7][i] = c_skb[7][i];
1005   }
1006
1007   barrier (CLK_LOCAL_MEM_FENCE);
1008
1009   if (gid >= gid_max) return;
1010
1011   /**
1012    * base
1013    */
1014
1015   u32 w[16];
1016
1017   w[ 0] = pws[gid].i[ 0];
1018   w[ 1] = pws[gid].i[ 1];
1019   w[ 2] = pws[gid].i[ 2];
1020   w[ 3] = pws[gid].i[ 3];
1021   w[ 4] = 0;
1022   w[ 5] = 0;
1023   w[ 6] = 0;
1024   w[ 7] = 0;
1025   w[ 8] = 0;
1026   w[ 9] = 0;
1027   w[10] = 0;
1028   w[11] = 0;
1029   w[12] = 0;
1030   w[13] = 0;
1031   w[14] = pws[gid].i[14];
1032   w[15] = 0;
1033
1034   const u32 pw_len = pws[gid].pw_len;
1035
1036   /**
1037    * main
1038    */
1039
1040   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);
1041 }
1042
1043 __kernel void m05500_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
1044 {
1045   /**
1046    * modifier
1047    */
1048
1049   const u32 gid = get_global_id (0);
1050   const u32 lid = get_local_id (0);
1051   const u32 lsz = get_local_size (0);
1052
1053   /**
1054    * sbox, kbox
1055    */
1056
1057   __local u32 s_SPtrans[8][64];
1058   __local u32 s_skb[8][64];
1059
1060   for (u32 i = lid; i < 64; i += lsz)
1061   {
1062     s_SPtrans[0][i] = c_SPtrans[0][i];
1063     s_SPtrans[1][i] = c_SPtrans[1][i];
1064     s_SPtrans[2][i] = c_SPtrans[2][i];
1065     s_SPtrans[3][i] = c_SPtrans[3][i];
1066     s_SPtrans[4][i] = c_SPtrans[4][i];
1067     s_SPtrans[5][i] = c_SPtrans[5][i];
1068     s_SPtrans[6][i] = c_SPtrans[6][i];
1069     s_SPtrans[7][i] = c_SPtrans[7][i];
1070
1071     s_skb[0][i] = c_skb[0][i];
1072     s_skb[1][i] = c_skb[1][i];
1073     s_skb[2][i] = c_skb[2][i];
1074     s_skb[3][i] = c_skb[3][i];
1075     s_skb[4][i] = c_skb[4][i];
1076     s_skb[5][i] = c_skb[5][i];
1077     s_skb[6][i] = c_skb[6][i];
1078     s_skb[7][i] = c_skb[7][i];
1079   }
1080
1081   barrier (CLK_LOCAL_MEM_FENCE);
1082
1083   if (gid >= gid_max) return;
1084
1085   /**
1086    * base
1087    */
1088
1089   u32 w[16];
1090
1091   w[ 0] = pws[gid].i[ 0];
1092   w[ 1] = pws[gid].i[ 1];
1093   w[ 2] = pws[gid].i[ 2];
1094   w[ 3] = pws[gid].i[ 3];
1095   w[ 4] = pws[gid].i[ 4];
1096   w[ 5] = pws[gid].i[ 5];
1097   w[ 6] = pws[gid].i[ 6];
1098   w[ 7] = pws[gid].i[ 7];
1099   w[ 8] = 0;
1100   w[ 9] = 0;
1101   w[10] = 0;
1102   w[11] = 0;
1103   w[12] = 0;
1104   w[13] = 0;
1105   w[14] = pws[gid].i[14];
1106   w[15] = 0;
1107
1108   const u32 pw_len = pws[gid].pw_len;
1109
1110   /**
1111    * main
1112    */
1113
1114   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);
1115 }
1116
1117 __kernel void m05500_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * 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)
1118 {
1119 }