1*0e33efe4SConrad Meyer /*
2*0e33efe4SConrad Meyer BLAKE2 reference source code package - optimized C implementations
3*0e33efe4SConrad Meyer
4*0e33efe4SConrad Meyer Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
5*0e33efe4SConrad Meyer
6*0e33efe4SConrad Meyer To the extent possible under law, the author(s) have dedicated all copyright
7*0e33efe4SConrad Meyer and related and neighboring rights to this software to the public domain
8*0e33efe4SConrad Meyer worldwide. This software is distributed without any warranty.
9*0e33efe4SConrad Meyer
10*0e33efe4SConrad Meyer You should have received a copy of the CC0 Public Domain Dedication along with
11*0e33efe4SConrad Meyer this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
12*0e33efe4SConrad Meyer */
13*0e33efe4SConrad Meyer #include <stdio.h>
14*0e33efe4SConrad Meyer #if defined(WIN32)
15*0e33efe4SConrad Meyer #include <windows.h>
16*0e33efe4SConrad Meyer #endif
17*0e33efe4SConrad Meyer #include "blake2.h"
18*0e33efe4SConrad Meyer
19*0e33efe4SConrad Meyer #if defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
20*0e33efe4SConrad Meyer #define HAVE_X86
21*0e33efe4SConrad Meyer #endif
22*0e33efe4SConrad Meyer
23*0e33efe4SConrad Meyer typedef enum
24*0e33efe4SConrad Meyer {
25*0e33efe4SConrad Meyer NONE = 0,
26*0e33efe4SConrad Meyer #if defined(HAVE_X86)
27*0e33efe4SConrad Meyer SSE2 = 1,
28*0e33efe4SConrad Meyer SSSE3 = 2,
29*0e33efe4SConrad Meyer SSE41 = 3,
30*0e33efe4SConrad Meyer AVX = 4,
31*0e33efe4SConrad Meyer XOP = 5,
32*0e33efe4SConrad Meyer /* AVX2 = 6, */
33*0e33efe4SConrad Meyer #endif
34*0e33efe4SConrad Meyer } cpu_feature_t;
35*0e33efe4SConrad Meyer
36*0e33efe4SConrad Meyer static const char feature_names[][8] =
37*0e33efe4SConrad Meyer {
38*0e33efe4SConrad Meyer "none",
39*0e33efe4SConrad Meyer #if defined(HAVE_X86)
40*0e33efe4SConrad Meyer "sse2",
41*0e33efe4SConrad Meyer "ssse3",
42*0e33efe4SConrad Meyer "sse41",
43*0e33efe4SConrad Meyer "avx",
44*0e33efe4SConrad Meyer "xop",
45*0e33efe4SConrad Meyer /* "avx2" */
46*0e33efe4SConrad Meyer #endif
47*0e33efe4SConrad Meyer };
48*0e33efe4SConrad Meyer
49*0e33efe4SConrad Meyer #if defined(HAVE_X86)
50*0e33efe4SConrad Meyer
51*0e33efe4SConrad Meyer #if defined(__GNUC__)
cpuid(uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)52*0e33efe4SConrad Meyer static inline void cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx )
53*0e33efe4SConrad Meyer {
54*0e33efe4SConrad Meyer __asm__ __volatile__(
55*0e33efe4SConrad Meyer #if defined(__i386__) /* This is needed for -fPIC to work on i386 */
56*0e33efe4SConrad Meyer "movl %%ebx, %%esi\n\t"
57*0e33efe4SConrad Meyer #endif
58*0e33efe4SConrad Meyer "cpuid\n\t"
59*0e33efe4SConrad Meyer #if defined(__i386__)
60*0e33efe4SConrad Meyer "xchgl %%ebx, %%esi\n\t"
61*0e33efe4SConrad Meyer : "=a"( *eax ), "=S"( *ebx ), "=c"( *ecx ), "=d"( *edx ) : "a"( *eax ) );
62*0e33efe4SConrad Meyer #else
63*0e33efe4SConrad Meyer : "=a"( *eax ), "=b"( *ebx ), "=c"( *ecx ), "=d"( *edx ) : "a"( *eax ) );
64*0e33efe4SConrad Meyer #endif
65*0e33efe4SConrad Meyer }
66*0e33efe4SConrad Meyer
xgetbv(uint32_t xcr)67*0e33efe4SConrad Meyer static inline uint64_t xgetbv(uint32_t xcr)
68*0e33efe4SConrad Meyer {
69*0e33efe4SConrad Meyer uint32_t a, d;
70*0e33efe4SConrad Meyer __asm__ __volatile__(
71*0e33efe4SConrad Meyer "xgetbv"
72*0e33efe4SConrad Meyer : "=a"(a),"=d"(d)
73*0e33efe4SConrad Meyer : "c"(xcr)
74*0e33efe4SConrad Meyer );
75*0e33efe4SConrad Meyer return ((uint64_t)d << 32) | a;
76*0e33efe4SConrad Meyer }
77*0e33efe4SConrad Meyer
78*0e33efe4SConrad Meyer #elif defined(_MSC_VER)
79*0e33efe4SConrad Meyer #include <intrin.h>
cpuid(uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)80*0e33efe4SConrad Meyer static inline void cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx )
81*0e33efe4SConrad Meyer {
82*0e33efe4SConrad Meyer int regs[4];
83*0e33efe4SConrad Meyer __cpuid( regs, *eax );
84*0e33efe4SConrad Meyer *eax = regs[0];
85*0e33efe4SConrad Meyer *ebx = regs[1];
86*0e33efe4SConrad Meyer *ecx = regs[2];
87*0e33efe4SConrad Meyer *edx = regs[3];
88*0e33efe4SConrad Meyer }
89*0e33efe4SConrad Meyer #else
90*0e33efe4SConrad Meyer #error "Don't know how to call cpuid on this compiler!"
91*0e33efe4SConrad Meyer #endif
92*0e33efe4SConrad Meyer
93*0e33efe4SConrad Meyer #endif /* HAVE_X86 */
94*0e33efe4SConrad Meyer
get_cpu_features(void)95*0e33efe4SConrad Meyer static inline cpu_feature_t get_cpu_features( void )
96*0e33efe4SConrad Meyer {
97*0e33efe4SConrad Meyer #if defined(HAVE_X86)
98*0e33efe4SConrad Meyer static volatile int initialized = 0;
99*0e33efe4SConrad Meyer static cpu_feature_t feature = NONE; // Safe default
100*0e33efe4SConrad Meyer uint32_t eax, ecx, edx, ebx;
101*0e33efe4SConrad Meyer
102*0e33efe4SConrad Meyer if( initialized )
103*0e33efe4SConrad Meyer return feature;
104*0e33efe4SConrad Meyer
105*0e33efe4SConrad Meyer eax = 1;
106*0e33efe4SConrad Meyer cpuid( &eax, &ebx, &ecx, &edx );
107*0e33efe4SConrad Meyer
108*0e33efe4SConrad Meyer if( 1 & ( edx >> 26 ) )
109*0e33efe4SConrad Meyer feature = SSE2;
110*0e33efe4SConrad Meyer
111*0e33efe4SConrad Meyer if( 1 & ( ecx >> 9 ) )
112*0e33efe4SConrad Meyer feature = SSSE3;
113*0e33efe4SConrad Meyer
114*0e33efe4SConrad Meyer if( 1 & ( ecx >> 19 ) )
115*0e33efe4SConrad Meyer feature = SSE41;
116*0e33efe4SConrad Meyer
117*0e33efe4SConrad Meyer #if defined(WIN32) /* Work around the fact that Windows <7 does NOT support AVX... */
118*0e33efe4SConrad Meyer if( IsProcessorFeaturePresent(17) ) /* Some environments don't know about PF_XSAVE_ENABLED */
119*0e33efe4SConrad Meyer #endif
120*0e33efe4SConrad Meyer {
121*0e33efe4SConrad Meyer /* check for AVX and OSXSAVE bits */
122*0e33efe4SConrad Meyer if( 1 & ( ecx >> 28 ) & (ecx >> 27) ) {
123*0e33efe4SConrad Meyer #if !defined(WIN32) /* Already checked for this in WIN32 */
124*0e33efe4SConrad Meyer if( (xgetbv(0) & 6) == 6 ) /* XCR0 */
125*0e33efe4SConrad Meyer #endif
126*0e33efe4SConrad Meyer feature = AVX;
127*0e33efe4SConrad Meyer }
128*0e33efe4SConrad Meyer
129*0e33efe4SConrad Meyer
130*0e33efe4SConrad Meyer eax = 0x80000001;
131*0e33efe4SConrad Meyer cpuid( &eax, &ebx, &ecx, &edx );
132*0e33efe4SConrad Meyer
133*0e33efe4SConrad Meyer if( 1 & ( ecx >> 11 ) )
134*0e33efe4SConrad Meyer feature = XOP;
135*0e33efe4SConrad Meyer }
136*0e33efe4SConrad Meyer
137*0e33efe4SConrad Meyer /* For future architectures */
138*0e33efe4SConrad Meyer /*
139*0e33efe4SConrad Meyer eax = 7; ecx = 0;
140*0e33efe4SConrad Meyer cpuid(&eax, &ebx, &ecx, &edx);
141*0e33efe4SConrad Meyer
142*0e33efe4SConrad Meyer if(1&(ebx >> 5))
143*0e33efe4SConrad Meyer feature = AVX2;
144*0e33efe4SConrad Meyer */
145*0e33efe4SConrad Meyer /* fprintf( stderr, "Using %s engine\n", feature_names[feature] ); */
146*0e33efe4SConrad Meyer initialized = 1;
147*0e33efe4SConrad Meyer return feature;
148*0e33efe4SConrad Meyer #else
149*0e33efe4SConrad Meyer return NONE;
150*0e33efe4SConrad Meyer #endif
151*0e33efe4SConrad Meyer }
152*0e33efe4SConrad Meyer
153*0e33efe4SConrad Meyer
154*0e33efe4SConrad Meyer
155*0e33efe4SConrad Meyer #if defined(__cplusplus)
156*0e33efe4SConrad Meyer extern "C" {
157*0e33efe4SConrad Meyer #endif
158*0e33efe4SConrad Meyer int blake2b_init_ref( blake2b_state *S, size_t outlen );
159*0e33efe4SConrad Meyer int blake2b_init_key_ref( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
160*0e33efe4SConrad Meyer int blake2b_init_param_ref( blake2b_state *S, const blake2b_param *P );
161*0e33efe4SConrad Meyer int blake2b_update_ref( blake2b_state *S, const uint8_t *in, size_t inlen );
162*0e33efe4SConrad Meyer int blake2b_final_ref( blake2b_state *S, uint8_t *out, size_t outlen );
163*0e33efe4SConrad Meyer int blake2b_ref( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
164*0e33efe4SConrad Meyer
165*0e33efe4SConrad Meyer #if defined(HAVE_X86)
166*0e33efe4SConrad Meyer
167*0e33efe4SConrad Meyer int blake2b_init_sse2( blake2b_state *S, size_t outlen );
168*0e33efe4SConrad Meyer int blake2b_init_key_sse2( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
169*0e33efe4SConrad Meyer int blake2b_init_param_sse2( blake2b_state *S, const blake2b_param *P );
170*0e33efe4SConrad Meyer int blake2b_update_sse2( blake2b_state *S, const uint8_t *in, size_t inlen );
171*0e33efe4SConrad Meyer int blake2b_final_sse2( blake2b_state *S, uint8_t *out, size_t outlen );
172*0e33efe4SConrad Meyer int blake2b_sse2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
173*0e33efe4SConrad Meyer
174*0e33efe4SConrad Meyer int blake2b_init_ssse3( blake2b_state *S, size_t outlen );
175*0e33efe4SConrad Meyer int blake2b_init_key_ssse3( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
176*0e33efe4SConrad Meyer int blake2b_init_param_ssse3( blake2b_state *S, const blake2b_param *P );
177*0e33efe4SConrad Meyer int blake2b_update_ssse3( blake2b_state *S, const uint8_t *in, size_t inlen );
178*0e33efe4SConrad Meyer int blake2b_final_ssse3( blake2b_state *S, uint8_t *out, size_t outlen );
179*0e33efe4SConrad Meyer int blake2b_ssse3( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
180*0e33efe4SConrad Meyer
181*0e33efe4SConrad Meyer int blake2b_init_sse41( blake2b_state *S, size_t outlen );
182*0e33efe4SConrad Meyer int blake2b_init_key_sse41( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
183*0e33efe4SConrad Meyer int blake2b_init_param_sse41( blake2b_state *S, const blake2b_param *P );
184*0e33efe4SConrad Meyer int blake2b_update_sse41( blake2b_state *S, const uint8_t *in, size_t inlen );
185*0e33efe4SConrad Meyer int blake2b_final_sse41( blake2b_state *S, uint8_t *out, size_t outlen );
186*0e33efe4SConrad Meyer int blake2b_sse41( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
187*0e33efe4SConrad Meyer
188*0e33efe4SConrad Meyer int blake2b_init_avx( blake2b_state *S, size_t outlen );
189*0e33efe4SConrad Meyer int blake2b_init_key_avx( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
190*0e33efe4SConrad Meyer int blake2b_init_param_avx( blake2b_state *S, const blake2b_param *P );
191*0e33efe4SConrad Meyer int blake2b_update_avx( blake2b_state *S, const uint8_t *in, size_t inlen );
192*0e33efe4SConrad Meyer int blake2b_final_avx( blake2b_state *S, uint8_t *out, size_t outlen );
193*0e33efe4SConrad Meyer int blake2b_avx( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
194*0e33efe4SConrad Meyer
195*0e33efe4SConrad Meyer int blake2b_init_xop( blake2b_state *S, size_t outlen );
196*0e33efe4SConrad Meyer int blake2b_init_key_xop( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
197*0e33efe4SConrad Meyer int blake2b_init_param_xop( blake2b_state *S, const blake2b_param *P );
198*0e33efe4SConrad Meyer int blake2b_update_xop( blake2b_state *S, const uint8_t *in, size_t inlen );
199*0e33efe4SConrad Meyer int blake2b_final_xop( blake2b_state *S, uint8_t *out, size_t outlen );
200*0e33efe4SConrad Meyer int blake2b_xop( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
201*0e33efe4SConrad Meyer
202*0e33efe4SConrad Meyer #endif /* HAVE_X86 */
203*0e33efe4SConrad Meyer
204*0e33efe4SConrad Meyer int blake2s_init_ref( blake2s_state *S, size_t outlen );
205*0e33efe4SConrad Meyer int blake2s_init_key_ref( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
206*0e33efe4SConrad Meyer int blake2s_init_param_ref( blake2s_state *S, const blake2s_param *P );
207*0e33efe4SConrad Meyer int blake2s_update_ref( blake2s_state *S, const uint8_t *in, size_t inlen );
208*0e33efe4SConrad Meyer int blake2s_final_ref( blake2s_state *S, uint8_t *out, size_t outlen );
209*0e33efe4SConrad Meyer int blake2s_ref( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
210*0e33efe4SConrad Meyer
211*0e33efe4SConrad Meyer #if defined(HAVE_X86)
212*0e33efe4SConrad Meyer
213*0e33efe4SConrad Meyer int blake2s_init_sse2( blake2s_state *S, size_t outlen );
214*0e33efe4SConrad Meyer int blake2s_init_key_sse2( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
215*0e33efe4SConrad Meyer int blake2s_init_param_sse2( blake2s_state *S, const blake2s_param *P );
216*0e33efe4SConrad Meyer int blake2s_update_sse2( blake2s_state *S, const uint8_t *in, size_t inlen );
217*0e33efe4SConrad Meyer int blake2s_final_sse2( blake2s_state *S, uint8_t *out, size_t outlen );
218*0e33efe4SConrad Meyer int blake2s_sse2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
219*0e33efe4SConrad Meyer
220*0e33efe4SConrad Meyer int blake2s_init_ssse3( blake2s_state *S, size_t outlen );
221*0e33efe4SConrad Meyer int blake2s_init_key_ssse3( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
222*0e33efe4SConrad Meyer int blake2s_init_param_ssse3( blake2s_state *S, const blake2s_param *P );
223*0e33efe4SConrad Meyer int blake2s_update_ssse3( blake2s_state *S, const uint8_t *in, size_t inlen );
224*0e33efe4SConrad Meyer int blake2s_final_ssse3( blake2s_state *S, uint8_t *out, size_t outlen );
225*0e33efe4SConrad Meyer int blake2s_ssse3( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
226*0e33efe4SConrad Meyer
227*0e33efe4SConrad Meyer int blake2s_init_sse41( blake2s_state *S, size_t outlen );
228*0e33efe4SConrad Meyer int blake2s_init_key_sse41( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
229*0e33efe4SConrad Meyer int blake2s_init_param_sse41( blake2s_state *S, const blake2s_param *P );
230*0e33efe4SConrad Meyer int blake2s_update_sse41( blake2s_state *S, const uint8_t *in, size_t inlen );
231*0e33efe4SConrad Meyer int blake2s_final_sse41( blake2s_state *S, uint8_t *out, size_t outlen );
232*0e33efe4SConrad Meyer int blake2s_sse41( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
233*0e33efe4SConrad Meyer
234*0e33efe4SConrad Meyer int blake2s_init_avx( blake2s_state *S, size_t outlen );
235*0e33efe4SConrad Meyer int blake2s_init_key_avx( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
236*0e33efe4SConrad Meyer int blake2s_init_param_avx( blake2s_state *S, const blake2s_param *P );
237*0e33efe4SConrad Meyer int blake2s_update_avx( blake2s_state *S, const uint8_t *in, size_t inlen );
238*0e33efe4SConrad Meyer int blake2s_final_avx( blake2s_state *S, uint8_t *out, size_t outlen );
239*0e33efe4SConrad Meyer int blake2s_avx( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
240*0e33efe4SConrad Meyer
241*0e33efe4SConrad Meyer int blake2s_init_xop( blake2s_state *S, size_t outlen );
242*0e33efe4SConrad Meyer int blake2s_init_key_xop( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
243*0e33efe4SConrad Meyer int blake2s_init_param_xop( blake2s_state *S, const blake2s_param *P );
244*0e33efe4SConrad Meyer int blake2s_update_xop( blake2s_state *S, const uint8_t *in, size_t inlen );
245*0e33efe4SConrad Meyer int blake2s_final_xop( blake2s_state *S, uint8_t *out, size_t outlen );
246*0e33efe4SConrad Meyer int blake2s_xop( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
247*0e33efe4SConrad Meyer
248*0e33efe4SConrad Meyer #endif /* HAVE_X86 */
249*0e33efe4SConrad Meyer
250*0e33efe4SConrad Meyer #if defined(__cplusplus)
251*0e33efe4SConrad Meyer }
252*0e33efe4SConrad Meyer #endif
253*0e33efe4SConrad Meyer
254*0e33efe4SConrad Meyer typedef int ( *blake2b_init_fn )( blake2b_state *, size_t );
255*0e33efe4SConrad Meyer typedef int ( *blake2b_init_key_fn )( blake2b_state *, size_t, const void *, size_t );
256*0e33efe4SConrad Meyer typedef int ( *blake2b_init_param_fn )( blake2b_state *, const blake2b_param * );
257*0e33efe4SConrad Meyer typedef int ( *blake2b_update_fn )( blake2b_state *, const uint8_t *, size_t );
258*0e33efe4SConrad Meyer typedef int ( *blake2b_final_fn )( blake2b_state *, uint8_t *, size_t );
259*0e33efe4SConrad Meyer typedef int ( *blake2b_fn )( uint8_t *, const void *, const void *, size_t, size_t, size_t );
260*0e33efe4SConrad Meyer
261*0e33efe4SConrad Meyer typedef int ( *blake2s_init_fn )( blake2s_state *, size_t );
262*0e33efe4SConrad Meyer typedef int ( *blake2s_init_key_fn )( blake2s_state *, size_t, const void *, size_t );
263*0e33efe4SConrad Meyer typedef int ( *blake2s_init_param_fn )( blake2s_state *, const blake2s_param * );
264*0e33efe4SConrad Meyer typedef int ( *blake2s_update_fn )( blake2s_state *, const uint8_t *, size_t );
265*0e33efe4SConrad Meyer typedef int ( *blake2s_final_fn )( blake2s_state *, uint8_t *, size_t );
266*0e33efe4SConrad Meyer typedef int ( *blake2s_fn )( uint8_t *, const void *, const void *, size_t, size_t, size_t );
267*0e33efe4SConrad Meyer
268*0e33efe4SConrad Meyer static const blake2b_init_fn blake2b_init_table[] =
269*0e33efe4SConrad Meyer {
270*0e33efe4SConrad Meyer blake2b_init_ref,
271*0e33efe4SConrad Meyer #if defined(HAVE_X86)
272*0e33efe4SConrad Meyer blake2b_init_sse2,
273*0e33efe4SConrad Meyer blake2b_init_ssse3,
274*0e33efe4SConrad Meyer blake2b_init_sse41,
275*0e33efe4SConrad Meyer blake2b_init_avx,
276*0e33efe4SConrad Meyer blake2b_init_xop
277*0e33efe4SConrad Meyer #endif
278*0e33efe4SConrad Meyer };
279*0e33efe4SConrad Meyer
280*0e33efe4SConrad Meyer static const blake2b_init_key_fn blake2b_init_key_table[] =
281*0e33efe4SConrad Meyer {
282*0e33efe4SConrad Meyer blake2b_init_key_ref,
283*0e33efe4SConrad Meyer #if defined(HAVE_X86)
284*0e33efe4SConrad Meyer blake2b_init_key_sse2,
285*0e33efe4SConrad Meyer blake2b_init_key_ssse3,
286*0e33efe4SConrad Meyer blake2b_init_key_sse41,
287*0e33efe4SConrad Meyer blake2b_init_key_avx,
288*0e33efe4SConrad Meyer blake2b_init_key_xop
289*0e33efe4SConrad Meyer #endif
290*0e33efe4SConrad Meyer };
291*0e33efe4SConrad Meyer
292*0e33efe4SConrad Meyer static const blake2b_init_param_fn blake2b_init_param_table[] =
293*0e33efe4SConrad Meyer {
294*0e33efe4SConrad Meyer blake2b_init_param_ref,
295*0e33efe4SConrad Meyer #if defined(HAVE_X86)
296*0e33efe4SConrad Meyer blake2b_init_param_sse2,
297*0e33efe4SConrad Meyer blake2b_init_param_ssse3,
298*0e33efe4SConrad Meyer blake2b_init_param_sse41,
299*0e33efe4SConrad Meyer blake2b_init_param_avx,
300*0e33efe4SConrad Meyer blake2b_init_param_xop
301*0e33efe4SConrad Meyer #endif
302*0e33efe4SConrad Meyer };
303*0e33efe4SConrad Meyer
304*0e33efe4SConrad Meyer static const blake2b_update_fn blake2b_update_table[] =
305*0e33efe4SConrad Meyer {
306*0e33efe4SConrad Meyer blake2b_update_ref,
307*0e33efe4SConrad Meyer #if defined(HAVE_X86)
308*0e33efe4SConrad Meyer blake2b_update_sse2,
309*0e33efe4SConrad Meyer blake2b_update_ssse3,
310*0e33efe4SConrad Meyer blake2b_update_sse41,
311*0e33efe4SConrad Meyer blake2b_update_avx,
312*0e33efe4SConrad Meyer blake2b_update_xop
313*0e33efe4SConrad Meyer #endif
314*0e33efe4SConrad Meyer };
315*0e33efe4SConrad Meyer
316*0e33efe4SConrad Meyer static const blake2b_final_fn blake2b_final_table[] =
317*0e33efe4SConrad Meyer {
318*0e33efe4SConrad Meyer blake2b_final_ref,
319*0e33efe4SConrad Meyer #if defined(HAVE_X86)
320*0e33efe4SConrad Meyer blake2b_final_sse2,
321*0e33efe4SConrad Meyer blake2b_final_ssse3,
322*0e33efe4SConrad Meyer blake2b_final_sse41,
323*0e33efe4SConrad Meyer blake2b_final_avx,
324*0e33efe4SConrad Meyer blake2b_final_xop
325*0e33efe4SConrad Meyer #endif
326*0e33efe4SConrad Meyer };
327*0e33efe4SConrad Meyer
328*0e33efe4SConrad Meyer static const blake2b_fn blake2b_table[] =
329*0e33efe4SConrad Meyer {
330*0e33efe4SConrad Meyer blake2b_ref,
331*0e33efe4SConrad Meyer #if defined(HAVE_X86)
332*0e33efe4SConrad Meyer blake2b_sse2,
333*0e33efe4SConrad Meyer blake2b_ssse3,
334*0e33efe4SConrad Meyer blake2b_sse41,
335*0e33efe4SConrad Meyer blake2b_avx,
336*0e33efe4SConrad Meyer blake2b_xop
337*0e33efe4SConrad Meyer #endif
338*0e33efe4SConrad Meyer };
339*0e33efe4SConrad Meyer
340*0e33efe4SConrad Meyer static const blake2s_init_fn blake2s_init_table[] =
341*0e33efe4SConrad Meyer {
342*0e33efe4SConrad Meyer blake2s_init_ref,
343*0e33efe4SConrad Meyer #if defined(HAVE_X86)
344*0e33efe4SConrad Meyer blake2s_init_sse2,
345*0e33efe4SConrad Meyer blake2s_init_ssse3,
346*0e33efe4SConrad Meyer blake2s_init_sse41,
347*0e33efe4SConrad Meyer blake2s_init_avx,
348*0e33efe4SConrad Meyer blake2s_init_xop
349*0e33efe4SConrad Meyer #endif
350*0e33efe4SConrad Meyer };
351*0e33efe4SConrad Meyer
352*0e33efe4SConrad Meyer static const blake2s_init_key_fn blake2s_init_key_table[] =
353*0e33efe4SConrad Meyer {
354*0e33efe4SConrad Meyer blake2s_init_key_ref,
355*0e33efe4SConrad Meyer #if defined(HAVE_X86)
356*0e33efe4SConrad Meyer blake2s_init_key_sse2,
357*0e33efe4SConrad Meyer blake2s_init_key_ssse3,
358*0e33efe4SConrad Meyer blake2s_init_key_sse41,
359*0e33efe4SConrad Meyer blake2s_init_key_avx,
360*0e33efe4SConrad Meyer blake2s_init_key_xop
361*0e33efe4SConrad Meyer #endif
362*0e33efe4SConrad Meyer };
363*0e33efe4SConrad Meyer
364*0e33efe4SConrad Meyer static const blake2s_init_param_fn blake2s_init_param_table[] =
365*0e33efe4SConrad Meyer {
366*0e33efe4SConrad Meyer blake2s_init_param_ref,
367*0e33efe4SConrad Meyer #if defined(HAVE_X86)
368*0e33efe4SConrad Meyer blake2s_init_param_sse2,
369*0e33efe4SConrad Meyer blake2s_init_param_ssse3,
370*0e33efe4SConrad Meyer blake2s_init_param_sse41,
371*0e33efe4SConrad Meyer blake2s_init_param_avx,
372*0e33efe4SConrad Meyer blake2s_init_param_xop
373*0e33efe4SConrad Meyer #endif
374*0e33efe4SConrad Meyer };
375*0e33efe4SConrad Meyer
376*0e33efe4SConrad Meyer static const blake2s_update_fn blake2s_update_table[] =
377*0e33efe4SConrad Meyer {
378*0e33efe4SConrad Meyer blake2s_update_ref,
379*0e33efe4SConrad Meyer #if defined(HAVE_X86)
380*0e33efe4SConrad Meyer blake2s_update_sse2,
381*0e33efe4SConrad Meyer blake2s_update_ssse3,
382*0e33efe4SConrad Meyer blake2s_update_sse41,
383*0e33efe4SConrad Meyer blake2s_update_avx,
384*0e33efe4SConrad Meyer blake2s_update_xop
385*0e33efe4SConrad Meyer #endif
386*0e33efe4SConrad Meyer };
387*0e33efe4SConrad Meyer
388*0e33efe4SConrad Meyer static const blake2s_final_fn blake2s_final_table[] =
389*0e33efe4SConrad Meyer {
390*0e33efe4SConrad Meyer blake2s_final_ref,
391*0e33efe4SConrad Meyer #if defined(HAVE_X86)
392*0e33efe4SConrad Meyer blake2s_final_sse2,
393*0e33efe4SConrad Meyer blake2s_final_ssse3,
394*0e33efe4SConrad Meyer blake2s_final_sse41,
395*0e33efe4SConrad Meyer blake2s_final_avx,
396*0e33efe4SConrad Meyer blake2s_final_xop
397*0e33efe4SConrad Meyer #endif
398*0e33efe4SConrad Meyer };
399*0e33efe4SConrad Meyer
400*0e33efe4SConrad Meyer static const blake2s_fn blake2s_table[] =
401*0e33efe4SConrad Meyer {
402*0e33efe4SConrad Meyer blake2s_ref,
403*0e33efe4SConrad Meyer #if defined(HAVE_X86)
404*0e33efe4SConrad Meyer blake2s_sse2,
405*0e33efe4SConrad Meyer blake2s_ssse3,
406*0e33efe4SConrad Meyer blake2s_sse41,
407*0e33efe4SConrad Meyer blake2s_avx,
408*0e33efe4SConrad Meyer blake2s_xop
409*0e33efe4SConrad Meyer #endif
410*0e33efe4SConrad Meyer };
411*0e33efe4SConrad Meyer
412*0e33efe4SConrad Meyer #if defined(__cplusplus)
413*0e33efe4SConrad Meyer extern "C" {
414*0e33efe4SConrad Meyer #endif
415*0e33efe4SConrad Meyer int blake2b_init_dispatch( blake2b_state *S, size_t outlen );
416*0e33efe4SConrad Meyer int blake2b_init_key_dispatch( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
417*0e33efe4SConrad Meyer int blake2b_init_param_dispatch( blake2b_state *S, const blake2b_param *P );
418*0e33efe4SConrad Meyer int blake2b_update_dispatch( blake2b_state *S, const uint8_t *in, size_t inlen );
419*0e33efe4SConrad Meyer int blake2b_final_dispatch( blake2b_state *S, uint8_t *out, size_t outlen );
420*0e33efe4SConrad Meyer int blake2b_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
421*0e33efe4SConrad Meyer
422*0e33efe4SConrad Meyer int blake2s_init_dispatch( blake2s_state *S, size_t outlen );
423*0e33efe4SConrad Meyer int blake2s_init_key_dispatch( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
424*0e33efe4SConrad Meyer int blake2s_init_param_dispatch( blake2s_state *S, const blake2s_param *P );
425*0e33efe4SConrad Meyer int blake2s_update_dispatch( blake2s_state *S, const uint8_t *in, size_t inlen );
426*0e33efe4SConrad Meyer int blake2s_final_dispatch( blake2s_state *S, uint8_t *out, size_t outlen );
427*0e33efe4SConrad Meyer int blake2s_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
428*0e33efe4SConrad Meyer #if defined(__cplusplus)
429*0e33efe4SConrad Meyer }
430*0e33efe4SConrad Meyer #endif
431*0e33efe4SConrad Meyer
432*0e33efe4SConrad Meyer static blake2b_init_fn blake2b_init_ptr = blake2b_init_dispatch;
433*0e33efe4SConrad Meyer static blake2b_init_key_fn blake2b_init_key_ptr = blake2b_init_key_dispatch;
434*0e33efe4SConrad Meyer static blake2b_init_param_fn blake2b_init_param_ptr = blake2b_init_param_dispatch;
435*0e33efe4SConrad Meyer static blake2b_update_fn blake2b_update_ptr = blake2b_update_dispatch;
436*0e33efe4SConrad Meyer static blake2b_final_fn blake2b_final_ptr = blake2b_final_dispatch;
437*0e33efe4SConrad Meyer static blake2b_fn blake2b_ptr = blake2b_dispatch;
438*0e33efe4SConrad Meyer
439*0e33efe4SConrad Meyer static blake2s_init_fn blake2s_init_ptr = blake2s_init_dispatch;
440*0e33efe4SConrad Meyer static blake2s_init_key_fn blake2s_init_key_ptr = blake2s_init_key_dispatch;
441*0e33efe4SConrad Meyer static blake2s_init_param_fn blake2s_init_param_ptr = blake2s_init_param_dispatch;
442*0e33efe4SConrad Meyer static blake2s_update_fn blake2s_update_ptr = blake2s_update_dispatch;
443*0e33efe4SConrad Meyer static blake2s_final_fn blake2s_final_ptr = blake2s_final_dispatch;
444*0e33efe4SConrad Meyer static blake2s_fn blake2s_ptr = blake2s_dispatch;
445*0e33efe4SConrad Meyer
blake2b_init_dispatch(blake2b_state * S,size_t outlen)446*0e33efe4SConrad Meyer int blake2b_init_dispatch( blake2b_state *S, size_t outlen )
447*0e33efe4SConrad Meyer {
448*0e33efe4SConrad Meyer blake2b_init_ptr = blake2b_init_table[get_cpu_features()];
449*0e33efe4SConrad Meyer return blake2b_init_ptr( S, outlen );
450*0e33efe4SConrad Meyer }
451*0e33efe4SConrad Meyer
blake2b_init_key_dispatch(blake2b_state * S,size_t outlen,const void * key,size_t keylen)452*0e33efe4SConrad Meyer int blake2b_init_key_dispatch( blake2b_state *S, size_t outlen, const void *key, size_t keylen )
453*0e33efe4SConrad Meyer {
454*0e33efe4SConrad Meyer blake2b_init_key_ptr = blake2b_init_key_table[get_cpu_features()];
455*0e33efe4SConrad Meyer return blake2b_init_key_ptr( S, outlen, key, keylen );
456*0e33efe4SConrad Meyer }
457*0e33efe4SConrad Meyer
blake2b_init_param_dispatch(blake2b_state * S,const blake2b_param * P)458*0e33efe4SConrad Meyer int blake2b_init_param_dispatch( blake2b_state *S, const blake2b_param *P )
459*0e33efe4SConrad Meyer {
460*0e33efe4SConrad Meyer blake2b_init_param_ptr = blake2b_init_param_table[get_cpu_features()];
461*0e33efe4SConrad Meyer return blake2b_init_param_ptr( S, P );
462*0e33efe4SConrad Meyer }
463*0e33efe4SConrad Meyer
blake2b_update_dispatch(blake2b_state * S,const uint8_t * in,size_t inlen)464*0e33efe4SConrad Meyer int blake2b_update_dispatch( blake2b_state *S, const uint8_t *in, size_t inlen )
465*0e33efe4SConrad Meyer {
466*0e33efe4SConrad Meyer blake2b_update_ptr = blake2b_update_table[get_cpu_features()];
467*0e33efe4SConrad Meyer return blake2b_update_ptr( S, in, inlen );
468*0e33efe4SConrad Meyer }
469*0e33efe4SConrad Meyer
blake2b_final_dispatch(blake2b_state * S,uint8_t * out,size_t outlen)470*0e33efe4SConrad Meyer int blake2b_final_dispatch( blake2b_state *S, uint8_t *out, size_t outlen )
471*0e33efe4SConrad Meyer {
472*0e33efe4SConrad Meyer blake2b_final_ptr = blake2b_final_table[get_cpu_features()];
473*0e33efe4SConrad Meyer return blake2b_final_ptr( S, out, outlen );
474*0e33efe4SConrad Meyer }
475*0e33efe4SConrad Meyer
blake2b_dispatch(uint8_t * out,const void * in,const void * key,size_t outlen,size_t inlen,size_t keylen)476*0e33efe4SConrad Meyer int blake2b_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen )
477*0e33efe4SConrad Meyer {
478*0e33efe4SConrad Meyer blake2b_ptr = blake2b_table[get_cpu_features()];
479*0e33efe4SConrad Meyer return blake2b_ptr( out, in, key, outlen, inlen, keylen );
480*0e33efe4SConrad Meyer }
481*0e33efe4SConrad Meyer
blake2b_init(blake2b_state * S,size_t outlen)482*0e33efe4SConrad Meyer BLAKE2_API int blake2b_init( blake2b_state *S, size_t outlen )
483*0e33efe4SConrad Meyer {
484*0e33efe4SConrad Meyer return blake2b_init_ptr( S, outlen );
485*0e33efe4SConrad Meyer }
486*0e33efe4SConrad Meyer
blake2b_init_key(blake2b_state * S,size_t outlen,const void * key,size_t keylen)487*0e33efe4SConrad Meyer BLAKE2_API int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen )
488*0e33efe4SConrad Meyer {
489*0e33efe4SConrad Meyer return blake2b_init_key_ptr( S, outlen, key, keylen );
490*0e33efe4SConrad Meyer }
491*0e33efe4SConrad Meyer
blake2b_init_param(blake2b_state * S,const blake2b_param * P)492*0e33efe4SConrad Meyer BLAKE2_API int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
493*0e33efe4SConrad Meyer {
494*0e33efe4SConrad Meyer return blake2b_init_param_ptr( S, P );
495*0e33efe4SConrad Meyer }
496*0e33efe4SConrad Meyer
blake2b_update(blake2b_state * S,const uint8_t * in,size_t inlen)497*0e33efe4SConrad Meyer BLAKE2_API int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen )
498*0e33efe4SConrad Meyer {
499*0e33efe4SConrad Meyer return blake2b_update_ptr( S, in, inlen );
500*0e33efe4SConrad Meyer }
501*0e33efe4SConrad Meyer
blake2b_final(blake2b_state * S,uint8_t * out,size_t outlen)502*0e33efe4SConrad Meyer BLAKE2_API int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen )
503*0e33efe4SConrad Meyer {
504*0e33efe4SConrad Meyer return blake2b_final_ptr( S, out, outlen );
505*0e33efe4SConrad Meyer }
506*0e33efe4SConrad Meyer
blake2b(uint8_t * out,const void * in,const void * key,size_t outlen,size_t inlen,size_t keylen)507*0e33efe4SConrad Meyer BLAKE2_API int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen )
508*0e33efe4SConrad Meyer {
509*0e33efe4SConrad Meyer return blake2b_ptr( out, in, key, outlen, inlen, keylen );
510*0e33efe4SConrad Meyer }
511*0e33efe4SConrad Meyer
blake2s_init_dispatch(blake2s_state * S,size_t outlen)512*0e33efe4SConrad Meyer int blake2s_init_dispatch( blake2s_state *S, size_t outlen )
513*0e33efe4SConrad Meyer {
514*0e33efe4SConrad Meyer blake2s_init_ptr = blake2s_init_table[get_cpu_features()];
515*0e33efe4SConrad Meyer return blake2s_init_ptr( S, outlen );
516*0e33efe4SConrad Meyer }
517*0e33efe4SConrad Meyer
blake2s_init_key_dispatch(blake2s_state * S,size_t outlen,const void * key,size_t keylen)518*0e33efe4SConrad Meyer int blake2s_init_key_dispatch( blake2s_state *S, size_t outlen, const void *key, size_t keylen )
519*0e33efe4SConrad Meyer {
520*0e33efe4SConrad Meyer blake2s_init_key_ptr = blake2s_init_key_table[get_cpu_features()];
521*0e33efe4SConrad Meyer return blake2s_init_key_ptr( S, outlen, key, keylen );
522*0e33efe4SConrad Meyer }
523*0e33efe4SConrad Meyer
blake2s_init_param_dispatch(blake2s_state * S,const blake2s_param * P)524*0e33efe4SConrad Meyer int blake2s_init_param_dispatch( blake2s_state *S, const blake2s_param *P )
525*0e33efe4SConrad Meyer {
526*0e33efe4SConrad Meyer blake2s_init_param_ptr = blake2s_init_param_table[get_cpu_features()];
527*0e33efe4SConrad Meyer return blake2s_init_param_ptr( S, P );
528*0e33efe4SConrad Meyer }
529*0e33efe4SConrad Meyer
blake2s_update_dispatch(blake2s_state * S,const uint8_t * in,size_t inlen)530*0e33efe4SConrad Meyer int blake2s_update_dispatch( blake2s_state *S, const uint8_t *in, size_t inlen )
531*0e33efe4SConrad Meyer {
532*0e33efe4SConrad Meyer blake2s_update_ptr = blake2s_update_table[get_cpu_features()];
533*0e33efe4SConrad Meyer return blake2s_update_ptr( S, in, inlen );
534*0e33efe4SConrad Meyer }
535*0e33efe4SConrad Meyer
blake2s_final_dispatch(blake2s_state * S,uint8_t * out,size_t outlen)536*0e33efe4SConrad Meyer int blake2s_final_dispatch( blake2s_state *S, uint8_t *out, size_t outlen )
537*0e33efe4SConrad Meyer {
538*0e33efe4SConrad Meyer blake2s_final_ptr = blake2s_final_table[get_cpu_features()];
539*0e33efe4SConrad Meyer return blake2s_final_ptr( S, out, outlen );
540*0e33efe4SConrad Meyer }
541*0e33efe4SConrad Meyer
blake2s_dispatch(uint8_t * out,const void * in,const void * key,size_t outlen,size_t inlen,size_t keylen)542*0e33efe4SConrad Meyer int blake2s_dispatch( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen )
543*0e33efe4SConrad Meyer {
544*0e33efe4SConrad Meyer blake2s_ptr = blake2s_table[get_cpu_features()];
545*0e33efe4SConrad Meyer return blake2s_ptr( out, in, key, outlen, inlen, keylen );
546*0e33efe4SConrad Meyer }
547*0e33efe4SConrad Meyer
blake2s_init(blake2s_state * S,size_t outlen)548*0e33efe4SConrad Meyer BLAKE2_API int blake2s_init( blake2s_state *S, size_t outlen )
549*0e33efe4SConrad Meyer {
550*0e33efe4SConrad Meyer return blake2s_init_ptr( S, outlen );
551*0e33efe4SConrad Meyer }
552*0e33efe4SConrad Meyer
blake2s_init_key(blake2s_state * S,size_t outlen,const void * key,size_t keylen)553*0e33efe4SConrad Meyer BLAKE2_API int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen )
554*0e33efe4SConrad Meyer {
555*0e33efe4SConrad Meyer return blake2s_init_key_ptr( S, outlen, key, keylen );
556*0e33efe4SConrad Meyer }
557*0e33efe4SConrad Meyer
blake2s_init_param(blake2s_state * S,const blake2s_param * P)558*0e33efe4SConrad Meyer BLAKE2_API int blake2s_init_param( blake2s_state *S, const blake2s_param *P )
559*0e33efe4SConrad Meyer {
560*0e33efe4SConrad Meyer return blake2s_init_param_ptr( S, P );
561*0e33efe4SConrad Meyer }
562*0e33efe4SConrad Meyer
blake2s_update(blake2s_state * S,const uint8_t * in,size_t inlen)563*0e33efe4SConrad Meyer BLAKE2_API int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen )
564*0e33efe4SConrad Meyer {
565*0e33efe4SConrad Meyer return blake2s_update_ptr( S, in, inlen );
566*0e33efe4SConrad Meyer }
567*0e33efe4SConrad Meyer
blake2s_final(blake2s_state * S,uint8_t * out,size_t outlen)568*0e33efe4SConrad Meyer BLAKE2_API int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen )
569*0e33efe4SConrad Meyer {
570*0e33efe4SConrad Meyer return blake2s_final_ptr( S, out, outlen );
571*0e33efe4SConrad Meyer }
572*0e33efe4SConrad Meyer
blake2s(uint8_t * out,const void * in,const void * key,size_t outlen,size_t inlen,size_t keylen)573*0e33efe4SConrad Meyer BLAKE2_API int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen )
574*0e33efe4SConrad Meyer {
575*0e33efe4SConrad Meyer return blake2s_ptr( out, in, key, outlen, inlen, keylen );
576*0e33efe4SConrad Meyer }
577*0e33efe4SConrad Meyer
578