Merge pull request #135 from gm4tr1x/master
[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 static inline u64 rotr64 (const u64 a, const u32 n)
286 {
287 u32 il;
288 u32 ir;
289
290 asm ("mov.b64 {%0, %1}, %2;" : "=r"(il), "=r"(ir) : "l"(a));
291
292 u32 tl;
293 u32 tr;
294
295 if (n >= 32)
296 {
297 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tl) : "r"(ir), "r"(il), "r"(n - 32));
298 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tr) : "r"(il), "r"(ir), "r"(n - 32));
299 }
300 else
301 {
302 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tl) : "r"(il), "r"(ir), "r"(n));
303 asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tr) : "r"(ir), "r"(il), "r"(n));
304 }
305
306 u64 r;
307
308 asm ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tl), "r"(tr));
309
310 return r;
311 }
312
313 static inline u64 rotl64 (const u64 a, const u32 n)
314 {
315 return rotr64 (a, 64 - n);
316 }
317 #endif
318
319 #ifdef IS_GENERIC
320
321 static inline u32x rotr32 (const u32x a, const u32x n)
322 {
323 return rotate (a, 32 - n);
324 }
325
326 static inline u32x rotl32 (const u32x a, const u32x n)
327 {
328 return rotate (a, n);
329 }
330
331 static inline u64 rotr64 (const u64 a, const u32 n)
332 {
333 return rotate (a, (u64) 64 - n);
334 }
335
336 static inline u64 rotl64 (const u64 a, const u32 n)
337 {
338 return rotate (a, (u64) n);
339 }
340 #endif
341
342 #ifdef IS_NV
343 #if CUDA_ARCH >= 500
344 static inline u32x lut3_2d (const u32x a, const u32x b, const u32x c)
345 {
346 u32x r;
347
348 #if VECT_SIZE == 1
349 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
350 #endif
351
352 #if VECT_SIZE == 2
353 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
354 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
355 #endif
356
357 #if VECT_SIZE == 4
358 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
359 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
360 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
361 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
362 #endif
363
364 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
370 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
371 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
372 asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
373 #endif
374
375 return r;
376 }
377
378 static inline u32x lut3_39 (const u32x a, const u32x b, const u32x c)
379 {
380 u32x r;
381
382 #if VECT_SIZE == 1
383 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
384 #endif
385
386 #if VECT_SIZE == 2
387 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
388 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
389 #endif
390
391 #if VECT_SIZE == 4
392 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
393 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
394 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
395 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
396 #endif
397
398 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
404 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
405 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
406 asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
407 #endif
408
409 return r;
410 }
411
412 static inline u32x lut3_59 (const u32x a, const u32x b, const u32x c)
413 {
414 u32x r;
415
416 #if VECT_SIZE == 1
417 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
418 #endif
419
420 #if VECT_SIZE == 2
421 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
422 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
423 #endif
424
425 #if VECT_SIZE == 4
426 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
427 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
428 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
429 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
430 #endif
431
432 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
438 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
439 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
440 asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
441 #endif
442
443 return r;
444 }
445
446 static inline u32x lut3_96 (const u32x a, const u32x b, const u32x c)
447 {
448 u32x r;
449
450 #if VECT_SIZE == 1
451 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
452 #endif
453
454 #if VECT_SIZE == 2
455 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
456 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
457 #endif
458
459 #if VECT_SIZE == 4
460 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
461 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
462 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
463 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
464 #endif
465
466 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
472 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
473 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
474 asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
475 #endif
476
477 return r;
478 }
479
480 static inline u32x lut3_e4 (const u32x a, const u32x b, const u32x c)
481 {
482 u32x r;
483
484 #if VECT_SIZE == 1
485 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
486 #endif
487
488 #if VECT_SIZE == 2
489 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
490 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
491 #endif
492
493 #if VECT_SIZE == 4
494 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
495 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
496 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
497 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
498 #endif
499
500 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
506 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
507 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
508 asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
509 #endif
510
511 return r;
512 }
513
514 static inline u32x lut3_e8 (const u32x a, const u32x b, const u32x c)
515 {
516 u32x r;
517
518 #if VECT_SIZE == 1
519 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
520 #endif
521
522 #if VECT_SIZE == 2
523 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
524 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
525 #endif
526
527 #if VECT_SIZE == 4
528 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
529 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
530 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
531 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
532 #endif
533
534 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
540 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
541 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
542 asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
543 #endif
544
545 return r;
546 }
547
548 static inline u32x lut3_ca (const u32x a, const u32x b, const u32x c)
549 {
550 u32x r;
551
552 #if VECT_SIZE == 1
553 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r) : "r" (a), "r" (b), "r" (c));
554 #endif
555
556 #if VECT_SIZE == 2
557 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
558 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
559 #endif
560
561 #if VECT_SIZE == 4
562 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s0) : "r" (a.s0), "r" (b.s0), "r" (c.s0));
563 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s1) : "r" (a.s1), "r" (b.s1), "r" (c.s1));
564 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s2) : "r" (a.s2), "r" (b.s2), "r" (c.s2));
565 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s3) : "r" (a.s3), "r" (b.s3), "r" (c.s3));
566 #endif
567
568 #if VECT_SIZE == 8
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 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s4) : "r" (a.s4), "r" (b.s4), "r" (c.s4));
574 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s5) : "r" (a.s5), "r" (b.s5), "r" (c.s5));
575 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s6) : "r" (a.s6), "r" (b.s6), "r" (c.s6));
576 asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r.s7) : "r" (a.s7), "r" (b.s7), "r" (c.s7));
577 #endif
578
579 return r;
580 }
581
582 #endif
583 #endif
584
585 typedef struct
586 {
587 #if defined _DES_
588 u32 digest_buf[4];
589 #elif defined _MD4_
590 u32 digest_buf[4];
591 #elif defined _MD5_
592 u32 digest_buf[4];
593 #elif defined _MD5H_
594 u32 digest_buf[4];
595 #elif defined _SHA1_
596 u32 digest_buf[5];
597 #elif defined _BCRYPT_
598 u32 digest_buf[6];
599 #elif defined _SHA256_
600 u32 digest_buf[8];
601 #elif defined _SHA384_
602 u32 digest_buf[16];
603 #elif defined _SHA512_
604 u32 digest_buf[16];
605 #elif defined _KECCAK_
606 u32 digest_buf[50];
607 #elif defined _RIPEMD160_
608 u32 digest_buf[5];
609 #elif defined _WHIRLPOOL_
610 u32 digest_buf[16];
611 #elif defined _GOST_
612 u32 digest_buf[8];
613 #elif defined _GOST2012_256_
614 u32 digest_buf[8];
615 #elif defined _GOST2012_512_
616 u32 digest_buf[16];
617 #elif defined _SAPB_
618 u32 digest_buf[4];
619 #elif defined _SAPG_
620 u32 digest_buf[5];
621 #elif defined _MYSQL323_
622 u32 digest_buf[4];
623 #elif defined _LOTUS5_
624 u32 digest_buf[4];
625 #elif defined _LOTUS6_
626 u32 digest_buf[4];
627 #elif defined _SCRYPT_
628 u32 digest_buf[8];
629 #elif defined _LOTUS8_
630 u32 digest_buf[4];
631 #elif defined _OFFICE2007_
632 u32 digest_buf[4];
633 #elif defined _OFFICE2010_
634 u32 digest_buf[4];
635 #elif defined _OFFICE2013_
636 u32 digest_buf[4];
637 #elif defined _OLDOFFICE01_
638 u32 digest_buf[4];
639 #elif defined _OLDOFFICE34_
640 u32 digest_buf[4];
641 #elif defined _SIPHASH_
642 u32 digest_buf[4];
643 #elif defined _PBKDF2_MD5_
644 u32 digest_buf[32];
645 #elif defined _PBKDF2_SHA1_
646 u32 digest_buf[32];
647 #elif defined _PBKDF2_SHA256_
648 u32 digest_buf[32];
649 #elif defined _PBKDF2_SHA512_
650 u32 digest_buf[32];
651 #elif defined _PDF17L8_
652 u32 digest_buf[8];
653 #elif defined _CRC32_
654 u32 digest_buf[4];
655 #elif defined _SEVEN_ZIP_
656 u32 digest_buf[4];
657 #elif defined _ANDROIDFDE_
658 u32 digest_buf[4];
659 #elif defined _DCC2_
660 u32 digest_buf[4];
661 #elif defined _WPA_
662 u32 digest_buf[4];
663 #elif defined _MD5_SHA1_
664 u32 digest_buf[4];
665 #elif defined _SHA1_MD5_
666 u32 digest_buf[5];
667 #elif defined _NETNTLMV2_
668 u32 digest_buf[4];
669 #elif defined _KRB5PA_
670 u32 digest_buf[4];
671 #elif defined _CLOUDKEY_
672 u32 digest_buf[8];
673 #elif defined _SCRYPT_
674 u32 digest_buf[4];
675 #elif defined _PSAFE2_
676 u32 digest_buf[5];
677 #elif defined _LOTUS8_
678 u32 digest_buf[4];
679 #elif defined _RAR3_
680 u32 digest_buf[4];
681 #elif defined _SHA256_SHA1_
682 u32 digest_buf[8];
683 #elif defined _MS_DRSR_
684 u32 digest_buf[8];
685 #elif defined _ANDROIDFDE_SAMSUNG_
686 u32 digest_buf[8];
687 #elif defined _RAR5_
688 u32 digest_buf[4];
689 #endif
690
691 } digest_t;
692
693 typedef struct
694 {
695 u32 salt_buf[16];
696 u32 salt_buf_pc[8];
697
698 u32 salt_len;
699 u32 salt_iter;
700 u32 salt_sign[2];
701
702 u32 keccak_mdlen;
703 u32 truecrypt_mdlen;
704
705 u32 digests_cnt;
706 u32 digests_done;
707
708 u32 digests_offset;
709
710 u32 scrypt_N;
711 u32 scrypt_r;
712 u32 scrypt_p;
713 u32 scrypt_tmto;
714 u32 scrypt_phy;
715
716 } salt_t;
717
718 typedef struct
719 {
720 int V;
721 int R;
722 int P;
723
724 int enc_md;
725
726 u32 id_buf[8];
727 u32 u_buf[32];
728 u32 o_buf[32];
729
730 int id_len;
731 int o_len;
732 int u_len;
733
734 u32 rc4key[2];
735 u32 rc4data[2];
736
737 } pdf_t;
738
739 typedef struct
740 {
741 u32 pke[25];
742 u32 eapol[64];
743 int eapol_size;
744 int keyver;
745
746 } wpa_t;
747
748 typedef struct
749 {
750 u32 cry_master_buf[64];
751 u32 ckey_buf[64];
752 u32 public_key_buf[64];
753
754 u32 cry_master_len;
755 u32 ckey_len;
756 u32 public_key_len;
757
758 } bitcoin_wallet_t;
759
760 typedef struct
761 {
762 u32 salt_buf[30];
763 u32 salt_len;
764
765 u32 esalt_buf[38];
766 u32 esalt_len;
767
768 } sip_t;
769
770 typedef struct
771 {
772 u32 data[384];
773
774 } androidfde_t;
775
776 typedef struct
777 {
778 u32 nr_buf[16];
779 u32 nr_len;
780
781 u32 msg_buf[128];
782 u32 msg_len;
783
784 } ikepsk_t;
785
786 typedef struct
787 {
788 u32 user_len;
789 u32 domain_len;
790 u32 srvchall_len;
791 u32 clichall_len;
792
793 u32 userdomain_buf[64];
794 u32 chall_buf[256];
795
796 } netntlm_t;
797
798 typedef struct
799 {
800 u32 user[16];
801 u32 realm[16];
802 u32 salt[32];
803 u32 timestamp[16];
804 u32 checksum[4];
805
806 } krb5pa_t;
807
808 typedef struct
809 {
810 u32 salt_buf[16];
811 u32 data_buf[112];
812 u32 keyfile_buf[16];
813
814 } tc_t;
815
816 typedef struct
817 {
818 u32 salt_buf[16];
819
820 } pbkdf2_md5_t;
821
822 typedef struct
823 {
824 u32 salt_buf[16];
825
826 } pbkdf2_sha1_t;
827
828 typedef struct
829 {
830 u32 salt_buf[16];
831
832 } pbkdf2_sha256_t;
833
834 typedef struct
835 {
836 u32 salt_buf[32];
837
838 } pbkdf2_sha512_t;
839
840 typedef struct
841 {
842 u32 salt_buf[128];
843 u32 salt_len;
844
845 } rakp_t;
846
847 typedef struct
848 {
849 u32 data_len;
850 u32 data_buf[512];
851
852 } cloudkey_t;
853
854 typedef struct
855 {
856 u32 encryptedVerifier[4];
857 u32 encryptedVerifierHash[5];
858
859 u32 keySize;
860
861 } office2007_t;
862
863 typedef struct
864 {
865 u32 encryptedVerifier[4];
866 u32 encryptedVerifierHash[8];
867
868 } office2010_t;
869
870 typedef struct
871 {
872 u32 encryptedVerifier[4];
873 u32 encryptedVerifierHash[8];
874
875 } office2013_t;
876
877 typedef struct
878 {
879 u32 version;
880 u32 encryptedVerifier[4];
881 u32 encryptedVerifierHash[4];
882 u32 rc4key[2];
883
884 } oldoffice01_t;
885
886 typedef struct
887 {
888 u32 version;
889 u32 encryptedVerifier[4];
890 u32 encryptedVerifierHash[5];
891 u32 rc4key[2];
892
893 } oldoffice34_t;
894
895 typedef struct
896 {
897 u32 digest[4];
898 u32 out[4];
899
900 } pdf14_tmp_t;
901
902 typedef struct
903 {
904 union
905 {
906 u32 dgst32[16];
907 u64 dgst64[8];
908 };
909
910 u32 dgst_len;
911 u32 W_len;
912
913 } pdf17l8_tmp_t;
914
915 typedef struct
916 {
917 u32 digest_buf[4];
918
919 } phpass_tmp_t;
920
921 typedef struct
922 {
923 u32 digest_buf[4];
924
925 } md5crypt_tmp_t;
926
927 typedef struct
928 {
929 u32 alt_result[8];
930
931 u32 p_bytes[4];
932 u32 s_bytes[4];
933
934 } sha256crypt_tmp_t;
935
936 typedef struct
937 {
938 u64 l_alt_result[8];
939
940 u64 l_p_bytes[2];
941 u64 l_s_bytes[2];
942
943 } sha512crypt_tmp_t;
944
945 typedef struct
946 {
947 u32 ipad[5];
948 u32 opad[5];
949
950 u32 dgst[10];
951 u32 out[10];
952
953 } wpa_tmp_t;
954
955 typedef struct
956 {
957 u64 dgst[8];
958
959 } bitcoin_wallet_tmp_t;
960
961 typedef struct
962 {
963 u32 ipad[5];
964 u32 opad[5];
965
966 u32 dgst[5];
967 u32 out[4];
968
969 } dcc2_tmp_t;
970
971 typedef struct
972 {
973 u32 E[18];
974
975 u32 P[18];
976
977 u32 S0[256];
978 u32 S1[256];
979 u32 S2[256];
980 u32 S3[256];
981
982 } bcrypt_tmp_t;
983
984 typedef struct
985 {
986 u32 digest[2];
987
988 u32 P[18];
989
990 u32 S0[256];
991 u32 S1[256];
992 u32 S2[256];
993 u32 S3[256];
994
995 } pwsafe2_tmp_t;
996
997 typedef struct
998 {
999 u32 digest_buf[8];
1000
1001 } pwsafe3_tmp_t;
1002
1003 typedef struct
1004 {
1005 u32 digest_buf[5];
1006
1007 } androidpin_tmp_t;
1008
1009 typedef struct
1010 {
1011 u32 ipad[5];
1012 u32 opad[5];
1013
1014 u32 dgst[10];
1015 u32 out[10];
1016
1017 } androidfde_tmp_t;
1018
1019 typedef struct
1020 {
1021 u32 ipad[16];
1022 u32 opad[16];
1023
1024 u32 dgst[64];
1025 u32 out[64];
1026
1027 } tc_tmp_t;
1028
1029 typedef struct
1030 {
1031 u64 ipad[8];
1032 u64 opad[8];
1033
1034 u64 dgst[32];
1035 u64 out[32];
1036
1037 } tc64_tmp_t;
1038
1039 typedef struct
1040 {
1041 u32 ipad[4];
1042 u32 opad[4];
1043
1044 u32 dgst[32];
1045 u32 out[32];
1046
1047 } pbkdf2_md5_tmp_t;
1048
1049 typedef struct
1050 {
1051 u32 ipad[5];
1052 u32 opad[5];
1053
1054 u32 dgst[32];
1055 u32 out[32];
1056
1057 } pbkdf2_sha1_tmp_t;
1058
1059 typedef struct
1060 {
1061 u32 ipad[8];
1062 u32 opad[8];
1063
1064 u32 dgst[32];
1065 u32 out[32];
1066
1067 } pbkdf2_sha256_tmp_t;
1068
1069 typedef struct
1070 {
1071 u64 ipad[8];
1072 u64 opad[8];
1073
1074 u64 dgst[16];
1075 u64 out[16];
1076
1077 } pbkdf2_sha512_tmp_t;
1078
1079 typedef struct
1080 {
1081 u64 out[8];
1082
1083 } ecryptfs_tmp_t;
1084
1085 typedef struct
1086 {
1087 u64 ipad[8];
1088 u64 opad[8];
1089
1090 u64 dgst[16];
1091 u64 out[16];
1092
1093 } oraclet_tmp_t;
1094
1095 typedef struct
1096 {
1097 u32 ipad[5];
1098 u32 opad[5];
1099
1100 u32 dgst[5];
1101 u32 out[5];
1102
1103 } agilekey_tmp_t;
1104
1105 typedef struct
1106 {
1107 u32 ipad[5];
1108 u32 opad[5];
1109
1110 u32 dgst1[5];
1111 u32 out1[5];
1112
1113 u32 dgst2[5];
1114 u32 out2[5];
1115
1116 } mywallet_tmp_t;
1117
1118 typedef struct
1119 {
1120 u32 ipad[5];
1121 u32 opad[5];
1122
1123 u32 dgst[5];
1124 u32 out[5];
1125
1126 } sha1aix_tmp_t;
1127
1128 typedef struct
1129 {
1130 u32 ipad[8];
1131 u32 opad[8];
1132
1133 u32 dgst[8];
1134 u32 out[8];
1135
1136 } sha256aix_tmp_t;
1137
1138 typedef struct
1139 {
1140 u64 ipad[8];
1141 u64 opad[8];
1142
1143 u64 dgst[8];
1144 u64 out[8];
1145
1146 } sha512aix_tmp_t;
1147
1148 typedef struct
1149 {
1150 u32 ipad[8];
1151 u32 opad[8];
1152
1153 u32 dgst[8];
1154 u32 out[8];
1155
1156 } lastpass_tmp_t;
1157
1158 typedef struct
1159 {
1160 u64 digest_buf[8];
1161
1162 } drupal7_tmp_t;
1163
1164 typedef struct
1165 {
1166 u32 ipad[5];
1167 u32 opad[5];
1168
1169 u32 dgst[5];
1170 u32 out[5];
1171
1172 } lotus8_tmp_t;
1173
1174 typedef struct
1175 {
1176 u32 out[5];
1177
1178 } office2007_tmp_t;
1179
1180 typedef struct
1181 {
1182 u32 out[5];
1183
1184 } office2010_tmp_t;
1185
1186 typedef struct
1187 {
1188 u64 out[8];
1189
1190 } office2013_tmp_t;
1191
1192 typedef struct
1193 {
1194 u32 digest_buf[5];
1195
1196 } saph_sha1_tmp_t;
1197
1198 typedef struct
1199 {
1200 u32 block[16];
1201
1202 u32 dgst[8];
1203
1204 u32 block_len;
1205 u32 final_len;
1206
1207 } seven_zip_tmp_t;
1208
1209 typedef struct
1210 {
1211 u32 Kc[16];
1212 u32 Kd[16];
1213
1214 u32 iv[2];
1215
1216 } bsdicrypt_tmp_t;
1217
1218 typedef struct
1219 {
1220 u32 dgst[17][5];
1221
1222 } rar3_tmp_t;
1223
1224 typedef struct
1225 {
1226 u32 user[16];
1227
1228 } cram_md5_t;
1229
1230 typedef struct
1231 {
1232 u32 iv_buf[4];
1233 u32 iv_len;
1234
1235 u32 salt_buf[4];
1236 u32 salt_len;
1237
1238 u32 crc;
1239
1240 u32 data_buf[96];
1241 u32 data_len;
1242
1243 u32 unpack_size;
1244
1245 } seven_zip_t;
1246
1247 typedef struct
1248 {
1249 u32 key;
1250 u64 val;
1251
1252 } hcstat_table_t;
1253
1254 typedef struct
1255 {
1256 u32 cs_buf[0x100];
1257 u32 cs_len;
1258
1259 } cs_t;
1260
1261 typedef struct
1262 {
1263 u32 cmds[0x100];
1264
1265 } kernel_rule_t;
1266
1267 typedef struct
1268 {
1269 u32 gidvid;
1270 u32 il_pos;
1271
1272 } plain_t;
1273
1274 typedef struct
1275 {
1276 u32 i[64];
1277
1278 u32 pw_len;
1279
1280 u32 alignment_placeholder_1;
1281 u32 alignment_placeholder_2;
1282 u32 alignment_placeholder_3;
1283
1284 } pw_t;
1285
1286 typedef struct
1287 {
1288 u32 i;
1289
1290 } bf_t;
1291
1292 typedef struct
1293 {
1294 u32 i[8];
1295
1296 u32 pw_len;
1297
1298 } comb_t;
1299
1300 typedef struct
1301 {
1302 u32 b[32];
1303
1304 } bs_word_t;
1305
1306 typedef struct
1307 {
1308 uint4 P[64];
1309
1310 } scrypt_tmp_t;