xref: /freebsd-src/sys/contrib/libb2/blake2.h (revision 0e33efe4e4b5d24e2d416938af8bc6e6e4160ec8)
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 #pragma once
14*0e33efe4SConrad Meyer #ifndef __BLAKE2_H__
15*0e33efe4SConrad Meyer #define __BLAKE2_H__
16*0e33efe4SConrad Meyer 
17*0e33efe4SConrad Meyer #include <stddef.h>
18*0e33efe4SConrad Meyer #include <stdint.h>
19*0e33efe4SConrad Meyer 
20*0e33efe4SConrad Meyer #if defined(_WIN32) || defined(__CYGWIN__)
21*0e33efe4SConrad Meyer     #define BLAKE2_DLL_IMPORT __declspec(dllimport)
22*0e33efe4SConrad Meyer     #define BLAKE2_DLL_EXPORT __declspec(dllexport)
23*0e33efe4SConrad Meyer     #define BLAKE2_DLL_PRIVATE
24*0e33efe4SConrad Meyer #elif __GNUC__ >= 4
25*0e33efe4SConrad Meyer   #define BLAKE2_DLL_IMPORT   __attribute__ ((visibility ("default")))
26*0e33efe4SConrad Meyer   #define BLAKE2_DLL_EXPORT   __attribute__ ((visibility ("default")))
27*0e33efe4SConrad Meyer   #define BLAKE2_DLL_PRIVATE  __attribute__ ((visibility ("hidden")))
28*0e33efe4SConrad Meyer #else
29*0e33efe4SConrad Meyer   #define BLAKE2_DLL_IMPORT
30*0e33efe4SConrad Meyer   #define BLAKE2_DLL_EXPORT
31*0e33efe4SConrad Meyer   #define BLAKE2_DLL_PRIVATE
32*0e33efe4SConrad Meyer #endif
33*0e33efe4SConrad Meyer 
34*0e33efe4SConrad Meyer #if defined(BLAKE2_DLL)
35*0e33efe4SConrad Meyer   #if defined(BLAKE2_DLL_EXPORTS) // defined if we are building the DLL
36*0e33efe4SConrad Meyer     #define BLAKE2_API BLAKE2_DLL_EXPORT
37*0e33efe4SConrad Meyer   #else
38*0e33efe4SConrad Meyer     #define BLAKE2_API BLAKE2_DLL_IMPORT
39*0e33efe4SConrad Meyer   #endif
40*0e33efe4SConrad Meyer   #define BLAKE2_PRIVATE BLAKE2_DLL_PRIVATE // must only be used by hidden logic
41*0e33efe4SConrad Meyer #else
42*0e33efe4SConrad Meyer   #define BLAKE2_API
43*0e33efe4SConrad Meyer   #define BLAKE2_PRIVATE
44*0e33efe4SConrad Meyer #endif
45*0e33efe4SConrad Meyer 
46*0e33efe4SConrad Meyer #if defined(__cplusplus)
47*0e33efe4SConrad Meyer extern "C" {
48*0e33efe4SConrad Meyer #elif defined(_MSC_VER) && !defined(inline)
49*0e33efe4SConrad Meyer #define inline __inline
50*0e33efe4SConrad Meyer #endif
51*0e33efe4SConrad Meyer 
52*0e33efe4SConrad Meyer   enum blake2s_constant
53*0e33efe4SConrad Meyer   {
54*0e33efe4SConrad Meyer     BLAKE2S_BLOCKBYTES = 64,
55*0e33efe4SConrad Meyer     BLAKE2S_OUTBYTES   = 32,
56*0e33efe4SConrad Meyer     BLAKE2S_KEYBYTES   = 32,
57*0e33efe4SConrad Meyer     BLAKE2S_SALTBYTES  = 8,
58*0e33efe4SConrad Meyer     BLAKE2S_PERSONALBYTES = 8
59*0e33efe4SConrad Meyer   };
60*0e33efe4SConrad Meyer 
61*0e33efe4SConrad Meyer   enum blake2b_constant
62*0e33efe4SConrad Meyer   {
63*0e33efe4SConrad Meyer     BLAKE2B_BLOCKBYTES = 128,
64*0e33efe4SConrad Meyer     BLAKE2B_OUTBYTES   = 64,
65*0e33efe4SConrad Meyer     BLAKE2B_KEYBYTES   = 64,
66*0e33efe4SConrad Meyer     BLAKE2B_SALTBYTES  = 16,
67*0e33efe4SConrad Meyer     BLAKE2B_PERSONALBYTES = 16
68*0e33efe4SConrad Meyer   };
69*0e33efe4SConrad Meyer 
70*0e33efe4SConrad Meyer #pragma pack(push, 1)
71*0e33efe4SConrad Meyer   typedef struct __blake2s_param
72*0e33efe4SConrad Meyer   {
73*0e33efe4SConrad Meyer     uint8_t  digest_length; // 1
74*0e33efe4SConrad Meyer     uint8_t  key_length;    // 2
75*0e33efe4SConrad Meyer     uint8_t  fanout;        // 3
76*0e33efe4SConrad Meyer     uint8_t  depth;         // 4
77*0e33efe4SConrad Meyer     uint32_t leaf_length;   // 8
78*0e33efe4SConrad Meyer     uint8_t  node_offset[6];// 14
79*0e33efe4SConrad Meyer     uint8_t  node_depth;    // 15
80*0e33efe4SConrad Meyer     uint8_t  inner_length;  // 16
81*0e33efe4SConrad Meyer     // uint8_t  reserved[0];
82*0e33efe4SConrad Meyer     uint8_t  salt[BLAKE2S_SALTBYTES]; // 24
83*0e33efe4SConrad Meyer     uint8_t  personal[BLAKE2S_PERSONALBYTES];  // 32
84*0e33efe4SConrad Meyer   } blake2s_param;
85*0e33efe4SConrad Meyer 
86*0e33efe4SConrad Meyer   typedef struct __blake2s_state
87*0e33efe4SConrad Meyer   {
88*0e33efe4SConrad Meyer     uint32_t h[8];
89*0e33efe4SConrad Meyer     uint32_t t[2];
90*0e33efe4SConrad Meyer     uint32_t f[2];
91*0e33efe4SConrad Meyer     uint8_t  buf[2 * BLAKE2S_BLOCKBYTES];
92*0e33efe4SConrad Meyer     uint32_t buflen;
93*0e33efe4SConrad Meyer     uint8_t  outlen;
94*0e33efe4SConrad Meyer     uint8_t  last_node;
95*0e33efe4SConrad Meyer   } blake2s_state;
96*0e33efe4SConrad Meyer 
97*0e33efe4SConrad Meyer   typedef struct __blake2b_param
98*0e33efe4SConrad Meyer   {
99*0e33efe4SConrad Meyer     uint8_t  digest_length; // 1
100*0e33efe4SConrad Meyer     uint8_t  key_length;    // 2
101*0e33efe4SConrad Meyer     uint8_t  fanout;        // 3
102*0e33efe4SConrad Meyer     uint8_t  depth;         // 4
103*0e33efe4SConrad Meyer     uint32_t leaf_length;   // 8
104*0e33efe4SConrad Meyer     uint64_t node_offset;   // 16
105*0e33efe4SConrad Meyer     uint8_t  node_depth;    // 17
106*0e33efe4SConrad Meyer     uint8_t  inner_length;  // 18
107*0e33efe4SConrad Meyer     uint8_t  reserved[14];  // 32
108*0e33efe4SConrad Meyer     uint8_t  salt[BLAKE2B_SALTBYTES]; // 48
109*0e33efe4SConrad Meyer     uint8_t  personal[BLAKE2B_PERSONALBYTES];  // 64
110*0e33efe4SConrad Meyer   } blake2b_param;
111*0e33efe4SConrad Meyer 
112*0e33efe4SConrad Meyer   typedef struct __blake2b_state
113*0e33efe4SConrad Meyer   {
114*0e33efe4SConrad Meyer     uint64_t h[8];
115*0e33efe4SConrad Meyer     uint64_t t[2];
116*0e33efe4SConrad Meyer     uint64_t f[2];
117*0e33efe4SConrad Meyer     uint8_t  buf[2 * BLAKE2B_BLOCKBYTES];
118*0e33efe4SConrad Meyer     uint32_t buflen;
119*0e33efe4SConrad Meyer     uint8_t  outlen;
120*0e33efe4SConrad Meyer     uint8_t  last_node;
121*0e33efe4SConrad Meyer   } blake2b_state;
122*0e33efe4SConrad Meyer 
123*0e33efe4SConrad Meyer   typedef struct __blake2sp_state
124*0e33efe4SConrad Meyer   {
125*0e33efe4SConrad Meyer     blake2s_state S[8][1];
126*0e33efe4SConrad Meyer     blake2s_state R[1];
127*0e33efe4SConrad Meyer     uint8_t  buf[8 * BLAKE2S_BLOCKBYTES];
128*0e33efe4SConrad Meyer     uint32_t buflen;
129*0e33efe4SConrad Meyer     uint8_t  outlen;
130*0e33efe4SConrad Meyer   } blake2sp_state;
131*0e33efe4SConrad Meyer 
132*0e33efe4SConrad Meyer   typedef struct __blake2bp_state
133*0e33efe4SConrad Meyer   {
134*0e33efe4SConrad Meyer     blake2b_state S[4][1];
135*0e33efe4SConrad Meyer     blake2b_state R[1];
136*0e33efe4SConrad Meyer     uint8_t  buf[4 * BLAKE2B_BLOCKBYTES];
137*0e33efe4SConrad Meyer     uint32_t buflen;
138*0e33efe4SConrad Meyer     uint8_t  outlen;
139*0e33efe4SConrad Meyer   } blake2bp_state;
140*0e33efe4SConrad Meyer #pragma pack(pop)
141*0e33efe4SConrad Meyer 
142*0e33efe4SConrad Meyer   // Streaming API
143*0e33efe4SConrad Meyer   BLAKE2_API int blake2s_init( blake2s_state *S, size_t outlen );
144*0e33efe4SConrad Meyer   BLAKE2_API int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
145*0e33efe4SConrad Meyer   BLAKE2_API int blake2s_init_param( blake2s_state *S, const blake2s_param *P );
146*0e33efe4SConrad Meyer   BLAKE2_API int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen );
147*0e33efe4SConrad Meyer   BLAKE2_API int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen );
148*0e33efe4SConrad Meyer 
149*0e33efe4SConrad Meyer   BLAKE2_API int blake2b_init( blake2b_state *S, size_t outlen );
150*0e33efe4SConrad Meyer   BLAKE2_API int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
151*0e33efe4SConrad Meyer   BLAKE2_API int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
152*0e33efe4SConrad Meyer   BLAKE2_API int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen );
153*0e33efe4SConrad Meyer   BLAKE2_API int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen );
154*0e33efe4SConrad Meyer 
155*0e33efe4SConrad Meyer   BLAKE2_API int blake2sp_init( blake2sp_state *S, size_t outlen );
156*0e33efe4SConrad Meyer   BLAKE2_API int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen );
157*0e33efe4SConrad Meyer   BLAKE2_API int blake2sp_update( blake2sp_state *S, const uint8_t *in, size_t inlen );
158*0e33efe4SConrad Meyer   BLAKE2_API int blake2sp_final( blake2sp_state *S, uint8_t *out, size_t outlen );
159*0e33efe4SConrad Meyer 
160*0e33efe4SConrad Meyer   BLAKE2_API int blake2bp_init( blake2bp_state *S, size_t outlen );
161*0e33efe4SConrad Meyer   BLAKE2_API int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen );
162*0e33efe4SConrad Meyer   BLAKE2_API int blake2bp_update( blake2bp_state *S, const uint8_t *in, size_t inlen );
163*0e33efe4SConrad Meyer   BLAKE2_API int blake2bp_final( blake2bp_state *S, uint8_t *out, size_t outlen );
164*0e33efe4SConrad Meyer 
165*0e33efe4SConrad Meyer   // Simple API
166*0e33efe4SConrad Meyer   BLAKE2_API int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
167*0e33efe4SConrad Meyer   BLAKE2_API int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
168*0e33efe4SConrad Meyer 
169*0e33efe4SConrad Meyer   BLAKE2_API int blake2sp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
170*0e33efe4SConrad Meyer   BLAKE2_API int blake2bp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
171*0e33efe4SConrad Meyer 
blake2(uint8_t * out,const void * in,const void * key,size_t outlen,size_t inlen,size_t keylen)172*0e33efe4SConrad Meyer   static inline int blake2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen )
173*0e33efe4SConrad Meyer   {
174*0e33efe4SConrad Meyer     return blake2b( out, in, key, outlen, inlen, keylen );
175*0e33efe4SConrad Meyer   }
176*0e33efe4SConrad Meyer 
177*0e33efe4SConrad Meyer #if defined(__cplusplus)
178*0e33efe4SConrad Meyer }
179*0e33efe4SConrad Meyer #endif
180*0e33efe4SConrad Meyer 
181*0e33efe4SConrad Meyer #endif
182*0e33efe4SConrad Meyer 
183