Merge pull request #148 from gm4tr1x/md5apr1_warnings
[hashcat.git] / OpenCL / m03100_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _DES_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 0
12 #define DGST_R1 1
13 #define DGST_R2 2
14 #define DGST_R3 3
15
16 #include "include/kernel_functions.c"
17 #include "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19 #include "include/rp_kernel.h"
20 #include "OpenCL/rp.c"
21
22 #define COMPARE_S "OpenCL/check_single_comp4.c"
23 #define COMPARE_M "OpenCL/check_multi_comp4.c"
24
25 #define PERM_OP(a,b,tt,n,m) \
26 {                           \
27   tt = a >> n;              \
28   tt = tt ^ b;              \
29   tt = tt & m;              \
30   b = b ^ tt;               \
31   tt = tt << n;             \
32   a = a ^ tt;               \
33 }
34
35 #define HPERM_OP(a,tt,n,m)  \
36 {                           \
37   tt = a << (16 + n);       \
38   tt = tt ^ a;              \
39   tt = tt & m;              \
40   a  = a ^ tt;              \
41   tt = tt >> (16 + n);      \
42   a  = a ^ tt;              \
43 }
44
45 #define IP(l,r,tt)                     \
46 {                                      \
47   PERM_OP (r, l, tt,  4, 0x0f0f0f0f);  \
48   PERM_OP (l, r, tt, 16, 0x0000ffff);  \
49   PERM_OP (r, l, tt,  2, 0x33333333);  \
50   PERM_OP (l, r, tt,  8, 0x00ff00ff);  \
51   PERM_OP (r, l, tt,  1, 0x55555555);  \
52 }
53
54 #define FP(l,r,tt)                     \
55 {                                      \
56   PERM_OP (l, r, tt,  1, 0x55555555);  \
57   PERM_OP (r, l, tt,  8, 0x00ff00ff);  \
58   PERM_OP (l, r, tt,  2, 0x33333333);  \
59   PERM_OP (r, l, tt, 16, 0x0000ffff);  \
60   PERM_OP (l, r, tt,  4, 0x0f0f0f0f);  \
61 }
62
63 __constant u32 c_SPtrans[8][64] =
64 {
65   {
66     0x02080800, 0x00080000, 0x02000002, 0x02080802,
67     0x02000000, 0x00080802, 0x00080002, 0x02000002,
68     0x00080802, 0x02080800, 0x02080000, 0x00000802,
69     0x02000802, 0x02000000, 0x00000000, 0x00080002,
70     0x00080000, 0x00000002, 0x02000800, 0x00080800,
71     0x02080802, 0x02080000, 0x00000802, 0x02000800,
72     0x00000002, 0x00000800, 0x00080800, 0x02080002,
73     0x00000800, 0x02000802, 0x02080002, 0x00000000,
74     0x00000000, 0x02080802, 0x02000800, 0x00080002,
75     0x02080800, 0x00080000, 0x00000802, 0x02000800,
76     0x02080002, 0x00000800, 0x00080800, 0x02000002,
77     0x00080802, 0x00000002, 0x02000002, 0x02080000,
78     0x02080802, 0x00080800, 0x02080000, 0x02000802,
79     0x02000000, 0x00000802, 0x00080002, 0x00000000,
80     0x00080000, 0x02000000, 0x02000802, 0x02080800,
81     0x00000002, 0x02080002, 0x00000800, 0x00080802,
82   },
83   {
84     0x40108010, 0x00000000, 0x00108000, 0x40100000,
85     0x40000010, 0x00008010, 0x40008000, 0x00108000,
86     0x00008000, 0x40100010, 0x00000010, 0x40008000,
87     0x00100010, 0x40108000, 0x40100000, 0x00000010,
88     0x00100000, 0x40008010, 0x40100010, 0x00008000,
89     0x00108010, 0x40000000, 0x00000000, 0x00100010,
90     0x40008010, 0x00108010, 0x40108000, 0x40000010,
91     0x40000000, 0x00100000, 0x00008010, 0x40108010,
92     0x00100010, 0x40108000, 0x40008000, 0x00108010,
93     0x40108010, 0x00100010, 0x40000010, 0x00000000,
94     0x40000000, 0x00008010, 0x00100000, 0x40100010,
95     0x00008000, 0x40000000, 0x00108010, 0x40008010,
96     0x40108000, 0x00008000, 0x00000000, 0x40000010,
97     0x00000010, 0x40108010, 0x00108000, 0x40100000,
98     0x40100010, 0x00100000, 0x00008010, 0x40008000,
99     0x40008010, 0x00000010, 0x40100000, 0x00108000,
100   },
101   {
102     0x04000001, 0x04040100, 0x00000100, 0x04000101,
103     0x00040001, 0x04000000, 0x04000101, 0x00040100,
104     0x04000100, 0x00040000, 0x04040000, 0x00000001,
105     0x04040101, 0x00000101, 0x00000001, 0x04040001,
106     0x00000000, 0x00040001, 0x04040100, 0x00000100,
107     0x00000101, 0x04040101, 0x00040000, 0x04000001,
108     0x04040001, 0x04000100, 0x00040101, 0x04040000,
109     0x00040100, 0x00000000, 0x04000000, 0x00040101,
110     0x04040100, 0x00000100, 0x00000001, 0x00040000,
111     0x00000101, 0x00040001, 0x04040000, 0x04000101,
112     0x00000000, 0x04040100, 0x00040100, 0x04040001,
113     0x00040001, 0x04000000, 0x04040101, 0x00000001,
114     0x00040101, 0x04000001, 0x04000000, 0x04040101,
115     0x00040000, 0x04000100, 0x04000101, 0x00040100,
116     0x04000100, 0x00000000, 0x04040001, 0x00000101,
117     0x04000001, 0x00040101, 0x00000100, 0x04040000,
118   },
119   {
120     0x00401008, 0x10001000, 0x00000008, 0x10401008,
121     0x00000000, 0x10400000, 0x10001008, 0x00400008,
122     0x10401000, 0x10000008, 0x10000000, 0x00001008,
123     0x10000008, 0x00401008, 0x00400000, 0x10000000,
124     0x10400008, 0x00401000, 0x00001000, 0x00000008,
125     0x00401000, 0x10001008, 0x10400000, 0x00001000,
126     0x00001008, 0x00000000, 0x00400008, 0x10401000,
127     0x10001000, 0x10400008, 0x10401008, 0x00400000,
128     0x10400008, 0x00001008, 0x00400000, 0x10000008,
129     0x00401000, 0x10001000, 0x00000008, 0x10400000,
130     0x10001008, 0x00000000, 0x00001000, 0x00400008,
131     0x00000000, 0x10400008, 0x10401000, 0x00001000,
132     0x10000000, 0x10401008, 0x00401008, 0x00400000,
133     0x10401008, 0x00000008, 0x10001000, 0x00401008,
134     0x00400008, 0x00401000, 0x10400000, 0x10001008,
135     0x00001008, 0x10000000, 0x10000008, 0x10401000,
136   },
137   {
138     0x08000000, 0x00010000, 0x00000400, 0x08010420,
139     0x08010020, 0x08000400, 0x00010420, 0x08010000,
140     0x00010000, 0x00000020, 0x08000020, 0x00010400,
141     0x08000420, 0x08010020, 0x08010400, 0x00000000,
142     0x00010400, 0x08000000, 0x00010020, 0x00000420,
143     0x08000400, 0x00010420, 0x00000000, 0x08000020,
144     0x00000020, 0x08000420, 0x08010420, 0x00010020,
145     0x08010000, 0x00000400, 0x00000420, 0x08010400,
146     0x08010400, 0x08000420, 0x00010020, 0x08010000,
147     0x00010000, 0x00000020, 0x08000020, 0x08000400,
148     0x08000000, 0x00010400, 0x08010420, 0x00000000,
149     0x00010420, 0x08000000, 0x00000400, 0x00010020,
150     0x08000420, 0x00000400, 0x00000000, 0x08010420,
151     0x08010020, 0x08010400, 0x00000420, 0x00010000,
152     0x00010400, 0x08010020, 0x08000400, 0x00000420,
153     0x00000020, 0x00010420, 0x08010000, 0x08000020,
154   },
155   {
156     0x80000040, 0x00200040, 0x00000000, 0x80202000,
157     0x00200040, 0x00002000, 0x80002040, 0x00200000,
158     0x00002040, 0x80202040, 0x00202000, 0x80000000,
159     0x80002000, 0x80000040, 0x80200000, 0x00202040,
160     0x00200000, 0x80002040, 0x80200040, 0x00000000,
161     0x00002000, 0x00000040, 0x80202000, 0x80200040,
162     0x80202040, 0x80200000, 0x80000000, 0x00002040,
163     0x00000040, 0x00202000, 0x00202040, 0x80002000,
164     0x00002040, 0x80000000, 0x80002000, 0x00202040,
165     0x80202000, 0x00200040, 0x00000000, 0x80002000,
166     0x80000000, 0x00002000, 0x80200040, 0x00200000,
167     0x00200040, 0x80202040, 0x00202000, 0x00000040,
168     0x80202040, 0x00202000, 0x00200000, 0x80002040,
169     0x80000040, 0x80200000, 0x00202040, 0x00000000,
170     0x00002000, 0x80000040, 0x80002040, 0x80202000,
171     0x80200000, 0x00002040, 0x00000040, 0x80200040,
172   },
173   {
174     0x00004000, 0x00000200, 0x01000200, 0x01000004,
175     0x01004204, 0x00004004, 0x00004200, 0x00000000,
176     0x01000000, 0x01000204, 0x00000204, 0x01004000,
177     0x00000004, 0x01004200, 0x01004000, 0x00000204,
178     0x01000204, 0x00004000, 0x00004004, 0x01004204,
179     0x00000000, 0x01000200, 0x01000004, 0x00004200,
180     0x01004004, 0x00004204, 0x01004200, 0x00000004,
181     0x00004204, 0x01004004, 0x00000200, 0x01000000,
182     0x00004204, 0x01004000, 0x01004004, 0x00000204,
183     0x00004000, 0x00000200, 0x01000000, 0x01004004,
184     0x01000204, 0x00004204, 0x00004200, 0x00000000,
185     0x00000200, 0x01000004, 0x00000004, 0x01000200,
186     0x00000000, 0x01000204, 0x01000200, 0x00004200,
187     0x00000204, 0x00004000, 0x01004204, 0x01000000,
188     0x01004200, 0x00000004, 0x00004004, 0x01004204,
189     0x01000004, 0x01004200, 0x01004000, 0x00004004,
190   },
191   {
192     0x20800080, 0x20820000, 0x00020080, 0x00000000,
193     0x20020000, 0x00800080, 0x20800000, 0x20820080,
194     0x00000080, 0x20000000, 0x00820000, 0x00020080,
195     0x00820080, 0x20020080, 0x20000080, 0x20800000,
196     0x00020000, 0x00820080, 0x00800080, 0x20020000,
197     0x20820080, 0x20000080, 0x00000000, 0x00820000,
198     0x20000000, 0x00800000, 0x20020080, 0x20800080,
199     0x00800000, 0x00020000, 0x20820000, 0x00000080,
200     0x00800000, 0x00020000, 0x20000080, 0x20820080,
201     0x00020080, 0x20000000, 0x00000000, 0x00820000,
202     0x20800080, 0x20020080, 0x20020000, 0x00800080,
203     0x20820000, 0x00000080, 0x00800080, 0x20020000,
204     0x20820080, 0x00800000, 0x20800000, 0x20000080,
205     0x00820000, 0x00020080, 0x20020080, 0x20800000,
206     0x00000080, 0x20820000, 0x00820080, 0x00000000,
207     0x20000000, 0x20800080, 0x00020000, 0x00820080,
208   }
209 };
210
211 __constant u32 c_skb[8][64] =
212 {
213   {
214     0x00000000, 0x00000010, 0x20000000, 0x20000010,
215     0x00010000, 0x00010010, 0x20010000, 0x20010010,
216     0x00000800, 0x00000810, 0x20000800, 0x20000810,
217     0x00010800, 0x00010810, 0x20010800, 0x20010810,
218     0x00000020, 0x00000030, 0x20000020, 0x20000030,
219     0x00010020, 0x00010030, 0x20010020, 0x20010030,
220     0x00000820, 0x00000830, 0x20000820, 0x20000830,
221     0x00010820, 0x00010830, 0x20010820, 0x20010830,
222     0x00080000, 0x00080010, 0x20080000, 0x20080010,
223     0x00090000, 0x00090010, 0x20090000, 0x20090010,
224     0x00080800, 0x00080810, 0x20080800, 0x20080810,
225     0x00090800, 0x00090810, 0x20090800, 0x20090810,
226     0x00080020, 0x00080030, 0x20080020, 0x20080030,
227     0x00090020, 0x00090030, 0x20090020, 0x20090030,
228     0x00080820, 0x00080830, 0x20080820, 0x20080830,
229     0x00090820, 0x00090830, 0x20090820, 0x20090830,
230   },
231   {
232     0x00000000, 0x02000000, 0x00002000, 0x02002000,
233     0x00200000, 0x02200000, 0x00202000, 0x02202000,
234     0x00000004, 0x02000004, 0x00002004, 0x02002004,
235     0x00200004, 0x02200004, 0x00202004, 0x02202004,
236     0x00000400, 0x02000400, 0x00002400, 0x02002400,
237     0x00200400, 0x02200400, 0x00202400, 0x02202400,
238     0x00000404, 0x02000404, 0x00002404, 0x02002404,
239     0x00200404, 0x02200404, 0x00202404, 0x02202404,
240     0x10000000, 0x12000000, 0x10002000, 0x12002000,
241     0x10200000, 0x12200000, 0x10202000, 0x12202000,
242     0x10000004, 0x12000004, 0x10002004, 0x12002004,
243     0x10200004, 0x12200004, 0x10202004, 0x12202004,
244     0x10000400, 0x12000400, 0x10002400, 0x12002400,
245     0x10200400, 0x12200400, 0x10202400, 0x12202400,
246     0x10000404, 0x12000404, 0x10002404, 0x12002404,
247     0x10200404, 0x12200404, 0x10202404, 0x12202404,
248   },
249   {
250     0x00000000, 0x00000001, 0x00040000, 0x00040001,
251     0x01000000, 0x01000001, 0x01040000, 0x01040001,
252     0x00000002, 0x00000003, 0x00040002, 0x00040003,
253     0x01000002, 0x01000003, 0x01040002, 0x01040003,
254     0x00000200, 0x00000201, 0x00040200, 0x00040201,
255     0x01000200, 0x01000201, 0x01040200, 0x01040201,
256     0x00000202, 0x00000203, 0x00040202, 0x00040203,
257     0x01000202, 0x01000203, 0x01040202, 0x01040203,
258     0x08000000, 0x08000001, 0x08040000, 0x08040001,
259     0x09000000, 0x09000001, 0x09040000, 0x09040001,
260     0x08000002, 0x08000003, 0x08040002, 0x08040003,
261     0x09000002, 0x09000003, 0x09040002, 0x09040003,
262     0x08000200, 0x08000201, 0x08040200, 0x08040201,
263     0x09000200, 0x09000201, 0x09040200, 0x09040201,
264     0x08000202, 0x08000203, 0x08040202, 0x08040203,
265     0x09000202, 0x09000203, 0x09040202, 0x09040203,
266   },
267   {
268     0x00000000, 0x00100000, 0x00000100, 0x00100100,
269     0x00000008, 0x00100008, 0x00000108, 0x00100108,
270     0x00001000, 0x00101000, 0x00001100, 0x00101100,
271     0x00001008, 0x00101008, 0x00001108, 0x00101108,
272     0x04000000, 0x04100000, 0x04000100, 0x04100100,
273     0x04000008, 0x04100008, 0x04000108, 0x04100108,
274     0x04001000, 0x04101000, 0x04001100, 0x04101100,
275     0x04001008, 0x04101008, 0x04001108, 0x04101108,
276     0x00020000, 0x00120000, 0x00020100, 0x00120100,
277     0x00020008, 0x00120008, 0x00020108, 0x00120108,
278     0x00021000, 0x00121000, 0x00021100, 0x00121100,
279     0x00021008, 0x00121008, 0x00021108, 0x00121108,
280     0x04020000, 0x04120000, 0x04020100, 0x04120100,
281     0x04020008, 0x04120008, 0x04020108, 0x04120108,
282     0x04021000, 0x04121000, 0x04021100, 0x04121100,
283     0x04021008, 0x04121008, 0x04021108, 0x04121108,
284   },
285   {
286     0x00000000, 0x10000000, 0x00010000, 0x10010000,
287     0x00000004, 0x10000004, 0x00010004, 0x10010004,
288     0x20000000, 0x30000000, 0x20010000, 0x30010000,
289     0x20000004, 0x30000004, 0x20010004, 0x30010004,
290     0x00100000, 0x10100000, 0x00110000, 0x10110000,
291     0x00100004, 0x10100004, 0x00110004, 0x10110004,
292     0x20100000, 0x30100000, 0x20110000, 0x30110000,
293     0x20100004, 0x30100004, 0x20110004, 0x30110004,
294     0x00001000, 0x10001000, 0x00011000, 0x10011000,
295     0x00001004, 0x10001004, 0x00011004, 0x10011004,
296     0x20001000, 0x30001000, 0x20011000, 0x30011000,
297     0x20001004, 0x30001004, 0x20011004, 0x30011004,
298     0x00101000, 0x10101000, 0x00111000, 0x10111000,
299     0x00101004, 0x10101004, 0x00111004, 0x10111004,
300     0x20101000, 0x30101000, 0x20111000, 0x30111000,
301     0x20101004, 0x30101004, 0x20111004, 0x30111004,
302   },
303   {
304     0x00000000, 0x08000000, 0x00000008, 0x08000008,
305     0x00000400, 0x08000400, 0x00000408, 0x08000408,
306     0x00020000, 0x08020000, 0x00020008, 0x08020008,
307     0x00020400, 0x08020400, 0x00020408, 0x08020408,
308     0x00000001, 0x08000001, 0x00000009, 0x08000009,
309     0x00000401, 0x08000401, 0x00000409, 0x08000409,
310     0x00020001, 0x08020001, 0x00020009, 0x08020009,
311     0x00020401, 0x08020401, 0x00020409, 0x08020409,
312     0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
313     0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
314     0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
315     0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
316     0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
317     0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
318     0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
319     0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
320   },
321   {
322     0x00000000, 0x00000100, 0x00080000, 0x00080100,
323     0x01000000, 0x01000100, 0x01080000, 0x01080100,
324     0x00000010, 0x00000110, 0x00080010, 0x00080110,
325     0x01000010, 0x01000110, 0x01080010, 0x01080110,
326     0x00200000, 0x00200100, 0x00280000, 0x00280100,
327     0x01200000, 0x01200100, 0x01280000, 0x01280100,
328     0x00200010, 0x00200110, 0x00280010, 0x00280110,
329     0x01200010, 0x01200110, 0x01280010, 0x01280110,
330     0x00000200, 0x00000300, 0x00080200, 0x00080300,
331     0x01000200, 0x01000300, 0x01080200, 0x01080300,
332     0x00000210, 0x00000310, 0x00080210, 0x00080310,
333     0x01000210, 0x01000310, 0x01080210, 0x01080310,
334     0x00200200, 0x00200300, 0x00280200, 0x00280300,
335     0x01200200, 0x01200300, 0x01280200, 0x01280300,
336     0x00200210, 0x00200310, 0x00280210, 0x00280310,
337     0x01200210, 0x01200310, 0x01280210, 0x01280310,
338   },
339   {
340     0x00000000, 0x04000000, 0x00040000, 0x04040000,
341     0x00000002, 0x04000002, 0x00040002, 0x04040002,
342     0x00002000, 0x04002000, 0x00042000, 0x04042000,
343     0x00002002, 0x04002002, 0x00042002, 0x04042002,
344     0x00000020, 0x04000020, 0x00040020, 0x04040020,
345     0x00000022, 0x04000022, 0x00040022, 0x04040022,
346     0x00002020, 0x04002020, 0x00042020, 0x04042020,
347     0x00002022, 0x04002022, 0x00042022, 0x04042022,
348     0x00000800, 0x04000800, 0x00040800, 0x04040800,
349     0x00000802, 0x04000802, 0x00040802, 0x04040802,
350     0x00002800, 0x04002800, 0x00042800, 0x04042800,
351     0x00002802, 0x04002802, 0x00042802, 0x04042802,
352     0x00000820, 0x04000820, 0x00040820, 0x04040820,
353     0x00000822, 0x04000822, 0x00040822, 0x04040822,
354     0x00002820, 0x04002820, 0x00042820, 0x04042820,
355     0x00002822, 0x04002822, 0x00042822, 0x04042822
356   }
357 };
358
359 #define BOX(i,n,S) (S)[(n)][(i)]
360
361 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
362 {
363   u32 tt;
364
365   u32 r = data[0];
366   u32 l = data[1];
367
368   IP (r, l, tt);
369
370   r = rotl32 (r, 3u);
371   l = rotl32 (l, 3u);
372
373   #pragma unroll 16
374   for (u32 i = 0; i < 16; i += 2)
375   {
376     u32 u;
377     u32 t;
378
379     u = Kc[i + 0] ^ r;
380     t = Kd[i + 0] ^ rotl32 (r, 28u);
381
382     l ^= BOX (((u >>  2) & 0x3f), 0, s_SPtrans)
383        | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
384        | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
385        | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
386        | BOX (((t >>  2) & 0x3f), 1, s_SPtrans)
387        | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
388        | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
389        | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
390
391     u = Kc[i + 1] ^ l;
392     t = Kd[i + 1] ^ rotl32 (l, 28u);
393
394     r ^= BOX (((u >>  2) & 0x3f), 0, s_SPtrans)
395        | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
396        | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
397        | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
398        | BOX (((t >>  2) & 0x3f), 1, s_SPtrans)
399        | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
400        | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
401        | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
402   }
403
404   l = rotl32 (l, 29u);
405   r = rotl32 (r, 29u);
406
407   FP (r, l, tt);
408
409   iv[0] = l;
410   iv[1] = r;
411 }
412
413 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
414 {
415   u32 tt;
416
417   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
418   HPERM_OP (c,    tt, 2, 0xcccc0000);
419   HPERM_OP (d,    tt, 2, 0xcccc0000);
420   PERM_OP  (d, c, tt, 1, 0x55555555);
421   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
422   PERM_OP  (d, c, tt, 1, 0x55555555);
423
424   d = ((d & 0x000000ff) << 16)
425     | ((d & 0x0000ff00) <<  0)
426     | ((d & 0x00ff0000) >> 16)
427     | ((c & 0xf0000000) >>  4);
428
429   c = c & 0x0fffffff;
430
431   #pragma unroll 16
432   for (u32 i = 0; i < 16; i++)
433   {
434     if ((i < 2) || (i == 8) || (i == 15))
435     {
436       c = ((c >> 1) | (c << 27));
437       d = ((d >> 1) | (d << 27));
438     }
439     else
440     {
441       c = ((c >> 2) | (c << 26));
442       d = ((d >> 2) | (d << 26));
443     }
444
445     c = c & 0x0fffffff;
446     d = d & 0x0fffffff;
447
448     const u32 c00 = (c >>  0) & 0x0000003f;
449     const u32 c06 = (c >>  6) & 0x00383003;
450     const u32 c07 = (c >>  7) & 0x0000003c;
451     const u32 c13 = (c >> 13) & 0x0000060f;
452     const u32 c20 = (c >> 20) & 0x00000001;
453
454     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
455           | BOX (((c06 >>  0) & 0xff)
456                 |((c07 >>  0) & 0xff), 1, s_skb)
457           | BOX (((c13 >>  0) & 0xff)
458                 |((c06 >>  8) & 0xff), 2, s_skb)
459           | BOX (((c20 >>  0) & 0xff)
460                 |((c13 >>  8) & 0xff)
461                 |((c06 >> 16) & 0xff), 3, s_skb);
462
463     const u32 d00 = (d >>  0) & 0x00003c3f;
464     const u32 d07 = (d >>  7) & 0x00003f03;
465     const u32 d21 = (d >> 21) & 0x0000000f;
466     const u32 d22 = (d >> 22) & 0x00000030;
467
468     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
469           | BOX (((d07 >>  0) & 0xff)
470                 |((d00 >>  8) & 0xff), 5, s_skb)
471           | BOX (((d07 >>  8) & 0xff), 6, s_skb)
472           | BOX (((d21 >>  0) & 0xff)
473                 |((d22 >>  0) & 0xff), 7, s_skb);
474
475     Kc[i] = ((t << 16) | (s & 0x0000ffff));
476     Kd[i] = ((s >> 16) | (t & 0xffff0000));
477
478     Kc[i] = rotl32 (Kc[i], 2u);
479     Kd[i] = rotl32 (Kd[i], 2u);
480   }
481 }
482
483 __kernel void m03100_m04 (__global pw_t *pws, __global kernel_rule_t *  rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
484 {
485   /**
486    * modifier
487    */
488
489   const u32 gid = get_global_id (0);
490   const u32 lid = get_local_id (0);
491   const u32 lsz = get_local_size (0);
492
493   /**
494    * sbox, kbox
495    */
496
497   __local u32 s_SPtrans[8][64];
498   __local u32 s_skb[8][64];
499
500   for (u32 i = lid; i < 64; i += lsz)
501   {
502     s_SPtrans[0][i] = c_SPtrans[0][i];
503     s_SPtrans[1][i] = c_SPtrans[1][i];
504     s_SPtrans[2][i] = c_SPtrans[2][i];
505     s_SPtrans[3][i] = c_SPtrans[3][i];
506     s_SPtrans[4][i] = c_SPtrans[4][i];
507     s_SPtrans[5][i] = c_SPtrans[5][i];
508     s_SPtrans[6][i] = c_SPtrans[6][i];
509     s_SPtrans[7][i] = c_SPtrans[7][i];
510
511     s_skb[0][i] = c_skb[0][i];
512     s_skb[1][i] = c_skb[1][i];
513     s_skb[2][i] = c_skb[2][i];
514     s_skb[3][i] = c_skb[3][i];
515     s_skb[4][i] = c_skb[4][i];
516     s_skb[5][i] = c_skb[5][i];
517     s_skb[6][i] = c_skb[6][i];
518     s_skb[7][i] = c_skb[7][i];
519   }
520
521   barrier (CLK_LOCAL_MEM_FENCE);
522
523   if (gid >= gid_max) return;
524
525   /**
526    * base
527    */
528
529   u32 pw_buf0[4];
530
531   pw_buf0[0] = pws[gid].i[ 0];
532   pw_buf0[1] = pws[gid].i[ 1];
533   pw_buf0[2] = pws[gid].i[ 2];
534   pw_buf0[3] = pws[gid].i[ 3];
535
536   u32 pw_buf1[4];
537
538   pw_buf1[0] = pws[gid].i[ 4];
539   pw_buf1[1] = pws[gid].i[ 5];
540   pw_buf1[2] = pws[gid].i[ 6];
541   pw_buf1[3] = pws[gid].i[ 7];
542
543   const u32 pw_len = pws[gid].pw_len;
544
545   /**
546    * salt
547    */
548
549   u32 salt_buf0[4];
550
551   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
552   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
553   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
554   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
555
556   u32 salt_buf1[4];
557
558   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
559   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
560   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
561   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
562
563   const u32 salt_len = salt_bufs[salt_pos].salt_len;
564
565   /**
566    * loop
567    */
568
569   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
570   {
571     u32 w0[4];
572
573     w0[0] = pw_buf0[0];
574     w0[1] = pw_buf0[1];
575     w0[2] = pw_buf0[2];
576     w0[3] = pw_buf0[3];
577
578     u32 w1[4];
579
580     w1[0] = pw_buf1[0];
581     w1[1] = pw_buf1[1];
582     w1[2] = pw_buf1[2];
583     w1[3] = pw_buf1[3];
584
585     u32 w2[4];
586
587     w2[0] = 0;
588     w2[1] = 0;
589     w2[2] = 0;
590     w2[3] = 0;
591
592     u32 w3[4];
593
594     w3[0] = 0;
595     w3[1] = 0;
596     w3[2] = 0;
597     w3[3] = 0;
598
599     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
600
601     const u32 salt_word_len = (salt_len + out_len) * 2;
602
603     /**
604      * prepend salt
605      */
606
607     u32 w0_t[4];
608
609     w0_t[0] = w0[0];
610     w0_t[1] = w0[1];
611     w0_t[2] = w0[2];
612     w0_t[3] = w0[3];
613
614     u32 w1_t[4];
615
616     w1_t[0] = w1[0];
617     w1_t[1] = w1[1];
618     w1_t[2] = w1[2];
619     w1_t[3] = w1[3];
620
621     u32 w2_t[4];
622
623     w2_t[0] = w2[0];
624     w2_t[1] = w2[1];
625     w2_t[2] = w2[2];
626     w2_t[3] = w2[3];
627
628     u32 w3_t[4];
629
630     w3_t[0] = w3[0];
631     w3_t[1] = w3[1];
632     w3_t[2] = w3[2];
633     w3_t[3] = w3[3];
634
635     switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, salt_len);
636
637     w0_t[0] |= salt_buf0[0];
638     w0_t[1] |= salt_buf0[1];
639     w0_t[2] |= salt_buf0[2];
640     w0_t[3] |= salt_buf0[3];
641     w1_t[0] |= salt_buf1[0];
642     w1_t[1] |= salt_buf1[1];
643     w1_t[2] |= salt_buf1[2];
644     w1_t[3] |= salt_buf1[3];
645
646     u32 dst[16];
647
648     dst[ 0] = w0_t[0];
649     dst[ 1] = w0_t[1];
650     dst[ 2] = w0_t[2];
651     dst[ 3] = w0_t[3];
652     dst[ 4] = w1_t[0];
653     dst[ 5] = w1_t[1];
654     dst[ 6] = w1_t[2];
655     dst[ 7] = w1_t[3];
656     dst[ 8] = w2_t[0];
657     dst[ 9] = w2_t[1];
658     dst[10] = w2_t[2];
659     dst[11] = w2_t[3];
660     dst[12] = 0;
661     dst[13] = 0;
662     dst[14] = 0;
663     dst[15] = 0;
664
665     /**
666      * precompute key1 since key is static: 0x0123456789abcdef
667      * plus LEFT_ROTATE by 2
668      */
669
670     u32 Kc[16];
671
672     Kc[ 0] = 0x64649040;
673     Kc[ 1] = 0x14909858;
674     Kc[ 2] = 0xc4b44888;
675     Kc[ 3] = 0x9094e438;
676     Kc[ 4] = 0xd8a004f0;
677     Kc[ 5] = 0xa8f02810;
678     Kc[ 6] = 0xc84048d8;
679     Kc[ 7] = 0x68d804a8;
680     Kc[ 8] = 0x0490e40c;
681     Kc[ 9] = 0xac183024;
682     Kc[10] = 0x24c07c10;
683     Kc[11] = 0x8c88c038;
684     Kc[12] = 0xc048c824;
685     Kc[13] = 0x4c0470a8;
686     Kc[14] = 0x584020b4;
687     Kc[15] = 0x00742c4c;
688
689     u32 Kd[16];
690
691     Kd[ 0] = 0xa42ce40c;
692     Kd[ 1] = 0x64689858;
693     Kd[ 2] = 0x484050b8;
694     Kd[ 3] = 0xe8184814;
695     Kd[ 4] = 0x405cc070;
696     Kd[ 5] = 0xa010784c;
697     Kd[ 6] = 0x6074a800;
698     Kd[ 7] = 0x80701c1c;
699     Kd[ 8] = 0x9cd49430;
700     Kd[ 9] = 0x4c8ce078;
701     Kd[10] = 0x5c18c088;
702     Kd[11] = 0x28a8a4c8;
703     Kd[12] = 0x3c180838;
704     Kd[13] = 0xb0b86c20;
705     Kd[14] = 0xac84a094;
706     Kd[15] = 0x4ce0c0c4;
707
708     /**
709      * key1 (generate key)
710      */
711
712     u32 iv[2];
713
714     iv[0] = 0;
715     iv[1] = 0;
716
717     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
718     {
719       u32 data[2];
720
721       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
722       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
723
724       data[0] ^= iv[0];
725       data[1] ^= iv[1];
726
727       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
728     }
729
730     /**
731      * key2 (generate hash)
732      */
733
734     _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb);
735
736     iv[0] = 0;
737     iv[1] = 0;
738
739     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
740     {
741       u32 data[2];
742
743       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
744       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
745
746       data[0] ^= iv[0];
747       data[1] ^= iv[1];
748
749       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
750     }
751
752     /**
753      * cmp
754      */
755
756     const u32 r0 = iv[0];
757     const u32 r1 = iv[1];
758     const u32 r2 = 0;
759     const u32 r3 = 0;
760
761     #include COMPARE_M
762   }
763 }
764
765 __kernel void m03100_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
766 {
767 }
768
769 __kernel void m03100_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
770 {
771 }
772
773 __kernel void m03100_s04 (__global pw_t *pws, __global kernel_rule_t *  rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
774 {
775   /**
776    * modifier
777    */
778
779   const u32 gid = get_global_id (0);
780   const u32 lid = get_local_id (0);
781   const u32 lsz = get_local_size (0);
782
783   /**
784    * sbox, kbox
785    */
786
787   __local u32 s_SPtrans[8][64];
788   __local u32 s_skb[8][64];
789
790   for (u32 i = lid; i < 64; i += lsz)
791   {
792     s_SPtrans[0][i] = c_SPtrans[0][i];
793     s_SPtrans[1][i] = c_SPtrans[1][i];
794     s_SPtrans[2][i] = c_SPtrans[2][i];
795     s_SPtrans[3][i] = c_SPtrans[3][i];
796     s_SPtrans[4][i] = c_SPtrans[4][i];
797     s_SPtrans[5][i] = c_SPtrans[5][i];
798     s_SPtrans[6][i] = c_SPtrans[6][i];
799     s_SPtrans[7][i] = c_SPtrans[7][i];
800
801     s_skb[0][i] = c_skb[0][i];
802     s_skb[1][i] = c_skb[1][i];
803     s_skb[2][i] = c_skb[2][i];
804     s_skb[3][i] = c_skb[3][i];
805     s_skb[4][i] = c_skb[4][i];
806     s_skb[5][i] = c_skb[5][i];
807     s_skb[6][i] = c_skb[6][i];
808     s_skb[7][i] = c_skb[7][i];
809   }
810
811   barrier (CLK_LOCAL_MEM_FENCE);
812
813   if (gid >= gid_max) return;
814
815   /**
816    * base
817    */
818
819   u32 pw_buf0[4];
820
821   pw_buf0[0] = pws[gid].i[ 0];
822   pw_buf0[1] = pws[gid].i[ 1];
823   pw_buf0[2] = pws[gid].i[ 2];
824   pw_buf0[3] = pws[gid].i[ 3];
825
826   u32 pw_buf1[4];
827
828   pw_buf1[0] = pws[gid].i[ 4];
829   pw_buf1[1] = pws[gid].i[ 5];
830   pw_buf1[2] = pws[gid].i[ 6];
831   pw_buf1[3] = pws[gid].i[ 7];
832
833   const u32 pw_len = pws[gid].pw_len;
834
835   /**
836    * salt
837    */
838
839   u32 salt_buf0[4];
840
841   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0];
842   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1];
843   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2];
844   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3];
845
846   u32 salt_buf1[4];
847
848   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4];
849   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5];
850   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6];
851   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7];
852
853   const u32 salt_len = salt_bufs[salt_pos].salt_len;
854
855   /**
856    * digest
857    */
858
859   const u32 search[4] =
860   {
861     digests_buf[digests_offset].digest_buf[DGST_R0],
862     digests_buf[digests_offset].digest_buf[DGST_R1],
863     digests_buf[digests_offset].digest_buf[DGST_R2],
864     digests_buf[digests_offset].digest_buf[DGST_R3]
865   };
866
867   /**
868    * loop
869    */
870
871   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
872   {
873     u32 w0[4];
874
875     w0[0] = pw_buf0[0];
876     w0[1] = pw_buf0[1];
877     w0[2] = pw_buf0[2];
878     w0[3] = pw_buf0[3];
879
880     u32 w1[4];
881
882     w1[0] = pw_buf1[0];
883     w1[1] = pw_buf1[1];
884     w1[2] = pw_buf1[2];
885     w1[3] = pw_buf1[3];
886
887     u32 w2[4];
888
889     w2[0] = 0;
890     w2[1] = 0;
891     w2[2] = 0;
892     w2[3] = 0;
893
894     u32 w3[4];
895
896     w3[0] = 0;
897     w3[1] = 0;
898     w3[2] = 0;
899     w3[3] = 0;
900
901     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
902
903     const u32 salt_word_len = (salt_len + out_len) * 2;
904
905     /**
906      * prepend salt
907      */
908
909     u32 w0_t[4];
910
911     w0_t[0] = w0[0];
912     w0_t[1] = w0[1];
913     w0_t[2] = w0[2];
914     w0_t[3] = w0[3];
915
916     u32 w1_t[4];
917
918     w1_t[0] = w1[0];
919     w1_t[1] = w1[1];
920     w1_t[2] = w1[2];
921     w1_t[3] = w1[3];
922
923     u32 w2_t[4];
924
925     w2_t[0] = w2[0];
926     w2_t[1] = w2[1];
927     w2_t[2] = w2[2];
928     w2_t[3] = w2[3];
929
930     u32 w3_t[4];
931
932     w3_t[0] = w3[0];
933     w3_t[1] = w3[1];
934     w3_t[2] = w3[2];
935     w3_t[3] = w3[3];
936
937     switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, salt_len);
938
939     w0_t[0] |= salt_buf0[0];
940     w0_t[1] |= salt_buf0[1];
941     w0_t[2] |= salt_buf0[2];
942     w0_t[3] |= salt_buf0[3];
943     w1_t[0] |= salt_buf1[0];
944     w1_t[1] |= salt_buf1[1];
945     w1_t[2] |= salt_buf1[2];
946     w1_t[3] |= salt_buf1[3];
947
948     u32 dst[16];
949
950     dst[ 0] = w0_t[0];
951     dst[ 1] = w0_t[1];
952     dst[ 2] = w0_t[2];
953     dst[ 3] = w0_t[3];
954     dst[ 4] = w1_t[0];
955     dst[ 5] = w1_t[1];
956     dst[ 6] = w1_t[2];
957     dst[ 7] = w1_t[3];
958     dst[ 8] = w2_t[0];
959     dst[ 9] = w2_t[1];
960     dst[10] = w2_t[2];
961     dst[11] = w2_t[3];
962     dst[12] = 0;
963     dst[13] = 0;
964     dst[14] = 0;
965     dst[15] = 0;
966
967     /**
968      * precompute key1 since key is static: 0x0123456789abcdef
969      * plus LEFT_ROTATE by 2
970      */
971
972     u32 Kc[16];
973
974     Kc[ 0] = 0x64649040;
975     Kc[ 1] = 0x14909858;
976     Kc[ 2] = 0xc4b44888;
977     Kc[ 3] = 0x9094e438;
978     Kc[ 4] = 0xd8a004f0;
979     Kc[ 5] = 0xa8f02810;
980     Kc[ 6] = 0xc84048d8;
981     Kc[ 7] = 0x68d804a8;
982     Kc[ 8] = 0x0490e40c;
983     Kc[ 9] = 0xac183024;
984     Kc[10] = 0x24c07c10;
985     Kc[11] = 0x8c88c038;
986     Kc[12] = 0xc048c824;
987     Kc[13] = 0x4c0470a8;
988     Kc[14] = 0x584020b4;
989     Kc[15] = 0x00742c4c;
990
991     u32 Kd[16];
992
993     Kd[ 0] = 0xa42ce40c;
994     Kd[ 1] = 0x64689858;
995     Kd[ 2] = 0x484050b8;
996     Kd[ 3] = 0xe8184814;
997     Kd[ 4] = 0x405cc070;
998     Kd[ 5] = 0xa010784c;
999     Kd[ 6] = 0x6074a800;
1000     Kd[ 7] = 0x80701c1c;
1001     Kd[ 8] = 0x9cd49430;
1002     Kd[ 9] = 0x4c8ce078;
1003     Kd[10] = 0x5c18c088;
1004     Kd[11] = 0x28a8a4c8;
1005     Kd[12] = 0x3c180838;
1006     Kd[13] = 0xb0b86c20;
1007     Kd[14] = 0xac84a094;
1008     Kd[15] = 0x4ce0c0c4;
1009
1010     /**
1011      * key1 (generate key)
1012      */
1013
1014     u32 iv[2];
1015
1016     iv[0] = 0;
1017     iv[1] = 0;
1018
1019     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
1020     {
1021       u32 data[2];
1022
1023       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
1024       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
1025
1026       data[0] ^= iv[0];
1027       data[1] ^= iv[1];
1028
1029       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
1030     }
1031
1032     /**
1033      * key2 (generate hash)
1034      */
1035
1036     _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb);
1037
1038     iv[0] = 0;
1039     iv[1] = 0;
1040
1041     for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++)
1042     {
1043       u32 data[2];
1044
1045       data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00);
1046       data[1] = ((dst[k] >>  0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00);
1047
1048       data[0] ^= iv[0];
1049       data[1] ^= iv[1];
1050
1051       _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
1052     }
1053
1054     /**
1055      * cmp
1056      */
1057
1058     const u32 r0 = iv[0];
1059     const u32 r1 = iv[1];
1060     const u32 r2 = 0;
1061     const u32 r3 = 0;
1062
1063     #include COMPARE_S
1064   }
1065 }
1066
1067 __kernel void m03100_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1068 {
1069 }
1070
1071 __kernel void m03100_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1072 {
1073 }