xref: /freebsd-src/contrib/libarchive/libarchive/archive_blake2.h (revision 833a452e9f082a7982a31c21f0da437dbbe0a39d)
1b1c91e4bSMartin Matuska /*
2b1c91e4bSMartin Matuska    BLAKE2 reference source code package - reference C implementations
3b1c91e4bSMartin Matuska 
4b1c91e4bSMartin Matuska    Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
5b1c91e4bSMartin Matuska    terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
6b1c91e4bSMartin Matuska    your option.  The terms of these licenses can be found at:
7b1c91e4bSMartin Matuska 
8b1c91e4bSMartin Matuska    - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
9b1c91e4bSMartin Matuska    - OpenSSL license   : https://www.openssl.org/source/license.html
10b1c91e4bSMartin Matuska    - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
11b1c91e4bSMartin Matuska 
12b1c91e4bSMartin Matuska    More information about the BLAKE2 hash function can be found at
13b1c91e4bSMartin Matuska    https://blake2.net.
14b1c91e4bSMartin Matuska */
15f9762417SMartin Matuska 
16f9762417SMartin Matuska #ifndef ARCHIVE_BLAKE2_H
17f9762417SMartin Matuska #define ARCHIVE_BLAKE2_H
18b1c91e4bSMartin Matuska 
19b1c91e4bSMartin Matuska #include <stddef.h>
20b1c91e4bSMartin Matuska #include <stdint.h>
21b1c91e4bSMartin Matuska 
22b1c91e4bSMartin Matuska #if defined(_MSC_VER)
23b1c91e4bSMartin Matuska #define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop))
24*833a452eSMartin Matuska #elif defined(__GNUC__)
25b1c91e4bSMartin Matuska #define BLAKE2_PACKED(x) x __attribute__((packed))
26*833a452eSMartin Matuska #else
27*833a452eSMartin Matuska #define BLAKE2_PACKED(x) _Pragma("pack 1") x _Pragma("pack 0")
28b1c91e4bSMartin Matuska #endif
29b1c91e4bSMartin Matuska 
30b1c91e4bSMartin Matuska #if defined(__cplusplus)
31b1c91e4bSMartin Matuska extern "C" {
32b1c91e4bSMartin Matuska #endif
33b1c91e4bSMartin Matuska 
34b1c91e4bSMartin Matuska   enum blake2s_constant
35b1c91e4bSMartin Matuska   {
36b1c91e4bSMartin Matuska     BLAKE2S_BLOCKBYTES = 64,
37b1c91e4bSMartin Matuska     BLAKE2S_OUTBYTES   = 32,
38b1c91e4bSMartin Matuska     BLAKE2S_KEYBYTES   = 32,
39b1c91e4bSMartin Matuska     BLAKE2S_SALTBYTES  = 8,
40b1c91e4bSMartin Matuska     BLAKE2S_PERSONALBYTES = 8
41b1c91e4bSMartin Matuska   };
42b1c91e4bSMartin Matuska 
43b1c91e4bSMartin Matuska   enum blake2b_constant
44b1c91e4bSMartin Matuska   {
45b1c91e4bSMartin Matuska     BLAKE2B_BLOCKBYTES = 128,
46b1c91e4bSMartin Matuska     BLAKE2B_OUTBYTES   = 64,
47b1c91e4bSMartin Matuska     BLAKE2B_KEYBYTES   = 64,
48b1c91e4bSMartin Matuska     BLAKE2B_SALTBYTES  = 16,
49b1c91e4bSMartin Matuska     BLAKE2B_PERSONALBYTES = 16
50b1c91e4bSMartin Matuska   };
51b1c91e4bSMartin Matuska 
52b1c91e4bSMartin Matuska   typedef struct blake2s_state__
53b1c91e4bSMartin Matuska   {
54b1c91e4bSMartin Matuska     uint32_t h[8];
55b1c91e4bSMartin Matuska     uint32_t t[2];
56b1c91e4bSMartin Matuska     uint32_t f[2];
57b1c91e4bSMartin Matuska     uint8_t  buf[BLAKE2S_BLOCKBYTES];
58b1c91e4bSMartin Matuska     size_t   buflen;
59b1c91e4bSMartin Matuska     size_t   outlen;
60b1c91e4bSMartin Matuska     uint8_t  last_node;
61b1c91e4bSMartin Matuska   } blake2s_state;
62b1c91e4bSMartin Matuska 
63b1c91e4bSMartin Matuska   typedef struct blake2b_state__
64b1c91e4bSMartin Matuska   {
65b1c91e4bSMartin Matuska     uint64_t h[8];
66b1c91e4bSMartin Matuska     uint64_t t[2];
67b1c91e4bSMartin Matuska     uint64_t f[2];
68b1c91e4bSMartin Matuska     uint8_t  buf[BLAKE2B_BLOCKBYTES];
69b1c91e4bSMartin Matuska     size_t   buflen;
70b1c91e4bSMartin Matuska     size_t   outlen;
71b1c91e4bSMartin Matuska     uint8_t  last_node;
72b1c91e4bSMartin Matuska   } blake2b_state;
73b1c91e4bSMartin Matuska 
74b1c91e4bSMartin Matuska   typedef struct blake2sp_state__
75b1c91e4bSMartin Matuska   {
76b1c91e4bSMartin Matuska     blake2s_state S[8][1];
77b1c91e4bSMartin Matuska     blake2s_state R[1];
78b1c91e4bSMartin Matuska     uint8_t       buf[8 * BLAKE2S_BLOCKBYTES];
79b1c91e4bSMartin Matuska     size_t        buflen;
80b1c91e4bSMartin Matuska     size_t        outlen;
81b1c91e4bSMartin Matuska   } blake2sp_state;
82b1c91e4bSMartin Matuska 
83b1c91e4bSMartin Matuska   typedef struct blake2bp_state__
84b1c91e4bSMartin Matuska   {
85b1c91e4bSMartin Matuska     blake2b_state S[4][1];
86b1c91e4bSMartin Matuska     blake2b_state R[1];
87b1c91e4bSMartin Matuska     uint8_t       buf[4 * BLAKE2B_BLOCKBYTES];
88b1c91e4bSMartin Matuska     size_t        buflen;
89b1c91e4bSMartin Matuska     size_t        outlen;
90b1c91e4bSMartin Matuska   } blake2bp_state;
91b1c91e4bSMartin Matuska 
92b1c91e4bSMartin Matuska   BLAKE2_PACKED(struct blake2s_param__
93b1c91e4bSMartin Matuska   {
94b1c91e4bSMartin Matuska     uint8_t  digest_length; /* 1 */
95b1c91e4bSMartin Matuska     uint8_t  key_length;    /* 2 */
96b1c91e4bSMartin Matuska     uint8_t  fanout;        /* 3 */
97b1c91e4bSMartin Matuska     uint8_t  depth;         /* 4 */
98b1c91e4bSMartin Matuska     uint32_t leaf_length;   /* 8 */
99b1c91e4bSMartin Matuska     uint32_t node_offset;  /* 12 */
100b1c91e4bSMartin Matuska     uint16_t xof_length;    /* 14 */
101b1c91e4bSMartin Matuska     uint8_t  node_depth;    /* 15 */
102b1c91e4bSMartin Matuska     uint8_t  inner_length;  /* 16 */
103b1c91e4bSMartin Matuska     /* uint8_t  reserved[0]; */
104b1c91e4bSMartin Matuska     uint8_t  salt[BLAKE2S_SALTBYTES]; /* 24 */
105b1c91e4bSMartin Matuska     uint8_t  personal[BLAKE2S_PERSONALBYTES];  /* 32 */
106b1c91e4bSMartin Matuska   });
107b1c91e4bSMartin Matuska 
108b1c91e4bSMartin Matuska   typedef struct blake2s_param__ blake2s_param;
109b1c91e4bSMartin Matuska 
110b1c91e4bSMartin Matuska   BLAKE2_PACKED(struct blake2b_param__
111b1c91e4bSMartin Matuska   {
112b1c91e4bSMartin Matuska     uint8_t  digest_length; /* 1 */
113b1c91e4bSMartin Matuska     uint8_t  key_length;    /* 2 */
114b1c91e4bSMartin Matuska     uint8_t  fanout;        /* 3 */
115b1c91e4bSMartin Matuska     uint8_t  depth;         /* 4 */
116b1c91e4bSMartin Matuska     uint32_t leaf_length;   /* 8 */
117b1c91e4bSMartin Matuska     uint32_t node_offset;   /* 12 */
118b1c91e4bSMartin Matuska     uint32_t xof_length;    /* 16 */
119b1c91e4bSMartin Matuska     uint8_t  node_depth;    /* 17 */
120b1c91e4bSMartin Matuska     uint8_t  inner_length;  /* 18 */
121b1c91e4bSMartin Matuska     uint8_t  reserved[14];  /* 32 */
122b1c91e4bSMartin Matuska     uint8_t  salt[BLAKE2B_SALTBYTES]; /* 48 */
123b1c91e4bSMartin Matuska     uint8_t  personal[BLAKE2B_PERSONALBYTES];  /* 64 */
124b1c91e4bSMartin Matuska   });
125b1c91e4bSMartin Matuska 
126b1c91e4bSMartin Matuska   typedef struct blake2b_param__ blake2b_param;
127b1c91e4bSMartin Matuska 
128b1c91e4bSMartin Matuska   typedef struct blake2xs_state__
129b1c91e4bSMartin Matuska   {
130b1c91e4bSMartin Matuska     blake2s_state S[1];
131b1c91e4bSMartin Matuska     blake2s_param P[1];
132b1c91e4bSMartin Matuska   } blake2xs_state;
133b1c91e4bSMartin Matuska 
134b1c91e4bSMartin Matuska   typedef struct blake2xb_state__
135b1c91e4bSMartin Matuska   {
136b1c91e4bSMartin Matuska     blake2b_state S[1];
137b1c91e4bSMartin Matuska     blake2b_param P[1];
138b1c91e4bSMartin Matuska   } blake2xb_state;
139b1c91e4bSMartin Matuska 
140b1c91e4bSMartin Matuska   /* Padded structs result in a compile-time error */
141b1c91e4bSMartin Matuska   enum {
142b1c91e4bSMartin Matuska     BLAKE2_DUMMY_1 = 1/(sizeof(blake2s_param) == BLAKE2S_OUTBYTES),
143b1c91e4bSMartin Matuska     BLAKE2_DUMMY_2 = 1/(sizeof(blake2b_param) == BLAKE2B_OUTBYTES)
144b1c91e4bSMartin Matuska   };
145b1c91e4bSMartin Matuska 
146b1c91e4bSMartin Matuska   /* Streaming API */
147b1c91e4bSMartin Matuska   int blake2s_init( blake2s_state *S, size_t outlen );
148b1c91e4bSMartin Matuska   int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
149b1c91e4bSMartin Matuska   int blake2s_init_param( blake2s_state *S, const blake2s_param *P );
150b1c91e4bSMartin Matuska   int blake2s_update( blake2s_state *S, const void *in, size_t inlen );
151b1c91e4bSMartin Matuska   int blake2s_final( blake2s_state *S, void *out, size_t outlen );
152b1c91e4bSMartin Matuska 
153b1c91e4bSMartin Matuska   int blake2b_init( blake2b_state *S, size_t outlen );
154b1c91e4bSMartin Matuska   int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
155b1c91e4bSMartin Matuska   int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
156b1c91e4bSMartin Matuska   int blake2b_update( blake2b_state *S, const void *in, size_t inlen );
157b1c91e4bSMartin Matuska   int blake2b_final( blake2b_state *S, void *out, size_t outlen );
158b1c91e4bSMartin Matuska 
159b1c91e4bSMartin Matuska   int blake2sp_init( blake2sp_state *S, size_t outlen );
160b1c91e4bSMartin Matuska   int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen );
161b1c91e4bSMartin Matuska   int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen );
162b1c91e4bSMartin Matuska   int blake2sp_final( blake2sp_state *S, void *out, size_t outlen );
163b1c91e4bSMartin Matuska 
164b1c91e4bSMartin Matuska   int blake2bp_init( blake2bp_state *S, size_t outlen );
165b1c91e4bSMartin Matuska   int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen );
166b1c91e4bSMartin Matuska   int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen );
167b1c91e4bSMartin Matuska   int blake2bp_final( blake2bp_state *S, void *out, size_t outlen );
168b1c91e4bSMartin Matuska 
169b1c91e4bSMartin Matuska   /* Variable output length API */
170b1c91e4bSMartin Matuska   int blake2xs_init( blake2xs_state *S, const size_t outlen );
171b1c91e4bSMartin Matuska   int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen );
172b1c91e4bSMartin Matuska   int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen );
173b1c91e4bSMartin Matuska   int blake2xs_final(blake2xs_state *S, void *out, size_t outlen);
174b1c91e4bSMartin Matuska 
175b1c91e4bSMartin Matuska   int blake2xb_init( blake2xb_state *S, const size_t outlen );
176b1c91e4bSMartin Matuska   int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen );
177b1c91e4bSMartin Matuska   int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen );
178b1c91e4bSMartin Matuska   int blake2xb_final(blake2xb_state *S, void *out, size_t outlen);
179b1c91e4bSMartin Matuska 
180b1c91e4bSMartin Matuska   /* Simple API */
181b1c91e4bSMartin Matuska   int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
182b1c91e4bSMartin Matuska   int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
183b1c91e4bSMartin Matuska 
184b1c91e4bSMartin Matuska   int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
185b1c91e4bSMartin Matuska   int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
186b1c91e4bSMartin Matuska 
187b1c91e4bSMartin Matuska   int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
188b1c91e4bSMartin Matuska   int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
189b1c91e4bSMartin Matuska 
190b1c91e4bSMartin Matuska   /* This is simply an alias for blake2b */
191b1c91e4bSMartin Matuska   int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
192b1c91e4bSMartin Matuska 
193b1c91e4bSMartin Matuska #if defined(__cplusplus)
194b1c91e4bSMartin Matuska }
195b1c91e4bSMartin Matuska #endif
196b1c91e4bSMartin Matuska 
197b1c91e4bSMartin Matuska #endif
198