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