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