1085658deSDaniel Fojt /*
2085658deSDaniel Fojt    BLAKE2 reference source code package - reference C implementations
3085658deSDaniel Fojt 
4085658deSDaniel Fojt    Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
5085658deSDaniel Fojt    terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
6085658deSDaniel Fojt    your option.  The terms of these licenses can be found at:
7085658deSDaniel Fojt 
8085658deSDaniel Fojt    - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
9085658deSDaniel Fojt    - OpenSSL license   : https://www.openssl.org/source/license.html
10085658deSDaniel Fojt    - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
11085658deSDaniel Fojt 
12085658deSDaniel Fojt    More information about the BLAKE2 hash function can be found at
13085658deSDaniel Fojt    https://blake2.net.
14085658deSDaniel Fojt */
15085658deSDaniel Fojt 
16085658deSDaniel Fojt #ifndef ARCHIVE_BLAKE2_H
17085658deSDaniel Fojt #define ARCHIVE_BLAKE2_H
18085658deSDaniel Fojt 
19085658deSDaniel Fojt #include <stddef.h>
20085658deSDaniel Fojt #include <stdint.h>
21085658deSDaniel Fojt 
22085658deSDaniel Fojt #if defined(_MSC_VER)
23085658deSDaniel Fojt #define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop))
24*50f8aa9cSAntonio Huete Jimenez #elif defined(__GNUC__)
25085658deSDaniel Fojt #define BLAKE2_PACKED(x) x __attribute__((packed))
26*50f8aa9cSAntonio Huete Jimenez #else
27*50f8aa9cSAntonio Huete Jimenez #define BLAKE2_PACKED(x) _Pragma("pack 1") x _Pragma("pack 0")
28085658deSDaniel Fojt #endif
29085658deSDaniel Fojt 
30085658deSDaniel Fojt #if defined(__cplusplus)
31085658deSDaniel Fojt extern "C" {
32085658deSDaniel Fojt #endif
33085658deSDaniel Fojt 
34085658deSDaniel Fojt   enum blake2s_constant
35085658deSDaniel Fojt   {
36085658deSDaniel Fojt     BLAKE2S_BLOCKBYTES = 64,
37085658deSDaniel Fojt     BLAKE2S_OUTBYTES   = 32,
38085658deSDaniel Fojt     BLAKE2S_KEYBYTES   = 32,
39085658deSDaniel Fojt     BLAKE2S_SALTBYTES  = 8,
40085658deSDaniel Fojt     BLAKE2S_PERSONALBYTES = 8
41085658deSDaniel Fojt   };
42085658deSDaniel Fojt 
43085658deSDaniel Fojt   enum blake2b_constant
44085658deSDaniel Fojt   {
45085658deSDaniel Fojt     BLAKE2B_BLOCKBYTES = 128,
46085658deSDaniel Fojt     BLAKE2B_OUTBYTES   = 64,
47085658deSDaniel Fojt     BLAKE2B_KEYBYTES   = 64,
48085658deSDaniel Fojt     BLAKE2B_SALTBYTES  = 16,
49085658deSDaniel Fojt     BLAKE2B_PERSONALBYTES = 16
50085658deSDaniel Fojt   };
51085658deSDaniel Fojt 
52085658deSDaniel Fojt   typedef struct blake2s_state__
53085658deSDaniel Fojt   {
54085658deSDaniel Fojt     uint32_t h[8];
55085658deSDaniel Fojt     uint32_t t[2];
56085658deSDaniel Fojt     uint32_t f[2];
57085658deSDaniel Fojt     uint8_t  buf[BLAKE2S_BLOCKBYTES];
58085658deSDaniel Fojt     size_t   buflen;
59085658deSDaniel Fojt     size_t   outlen;
60085658deSDaniel Fojt     uint8_t  last_node;
61085658deSDaniel Fojt   } blake2s_state;
62085658deSDaniel Fojt 
63085658deSDaniel Fojt   typedef struct blake2b_state__
64085658deSDaniel Fojt   {
65085658deSDaniel Fojt     uint64_t h[8];
66085658deSDaniel Fojt     uint64_t t[2];
67085658deSDaniel Fojt     uint64_t f[2];
68085658deSDaniel Fojt     uint8_t  buf[BLAKE2B_BLOCKBYTES];
69085658deSDaniel Fojt     size_t   buflen;
70085658deSDaniel Fojt     size_t   outlen;
71085658deSDaniel Fojt     uint8_t  last_node;
72085658deSDaniel Fojt   } blake2b_state;
73085658deSDaniel Fojt 
74085658deSDaniel Fojt   typedef struct blake2sp_state__
75085658deSDaniel Fojt   {
76085658deSDaniel Fojt     blake2s_state S[8][1];
77085658deSDaniel Fojt     blake2s_state R[1];
78085658deSDaniel Fojt     uint8_t       buf[8 * BLAKE2S_BLOCKBYTES];
79085658deSDaniel Fojt     size_t        buflen;
80085658deSDaniel Fojt     size_t        outlen;
81085658deSDaniel Fojt   } blake2sp_state;
82085658deSDaniel Fojt 
83085658deSDaniel Fojt   typedef struct blake2bp_state__
84085658deSDaniel Fojt   {
85085658deSDaniel Fojt     blake2b_state S[4][1];
86085658deSDaniel Fojt     blake2b_state R[1];
87085658deSDaniel Fojt     uint8_t       buf[4 * BLAKE2B_BLOCKBYTES];
88085658deSDaniel Fojt     size_t        buflen;
89085658deSDaniel Fojt     size_t        outlen;
90085658deSDaniel Fojt   } blake2bp_state;
91085658deSDaniel Fojt 
92085658deSDaniel Fojt   BLAKE2_PACKED(struct blake2s_param__
93085658deSDaniel Fojt   {
94085658deSDaniel Fojt     uint8_t  digest_length; /* 1 */
95085658deSDaniel Fojt     uint8_t  key_length;    /* 2 */
96085658deSDaniel Fojt     uint8_t  fanout;        /* 3 */
97085658deSDaniel Fojt     uint8_t  depth;         /* 4 */
98085658deSDaniel Fojt     uint32_t leaf_length;   /* 8 */
99085658deSDaniel Fojt     uint32_t node_offset;  /* 12 */
100085658deSDaniel Fojt     uint16_t xof_length;    /* 14 */
101085658deSDaniel Fojt     uint8_t  node_depth;    /* 15 */
102085658deSDaniel Fojt     uint8_t  inner_length;  /* 16 */
103085658deSDaniel Fojt     /* uint8_t  reserved[0]; */
104085658deSDaniel Fojt     uint8_t  salt[BLAKE2S_SALTBYTES]; /* 24 */
105085658deSDaniel Fojt     uint8_t  personal[BLAKE2S_PERSONALBYTES];  /* 32 */
106085658deSDaniel Fojt   });
107085658deSDaniel Fojt 
108085658deSDaniel Fojt   typedef struct blake2s_param__ blake2s_param;
109085658deSDaniel Fojt 
110085658deSDaniel Fojt   BLAKE2_PACKED(struct blake2b_param__
111085658deSDaniel Fojt   {
112085658deSDaniel Fojt     uint8_t  digest_length; /* 1 */
113085658deSDaniel Fojt     uint8_t  key_length;    /* 2 */
114085658deSDaniel Fojt     uint8_t  fanout;        /* 3 */
115085658deSDaniel Fojt     uint8_t  depth;         /* 4 */
116085658deSDaniel Fojt     uint32_t leaf_length;   /* 8 */
117085658deSDaniel Fojt     uint32_t node_offset;   /* 12 */
118085658deSDaniel Fojt     uint32_t xof_length;    /* 16 */
119085658deSDaniel Fojt     uint8_t  node_depth;    /* 17 */
120085658deSDaniel Fojt     uint8_t  inner_length;  /* 18 */
121085658deSDaniel Fojt     uint8_t  reserved[14];  /* 32 */
122085658deSDaniel Fojt     uint8_t  salt[BLAKE2B_SALTBYTES]; /* 48 */
123085658deSDaniel Fojt     uint8_t  personal[BLAKE2B_PERSONALBYTES];  /* 64 */
124085658deSDaniel Fojt   });
125085658deSDaniel Fojt 
126085658deSDaniel Fojt   typedef struct blake2b_param__ blake2b_param;
127085658deSDaniel Fojt 
128085658deSDaniel Fojt   typedef struct blake2xs_state__
129085658deSDaniel Fojt   {
130085658deSDaniel Fojt     blake2s_state S[1];
131085658deSDaniel Fojt     blake2s_param P[1];
132085658deSDaniel Fojt   } blake2xs_state;
133085658deSDaniel Fojt 
134085658deSDaniel Fojt   typedef struct blake2xb_state__
135085658deSDaniel Fojt   {
136085658deSDaniel Fojt     blake2b_state S[1];
137085658deSDaniel Fojt     blake2b_param P[1];
138085658deSDaniel Fojt   } blake2xb_state;
139085658deSDaniel Fojt 
140085658deSDaniel Fojt   /* Padded structs result in a compile-time error */
141085658deSDaniel Fojt   enum {
142085658deSDaniel Fojt     BLAKE2_DUMMY_1 = 1/(sizeof(blake2s_param) == BLAKE2S_OUTBYTES),
143085658deSDaniel Fojt     BLAKE2_DUMMY_2 = 1/(sizeof(blake2b_param) == BLAKE2B_OUTBYTES)
144085658deSDaniel Fojt   };
145085658deSDaniel Fojt 
146085658deSDaniel Fojt   /* Streaming API */
147085658deSDaniel Fojt   int blake2s_init( blake2s_state *S, size_t outlen );
148085658deSDaniel Fojt   int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
149085658deSDaniel Fojt   int blake2s_init_param( blake2s_state *S, const blake2s_param *P );
150085658deSDaniel Fojt   int blake2s_update( blake2s_state *S, const void *in, size_t inlen );
151085658deSDaniel Fojt   int blake2s_final( blake2s_state *S, void *out, size_t outlen );
152085658deSDaniel Fojt 
153085658deSDaniel Fojt   int blake2b_init( blake2b_state *S, size_t outlen );
154085658deSDaniel Fojt   int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
155085658deSDaniel Fojt   int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
156085658deSDaniel Fojt   int blake2b_update( blake2b_state *S, const void *in, size_t inlen );
157085658deSDaniel Fojt   int blake2b_final( blake2b_state *S, void *out, size_t outlen );
158085658deSDaniel Fojt 
159085658deSDaniel Fojt   int blake2sp_init( blake2sp_state *S, size_t outlen );
160085658deSDaniel Fojt   int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen );
161085658deSDaniel Fojt   int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen );
162085658deSDaniel Fojt   int blake2sp_final( blake2sp_state *S, void *out, size_t outlen );
163085658deSDaniel Fojt 
164085658deSDaniel Fojt   int blake2bp_init( blake2bp_state *S, size_t outlen );
165085658deSDaniel Fojt   int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen );
166085658deSDaniel Fojt   int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen );
167085658deSDaniel Fojt   int blake2bp_final( blake2bp_state *S, void *out, size_t outlen );
168085658deSDaniel Fojt 
169085658deSDaniel Fojt   /* Variable output length API */
170085658deSDaniel Fojt   int blake2xs_init( blake2xs_state *S, const size_t outlen );
171085658deSDaniel Fojt   int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen );
172085658deSDaniel Fojt   int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen );
173085658deSDaniel Fojt   int blake2xs_final(blake2xs_state *S, void *out, size_t outlen);
174085658deSDaniel Fojt 
175085658deSDaniel Fojt   int blake2xb_init( blake2xb_state *S, const size_t outlen );
176085658deSDaniel Fojt   int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen );
177085658deSDaniel Fojt   int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen );
178085658deSDaniel Fojt   int blake2xb_final(blake2xb_state *S, void *out, size_t outlen);
179085658deSDaniel Fojt 
180085658deSDaniel Fojt   /* Simple API */
181085658deSDaniel Fojt   int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
182085658deSDaniel Fojt   int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
183085658deSDaniel Fojt 
184085658deSDaniel Fojt   int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
185085658deSDaniel Fojt   int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
186085658deSDaniel Fojt 
187085658deSDaniel Fojt   int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
188085658deSDaniel Fojt   int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
189085658deSDaniel Fojt 
190085658deSDaniel Fojt   /* This is simply an alias for blake2b */
191085658deSDaniel Fojt   int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
192085658deSDaniel Fojt 
193085658deSDaniel Fojt #if defined(__cplusplus)
194085658deSDaniel Fojt }
195085658deSDaniel Fojt #endif
196085658deSDaniel Fojt 
197085658deSDaniel Fojt #endif
198