Fix algorithms based on 64 bit datatypes for older NV cards
[hashcat.git] / OpenCL / types_ocl.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 typedef uchar u8;
7 typedef ushort u16;
8 typedef uint u32;
9 typedef ulong u64;
10
11 #ifndef NEW_SIMD_CODE
12 #undef VECT_SIZE
13 #define VECT_SIZE 1
14 #endif
15
16 #if VECT_SIZE == 1
17 typedef uint u32x;
18 typedef ulong u64x;
19 #endif
20
21 #if VECT_SIZE == 2
22 typedef uint2 u32x;
23 typedef ulong2 u64x;
24 #endif
25
26 #if VECT_SIZE == 4
27 typedef uint4 u32x;
28 typedef ulong4 u64x;
29 #endif
30
31 #if VECT_SIZE == 8
32 typedef uint8 u32x;
33 typedef ulong8 u64x;
34 #endif
35
36 // this one needs to die
37 #define allx(r) r
38
39 static inline u32 l32_from_64 (u64 a)
40 {
41 const u32 r = (uint) (a);
42
43 return r;
44 }
45
46 static inline u32 h32_from_64 (u64 a)
47 {
48 a >>= 32;
49
50 const u32 r = (uint) (a);
51
52 return r;
53 }
54
55 static inline u64 hl32_to_64 (const u32 a, const u32 b)
56 {
57 return as_ulong ((uint2) (b, a));
58 }
59
60 #ifdef IS_AMD
61 static inline u32 swap32 (const u32 v)
62 {
63 return (as_uint (as_uchar4 (v).s3210));
64 }
65
66 static inline u64 swap64 (const u64 v)
67 {
68 return (as_ulong (as_uchar8 (v).s76543210));
69 }
70 #endif
71
72 #ifdef IS_NV
73 static inline u32 swap32 (const u32 v)
74 {
75 u32 r;
76
77 asm ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(r) : "r"(v));
78
79 return r;
80 }
81
82 static inline u64 swap64 (const u64 v)
83 {
84 u32 il;
85 u32 ir;
86
87 asm ("mov.b64 {%0, %1}, %2;" : "=r"(il), "=r"(ir) : "l"(v));
88
89 u32 tl;
90 u32 tr;
91
92 asm ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tl) : "r"(il));
93 asm ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr) : "r"(ir));
94
95 u64 r;
96
97 asm ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tr), "r"(tl));
98
99 return r;
100 }
101 #endif
102
103 #ifdef IS_GENERIC
104 static inline u32 swap32 (const u32 v)
105 {
106 return (as_uint (as_uchar4 (v).s3210));
107 }
108
109 static inline u64 swap64 (const u64 v)
110 {
111 return (as_ulong (as_uchar8 (v).s76543210));
112 }
113 #endif
114
115 #ifdef IS_AMD
116 static inline u32 __bfe (const u32 a, const u32 b, const u32 c)
117 {
118 return amd_bfe (a, b, c);
119 }
120
121 static inline u32 amd_bytealign_S (const u32 a, const u32 b, const u32 c)
122 {
123 return amd_bytealign (a, b, c);
124 }
125
126 #endif
127
128 #ifdef IS_NV
129 static inline u32 __byte_perm_S (const u32 a, const u32 b, const u32 c)
130 {
131 u32 r;
132
133 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c));
134
135 return r;
136 }
137
138 static inline u32x __byte_perm (const u32x a, const u32x b, const u32x c)
139 {
140 u32x r;
141
142 #if VECT_SIZE == 1
143 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c) );
144 #endif
145
146 #if VECT_SIZE == 2
147 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s0) : "r"(a.s0), "r"(b.s0), "r"(c.s0));
148 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s1) : "r"(a.s1), "r"(b.s1), "r"(c.s1));
149 #endif
150
151 #if VECT_SIZE == 4
152 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s0) : "r"(a.s0), "r"(b.s0), "r"(c.s0));
153 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s1) : "r"(a.s1), "r"(b.s1), "r"(c.s1));
154 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s2) : "r"(a.s2), "r"(b.s2), "r"(c.s2));
155 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s3) : "r"(a.s3), "r"(b.s3), "r"(c.s3));
156 #endif
157
158 #if VECT_SIZE == 8
159 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s0) : "r"(a.s0), "r"(b.s0), "r"(c.s0));
160 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s1) : "r"(a.s1), "r"(b.s1), "r"(c.s1));
161 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s2) : "r"(a.s2), "r"(b.s2), "r"(c.s2));
162 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s3) : "r"(a.s3), "r"(b.s3), "r"(c.s3));
163 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s4) : "r"(a.s4), "r"(b.s4), "r"(c.s4));
164 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s5) : "r"(a.s5), "r"(b.s5), "r"(c.s5));
165 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s6) : "r"(a.s6), "r"(b.s6), "r"(c.s6));
166 asm ("prmt.b32 %0, %1, %2, %3;" : "=r"(r.s7) : "r"(a.s7), "r"(b.s7), "r"(c.s7));
167 #endif
168
169 return r;
170 }
171
172 static inline u32 __bfe (const u32 a, const u32 b, const u32 c)
173 {
174 u32 r;
175
176 asm ("bfe.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(c));
177
178 return r;
179 }
180
181 #if CUDA_ARCH >= 350
182 static inline u32 amd_bytealign (const u32 a, const u32 b, const u32 c)
183 {
184 u32 r;
185
186 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(r) : "r"(b), "r"(a), "r"((c & 3) * 8));
187
188 return r;
189 }
190 #else
191 static inline u32 amd_bytealign (const u32 a, const u32 b, const u32 c)
192 {
193 return __byte_perm_S (b, a, (0x76543210 >> ((c & 3) * 4)) & 0xffff);
194 }
195 #endif
196 #endif
197
198 #ifdef IS_GENERIC
199 static inline u32 __bfe (const u32 a, const u32 b, const u32 c)
200 {
201 #define BIT(x) (1 << (x))
202 #define BIT_MASK(x) (BIT (x) - 1)
203 #define BFE(x,y,z) (((x) >> (y)) & BIT_MASK (z))
204
205 return BFE (a, b, c);
206 }
207
208 static inline u32 amd_bytealign_S (const u32 a, const u32 b, const u32 c)
209 {
210 const u64 tmp = ((((u64) a) << 32) | ((u64) b)) >> ((c & 3) * 8);
211
212 return (u32) (tmp);
213 }
214
215 static inline u32x amd_bytealign (const u32x a, const u32x b, const u32 c)
216 {
217 #if VECT_SIZE == 1
218 const u64x tmp = ((((u64x) (a)) << 32) | ((u64x) (b))) >> ((c & 3) * 8);
219
220 return (u32x) (tmp);
221 #endif
222
223 #if VECT_SIZE == 2
224 const u64x tmp = ((((u64x) (a.s0, a.s1)) << 32) | ((u64x) (b.s0, b.s1))) >> ((c & 3) * 8);
225
226 return (u32x) (tmp.s0, tmp.s1);
227 #endif
228
229 #if VECT_SIZE == 4
230 const u64x tmp = ((((u64x) (a.s0, a.s1, a.s2, a.s3)) << 32) | ((u64x) (b.s0, b.s1, b.s2, b.s3))) >> ((c & 3) * 8);
231
232 return (u32x) (tmp.s0, tmp.s1, tmp.s2, tmp.s3);
233 #endif
234
235 #if VECT_SIZE == 8
236 const u64x tmp = ((((u64x) (a.s0, a.s1, a.s2, a.s3, a.s4, a.s5, a.s6, a.s7)) << 32) | ((u64x) (b.s0, b.s1, b.s2, b.s3, b.s4, b.s5, b.s6, b.s7))) >> ((c & 3) * 8);
237
238 return (u32x) (tmp.s0, tmp.s1, tmp.s2, tmp.s3, tmp.s4, tmp.s5, tmp.s6, tmp.s7);
239 #endif
240 }
241 #endif
242
243 #ifdef IS_AMD
244 static inline u32x rotr32 (const u32x a, const u32 n)
245 {
246 return rotate (a, 32 - n);
247 }
248
249 static inline u32x rotl32 (const u32x a, const u32 n)
250 {
251 return rotate (a, n);
252 }
253
254 static inline u64 rotr64 (const u64 a, const u32 n)
255 {
256 uint2 a2 = as_uint2 (a);
257
258 uint2 t;
259
260 t.s0 = (n >= 32) ? amd_bitalign (a2.s0, a2.s1, n - 32)
261 : amd_bitalign (a2.s1, a2.s0, n);
262 t.s1 = (n >= 32) ? amd_bitalign (a2.s1, a2.s0, n - 32)
263 : amd_bitalign (a2.s0, a2.s1, n);
264
265 return as_ulong (t);
266 }
267
268 static inline u64 rotl64 (const u64 a, const u32 n)
269 {
270 return rotr64 (a, 64 - n);
271 }
272 #endif
273
274 #ifdef IS_NV
275 static inline u32x rotr32 (const u32x a, const u32 n)
276 {
277 return rotate (a, 32 - n);
278 }
279
280 static inline u32x rotl32 (const u32x a, const u32 n)
281 {
282 return rotate (a, n);
283 }
284
285 #if CUDA_ARCH >= 350
286 static inline u64 rotr64 (const u64 a, const u32 n)
287 {
288 u32 il;
289 u32 ir;
290
291 asm ("mov.b64 {%0, %1}, %2;" : "=r"(il), "=r"(ir) : "l"(a));
292
293 u32 tl;
294 u32 tr;
295
296 if (n >= 32)
297 {
298 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tl) : "r"(ir), "r"(il), "r"(n - 32));
299 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tr) : "r"(il), "r"(ir), "r"(n - 32));
300 }
301 else
302 {
303 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tl) : "r"(il), "r"(ir), "r"(n));
304 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tr) : "r"(ir), "r"(il), "r"(n));
305 }
306
307 u64 r;
308
309 asm ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tl), "r"(tr));
310
311 return r;
312 }
313 #else
314 static inline u64 rotr64 (const u64 a, const u32 n)
315 {
316 return rotate (a, (u64) 64 - n);
317 }
318 #endif
319
320 static inline u64 rotl64 (const u64 a, const u32 n)
321 {
322 return rotr64 (a, 64 - n);
323 }
324 #endif
325
326 #ifdef IS_GENERIC
327
328 static inline u32x rotr32 (const u32x a, const u32x n)
329 {
330 return rotate (a, 32 - n);
331 }
332
333 static inline u32x rotl32 (const u32x a, const u32x n)
334 {
335 return rotate (a, n);
336 }
337
338 static inline u64 rotr64 (const u64 a, const u32 n)
339 {
340 return rotate (a, (u64) 64 - n);
341 }
342
343 static inline u64 rotl64 (const u64 a, const u32 n)
344 {
345 return rotate (a, (u64) n);
346 }
347 #endif
348
349 #ifdef IS_NV
350 #if CUDA_ARCH >= 500
351 static inline u32x lut3_2d (const u32x a, const u32x b, const u32x c)
352 {
353 u32x r;
354
355 #if VECT_SIZE == 1
356 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
357 #endif
358
359 #if VECT_SIZE == 2
360 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
361 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
362 #endif
363
364 #if VECT_SIZE == 4
365 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
366 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
367 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
368 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
369 #endif
370
371 #if VECT_SIZE == 8
372 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
373 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
374 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
375 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
376 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
377 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
378 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
379 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
380 #endif
381
382 return r;
383 }
384
385 static inline u32x lut3_39 (const u32x a, const u32x b, const u32x c)
386 {
387 u32x r;
388
389 #if VECT_SIZE == 1
390 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
391 #endif
392
393 #if VECT_SIZE == 2
394 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
395 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
396 #endif
397
398 #if VECT_SIZE == 4
399 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
400 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
401 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
402 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
403 #endif
404
405 #if VECT_SIZE == 8
406 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
407 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
408 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
409 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
410 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
411 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
412 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
413 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
414 #endif
415
416 return r;
417 }
418
419 static inline u32x lut3_59 (const u32x a, const u32x b, const u32x c)
420 {
421 u32x r;
422
423 #if VECT_SIZE == 1
424 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
425 #endif
426
427 #if VECT_SIZE == 2
428 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
429 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
430 #endif
431
432 #if VECT_SIZE == 4
433 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
434 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
435 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
436 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
437 #endif
438
439 #if VECT_SIZE == 8
440 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
441 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
442 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
443 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
444 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
445 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
446 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
447 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
448 #endif
449
450 return r;
451 }
452
453 static inline u32x lut3_96 (const u32x a, const u32x b, const u32x c)
454 {
455 u32x r;
456
457 #if VECT_SIZE == 1
458 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
459 #endif
460
461 #if VECT_SIZE == 2
462 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
463 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
464 #endif
465
466 #if VECT_SIZE == 4
467 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
468 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
469 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
470 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
471 #endif
472
473 #if VECT_SIZE == 8
474 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
475 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
476 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
477 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
478 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
479 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
480 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
481 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
482 #endif
483
484 return r;
485 }
486
487 static inline u32x lut3_e4 (const u32x a, const u32x b, const u32x c)
488 {
489 u32x r;
490
491 #if VECT_SIZE == 1
492 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
493 #endif
494
495 #if VECT_SIZE == 2
496 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
497 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
498 #endif
499
500 #if VECT_SIZE == 4
501 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
502 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
503 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
504 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
505 #endif
506
507 #if VECT_SIZE == 8
508 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
509 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
510 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
511 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
512 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
513 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
514 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
515 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
516 #endif
517
518 return r;
519 }
520
521 static inline u32x lut3_e8 (const u32x a, const u32x b, const u32x c)
522 {
523 u32x r;
524
525 #if VECT_SIZE == 1
526 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
527 #endif
528
529 #if VECT_SIZE == 2
530 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
531 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
532 #endif
533
534 #if VECT_SIZE == 4
535 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
536 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
537 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
538 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
539 #endif
540
541 #if VECT_SIZE == 8
542 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
543 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
544 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
545 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
546 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
547 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
548 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
549 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
550 #endif
551
552 return r;
553 }
554
555 static inline u32x lut3_ca (const u32x a, const u32x b, const u32x c)
556 {
557 u32x r;
558
559 #if VECT_SIZE == 1
560 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
561 #endif
562
563 #if VECT_SIZE == 2
564 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
565 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
566 #endif
567
568 #if VECT_SIZE == 4
569 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
570 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
571 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
572 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
573 #endif
574
575 #if VECT_SIZE == 8
576 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
577 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
578 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
579 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
580 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
581 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
582 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
583 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
584 #endif
585
586 return r;
587 }
588
589 #endif
590 #endif
591
592 typedef struct
593 {
594 #if defined _DES_
595 u32 digest_buf[4];
596 #elif defined _MD4_
597 u32 digest_buf[4];
598 #elif defined _MD5_
599 u32 digest_buf[4];
600 #elif defined _MD5H_
601 u32 digest_buf[4];
602 #elif defined _SHA1_
603 u32 digest_buf[5];
604 #elif defined _BCRYPT_
605 u32 digest_buf[6];
606 #elif defined _SHA256_
607 u32 digest_buf[8];
608 #elif defined _SHA384_
609 u32 digest_buf[16];
610 #elif defined _SHA512_
611 u32 digest_buf[16];
612 #elif defined _KECCAK_
613 u32 digest_buf[50];
614 #elif defined _RIPEMD160_
615 u32 digest_buf[5];
616 #elif defined _WHIRLPOOL_
617 u32 digest_buf[16];
618 #elif defined _GOST_
619 u32 digest_buf[8];
620 #elif defined _GOST2012_256_
621 u32 digest_buf[8];
622 #elif defined _GOST2012_512_
623 u32 digest_buf[16];
624 #elif defined _SAPB_
625 u32 digest_buf[4];
626 #elif defined _SAPG_
627 u32 digest_buf[5];
628 #elif defined _MYSQL323_
629 u32 digest_buf[4];
630 #elif defined _LOTUS5_
631 u32 digest_buf[4];
632 #elif defined _LOTUS6_
633 u32 digest_buf[4];
634 #elif defined _SCRYPT_
635 u32 digest_buf[8];
636 #elif defined _LOTUS8_
637 u32 digest_buf[4];
638 #elif defined _OFFICE2007_
639 u32 digest_buf[4];
640 #elif defined _OFFICE2010_
641 u32 digest_buf[4];
642 #elif defined _OFFICE2013_
643 u32 digest_buf[4];
644 #elif defined _OLDOFFICE01_
645 u32 digest_buf[4];
646 #elif defined _OLDOFFICE34_
647 u32 digest_buf[4];
648 #elif defined _SIPHASH_
649 u32 digest_buf[4];
650 #elif defined _PBKDF2_MD5_
651 u32 digest_buf[32];
652 #elif defined _PBKDF2_SHA1_
653 u32 digest_buf[32];
654 #elif defined _PBKDF2_SHA256_
655 u32 digest_buf[32];
656 #elif defined _PBKDF2_SHA512_
657 u32 digest_buf[32];
658 #elif defined _PDF17L8_
659 u32 digest_buf[8];
660 #elif defined _CRC32_
661 u32 digest_buf[4];
662 #elif defined _SEVEN_ZIP_
663 u32 digest_buf[4];
664 #elif defined _ANDROIDFDE_
665 u32 digest_buf[4];
666 #elif defined _DCC2_
667 u32 digest_buf[4];
668 #elif defined _WPA_
669 u32 digest_buf[4];
670 #elif defined _MD5_SHA1_
671 u32 digest_buf[4];
672 #elif defined _SHA1_MD5_
673 u32 digest_buf[5];
674 #elif defined _NETNTLMV2_
675 u32 digest_buf[4];
676 #elif defined _KRB5PA_
677 u32 digest_buf[4];
678 #elif defined _CLOUDKEY_
679 u32 digest_buf[8];
680 #elif defined _SCRYPT_
681 u32 digest_buf[4];
682 #elif defined _PSAFE2_
683 u32 digest_buf[5];
684 #elif defined _LOTUS8_
685 u32 digest_buf[4];
686 #elif defined _RAR3_
687 u32 digest_buf[4];
688 #elif defined _SHA256_SHA1_
689 u32 digest_buf[8];
690 #elif defined _MS_DRSR_
691 u32 digest_buf[8];
692 #elif defined _ANDROIDFDE_SAMSUNG_
693 u32 digest_buf[8];
694 #elif defined _RAR5_
695 u32 digest_buf[4];
696 #endif
697
698 } digest_t;
699
700 typedef struct
701 {
702 u32 salt_buf[16];
703 u32 salt_buf_pc[8];
704
705 u32 salt_len;
706 u32 salt_iter;
707 u32 salt_sign[2];
708
709 u32 keccak_mdlen;
710 u32 truecrypt_mdlen;
711
712 u32 digests_cnt;
713 u32 digests_done;
714
715 u32 digests_offset;
716
717 u32 scrypt_N;
718 u32 scrypt_r;
719 u32 scrypt_p;
720 u32 scrypt_tmto;
721 u32 scrypt_phy;
722
723 } salt_t;
724
725 typedef struct
726 {
727 int V;
728 int R;
729 int P;
730
731 int enc_md;
732
733 u32 id_buf[8];
734 u32 u_buf[32];
735 u32 o_buf[32];
736
737 int id_len;
738 int o_len;
739 int u_len;
740
741 u32 rc4key[2];
742 u32 rc4data[2];
743
744 } pdf_t;
745
746 typedef struct
747 {
748 u32 pke[25];
749 u32 eapol[64];
750 int eapol_size;
751 int keyver;
752
753 } wpa_t;
754
755 typedef struct
756 {
757 u32 cry_master_buf[64];
758 u32 ckey_buf[64];
759 u32 public_key_buf[64];
760
761 u32 cry_master_len;
762 u32 ckey_len;
763 u32 public_key_len;
764
765 } bitcoin_wallet_t;
766
767 typedef struct
768 {
769 u32 salt_buf[30];
770 u32 salt_len;
771
772 u32 esalt_buf[38];
773 u32 esalt_len;
774
775 } sip_t;
776
777 typedef struct
778 {
779 u32 data[384];
780
781 } androidfde_t;
782
783 typedef struct
784 {
785 u32 nr_buf[16];
786 u32 nr_len;
787
788 u32 msg_buf[128];
789 u32 msg_len;
790
791 } ikepsk_t;
792
793 typedef struct
794 {
795 u32 user_len;
796 u32 domain_len;
797 u32 srvchall_len;
798 u32 clichall_len;
799
800 u32 userdomain_buf[64];
801 u32 chall_buf[256];
802
803 } netntlm_t;
804
805 typedef struct
806 {
807 u32 user[16];
808 u32 realm[16];
809 u32 salt[32];
810 u32 timestamp[16];
811 u32 checksum[4];
812
813 } krb5pa_t;
814
815 typedef struct
816 {
817 u32 salt_buf[16];
818 u32 data_buf[112];
819 u32 keyfile_buf[16];
820
821 } tc_t;
822
823 typedef struct
824 {
825 u32 salt_buf[16];
826
827 } pbkdf2_md5_t;
828
829 typedef struct
830 {
831 u32 salt_buf[16];
832
833 } pbkdf2_sha1_t;
834
835 typedef struct
836 {
837 u32 salt_buf[16];
838
839 } pbkdf2_sha256_t;
840
841 typedef struct
842 {
843 u32 salt_buf[32];
844
845 } pbkdf2_sha512_t;
846
847 typedef struct
848 {
849 u32 salt_buf[128];
850 u32 salt_len;
851
852 } rakp_t;
853
854 typedef struct
855 {
856 u32 data_len;
857 u32 data_buf[512];
858
859 } cloudkey_t;
860
861 typedef struct
862 {
863 u32 encryptedVerifier[4];
864 u32 encryptedVerifierHash[5];
865
866 u32 keySize;
867
868 } office2007_t;
869
870 typedef struct
871 {
872 u32 encryptedVerifier[4];
873 u32 encryptedVerifierHash[8];
874
875 } office2010_t;
876
877 typedef struct
878 {
879 u32 encryptedVerifier[4];
880 u32 encryptedVerifierHash[8];
881
882 } office2013_t;
883
884 typedef struct
885 {
886 u32 version;
887 u32 encryptedVerifier[4];
888 u32 encryptedVerifierHash[4];
889 u32 rc4key[2];
890
891 } oldoffice01_t;
892
893 typedef struct
894 {
895 u32 version;
896 u32 encryptedVerifier[4];
897 u32 encryptedVerifierHash[5];
898 u32 rc4key[2];
899
900 } oldoffice34_t;
901
902 typedef struct
903 {
904 u32 digest[4];
905 u32 out[4];
906
907 } pdf14_tmp_t;
908
909 typedef struct
910 {
911 union
912 {
913 u32 dgst32[16];
914 u64 dgst64[8];
915 };
916
917 u32 dgst_len;
918 u32 W_len;
919
920 } pdf17l8_tmp_t;
921
922 typedef struct
923 {
924 u32 digest_buf[4];
925
926 } phpass_tmp_t;
927
928 typedef struct
929 {
930 u32 digest_buf[4];
931
932 } md5crypt_tmp_t;
933
934 typedef struct
935 {
936 u32 alt_result[8];
937
938 u32 p_bytes[4];
939 u32 s_bytes[4];
940
941 } sha256crypt_tmp_t;
942
943 typedef struct
944 {
945 u64 l_alt_result[8];
946
947 u64 l_p_bytes[2];
948 u64 l_s_bytes[2];
949
950 } sha512crypt_tmp_t;
951
952 typedef struct
953 {
954 u32 ipad[5];
955 u32 opad[5];
956
957 u32 dgst[10];
958 u32 out[10];
959
960 } wpa_tmp_t;
961
962 typedef struct
963 {
964 u64 dgst[8];
965
966 } bitcoin_wallet_tmp_t;
967
968 typedef struct
969 {
970 u32 ipad[5];
971 u32 opad[5];
972
973 u32 dgst[5];
974 u32 out[4];
975
976 } dcc2_tmp_t;
977
978 typedef struct
979 {
980 u32 E[18];
981
982 u32 P[18];
983
984 u32 S0[256];
985 u32 S1[256];
986 u32 S2[256];
987 u32 S3[256];
988
989 } bcrypt_tmp_t;
990
991 typedef struct
992 {
993 u32 digest[2];
994
995 u32 P[18];
996
997 u32 S0[256];
998 u32 S1[256];
999 u32 S2[256];
1000 u32 S3[256];
1001
1002 } pwsafe2_tmp_t;
1003
1004 typedef struct
1005 {
1006 u32 digest_buf[8];
1007
1008 } pwsafe3_tmp_t;
1009
1010 typedef struct
1011 {
1012 u32 digest_buf[5];
1013
1014 } androidpin_tmp_t;
1015
1016 typedef struct
1017 {
1018 u32 ipad[5];
1019 u32 opad[5];
1020
1021 u32 dgst[10];
1022 u32 out[10];
1023
1024 } androidfde_tmp_t;
1025
1026 typedef struct
1027 {
1028 u32 ipad[16];
1029 u32 opad[16];
1030
1031 u32 dgst[64];
1032 u32 out[64];
1033
1034 } tc_tmp_t;
1035
1036 typedef struct
1037 {
1038 u64 ipad[8];
1039 u64 opad[8];
1040
1041 u64 dgst[32];
1042 u64 out[32];
1043
1044 } tc64_tmp_t;
1045
1046 typedef struct
1047 {
1048 u32 ipad[4];
1049 u32 opad[4];
1050
1051 u32 dgst[32];
1052 u32 out[32];
1053
1054 } pbkdf2_md5_tmp_t;
1055
1056 typedef struct
1057 {
1058 u32 ipad[5];
1059 u32 opad[5];
1060
1061 u32 dgst[32];
1062 u32 out[32];
1063
1064 } pbkdf2_sha1_tmp_t;
1065
1066 typedef struct
1067 {
1068 u32 ipad[8];
1069 u32 opad[8];
1070
1071 u32 dgst[32];
1072 u32 out[32];
1073
1074 } pbkdf2_sha256_tmp_t;
1075
1076 typedef struct
1077 {
1078 u64 ipad[8];
1079 u64 opad[8];
1080
1081 u64 dgst[16];
1082 u64 out[16];
1083
1084 } pbkdf2_sha512_tmp_t;
1085
1086 typedef struct
1087 {
1088 u64 out[8];
1089
1090 } ecryptfs_tmp_t;
1091
1092 typedef struct
1093 {
1094 u64 ipad[8];
1095 u64 opad[8];
1096
1097 u64 dgst[16];
1098 u64 out[16];
1099
1100 } oraclet_tmp_t;
1101
1102 typedef struct
1103 {
1104 u32 ipad[5];
1105 u32 opad[5];
1106
1107 u32 dgst[5];
1108 u32 out[5];
1109
1110 } agilekey_tmp_t;
1111
1112 typedef struct
1113 {
1114 u32 ipad[5];
1115 u32 opad[5];
1116
1117 u32 dgst1[5];
1118 u32 out1[5];
1119
1120 u32 dgst2[5];
1121 u32 out2[5];
1122
1123 } mywallet_tmp_t;
1124
1125 typedef struct
1126 {
1127 u32 ipad[5];
1128 u32 opad[5];
1129
1130 u32 dgst[5];
1131 u32 out[5];
1132
1133 } sha1aix_tmp_t;
1134
1135 typedef struct
1136 {
1137 u32 ipad[8];
1138 u32 opad[8];
1139
1140 u32 dgst[8];
1141 u32 out[8];
1142
1143 } sha256aix_tmp_t;
1144
1145 typedef struct
1146 {
1147 u64 ipad[8];
1148 u64 opad[8];
1149
1150 u64 dgst[8];
1151 u64 out[8];
1152
1153 } sha512aix_tmp_t;
1154
1155 typedef struct
1156 {
1157 u32 ipad[8];
1158 u32 opad[8];
1159
1160 u32 dgst[8];
1161 u32 out[8];
1162
1163 } lastpass_tmp_t;
1164
1165 typedef struct
1166 {
1167 u64 digest_buf[8];
1168
1169 } drupal7_tmp_t;
1170
1171 typedef struct
1172 {
1173 u32 ipad[5];
1174 u32 opad[5];
1175
1176 u32 dgst[5];
1177 u32 out[5];
1178
1179 } lotus8_tmp_t;
1180
1181 typedef struct
1182 {
1183 u32 out[5];
1184
1185 } office2007_tmp_t;
1186
1187 typedef struct
1188 {
1189 u32 out[5];
1190
1191 } office2010_tmp_t;
1192
1193 typedef struct
1194 {
1195 u64 out[8];
1196
1197 } office2013_tmp_t;
1198
1199 typedef struct
1200 {
1201 u32 digest_buf[5];
1202
1203 } saph_sha1_tmp_t;
1204
1205 typedef struct
1206 {
1207 u32 block[16];
1208
1209 u32 dgst[8];
1210
1211 u32 block_len;
1212 u32 final_len;
1213
1214 } seven_zip_tmp_t;
1215
1216 typedef struct
1217 {
1218 u32 Kc[16];
1219 u32 Kd[16];
1220
1221 u32 iv[2];
1222
1223 } bsdicrypt_tmp_t;
1224
1225 typedef struct
1226 {
1227 u32 dgst[17][5];
1228
1229 } rar3_tmp_t;
1230
1231 typedef struct
1232 {
1233 u32 user[16];
1234
1235 } cram_md5_t;
1236
1237 typedef struct
1238 {
1239 u32 iv_buf[4];
1240 u32 iv_len;
1241
1242 u32 salt_buf[4];
1243 u32 salt_len;
1244
1245 u32 crc;
1246
1247 u32 data_buf[96];
1248 u32 data_len;
1249
1250 u32 unpack_size;
1251
1252 } seven_zip_t;
1253
1254 typedef struct
1255 {
1256 u32 key;
1257 u64 val;
1258
1259 } hcstat_table_t;
1260
1261 typedef struct
1262 {
1263 u32 cs_buf[0x100];
1264 u32 cs_len;
1265
1266 } cs_t;
1267
1268 typedef struct
1269 {
1270 u32 cmds[0x100];
1271
1272 } kernel_rule_t;
1273
1274 typedef struct
1275 {
1276 u32 gidvid;
1277 u32 il_pos;
1278
1279 } plain_t;
1280
1281 typedef struct
1282 {
1283 u32 i[64];
1284
1285 u32 pw_len;
1286
1287 u32 alignment_placeholder_1;
1288 u32 alignment_placeholder_2;
1289 u32 alignment_placeholder_3;
1290
1291 } pw_t;
1292
1293 typedef struct
1294 {
1295 u32 i;
1296
1297 } bf_t;
1298
1299 typedef struct
1300 {
1301 u32 i[8];
1302
1303 u32 pw_len;
1304
1305 } comb_t;
1306
1307 typedef struct
1308 {
1309 u32 b[32];
1310
1311 } bs_word_t;
1312
1313 typedef struct
1314 {
1315 uint4 P[64];
1316
1317 } scrypt_tmp_t;