xref: /dflybsd-src/sys/crypto/blake2/blake2s.h (revision 04473dc8c05d4bf8e8e8306ffd23cc08393e23c0)
10949a0d6SAaron LI /*	$OpenBSD: blake2s.h,v 1.3 2023/02/03 18:31:16 miod Exp $	*/
20949a0d6SAaron LI /*
30949a0d6SAaron LI  * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
40949a0d6SAaron LI  * Copyright (C) 2019-2020 Matt Dunwoodie <ncon@noconroy.net>.
50949a0d6SAaron LI  *
60949a0d6SAaron LI  * Permission to use, copy, modify, and distribute this software for any
70949a0d6SAaron LI  * purpose with or without fee is hereby granted, provided that the above
80949a0d6SAaron LI  * copyright notice and this permission notice appear in all copies.
90949a0d6SAaron LI  *
100949a0d6SAaron LI  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
110949a0d6SAaron LI  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
120949a0d6SAaron LI  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
130949a0d6SAaron LI  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
140949a0d6SAaron LI  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
150949a0d6SAaron LI  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
160949a0d6SAaron LI  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
170949a0d6SAaron LI  */
180949a0d6SAaron LI 
190949a0d6SAaron LI #include <sys/types.h>
2015b48a60SAaron LI #include <sys/systm.h>
210949a0d6SAaron LI 
220949a0d6SAaron LI #ifndef _BLAKE2S_H_
230949a0d6SAaron LI #define _BLAKE2S_H_
240949a0d6SAaron LI 
250949a0d6SAaron LI enum blake2s_lengths {
260949a0d6SAaron LI 	BLAKE2S_BLOCK_SIZE = 64,
270949a0d6SAaron LI 	BLAKE2S_HASH_SIZE = 32,
280949a0d6SAaron LI 	BLAKE2S_KEY_SIZE = 32
290949a0d6SAaron LI };
300949a0d6SAaron LI 
310949a0d6SAaron LI struct blake2s_state {
320949a0d6SAaron LI 	uint32_t h[8];
330949a0d6SAaron LI 	uint32_t t[2];
340949a0d6SAaron LI 	uint32_t f[2];
350949a0d6SAaron LI 	uint8_t buf[BLAKE2S_BLOCK_SIZE];
360949a0d6SAaron LI 	unsigned int buflen;
370949a0d6SAaron LI 	unsigned int outlen;
380949a0d6SAaron LI };
390949a0d6SAaron LI 
40*04473dc8SAaron LI void blake2s_init(struct blake2s_state *state, size_t outlen);
41*04473dc8SAaron LI void blake2s_init_key(struct blake2s_state *state, size_t outlen,
42*04473dc8SAaron LI 		      const void *key, size_t keylen);
4315b48a60SAaron LI void blake2s_update(struct blake2s_state *state, const uint8_t *in,
4415b48a60SAaron LI 		    size_t inlen);
450949a0d6SAaron LI void blake2s_final(struct blake2s_state *state, uint8_t *out);
460949a0d6SAaron LI 
4715b48a60SAaron LI void blake2s_hmac(uint8_t *out, const uint8_t *in, const uint8_t *key,
48*04473dc8SAaron LI 		  size_t outlen, size_t inlen, size_t keylen);
4915b48a60SAaron LI 
5015b48a60SAaron LI static inline void
5115b48a60SAaron LI blake2s(uint8_t *out, const uint8_t *in, const uint8_t *key,
52*04473dc8SAaron LI 	size_t outlen, size_t inlen, size_t keylen)
530949a0d6SAaron LI {
540949a0d6SAaron LI 	struct blake2s_state state;
550949a0d6SAaron LI 
5615b48a60SAaron LI 	KKASSERT((in != NULL || inlen == 0) &&
570949a0d6SAaron LI 		 out != NULL && outlen <= BLAKE2S_HASH_SIZE &&
580949a0d6SAaron LI 		 (key != NULL || keylen == 0) && keylen <= BLAKE2S_KEY_SIZE);
590949a0d6SAaron LI 
600949a0d6SAaron LI 	if (keylen)
610949a0d6SAaron LI 		blake2s_init_key(&state, outlen, key, keylen);
620949a0d6SAaron LI 	else
630949a0d6SAaron LI 		blake2s_init(&state, outlen);
640949a0d6SAaron LI 
650949a0d6SAaron LI 	blake2s_update(&state, in, inlen);
660949a0d6SAaron LI 	blake2s_final(&state, out);
670949a0d6SAaron LI }
680949a0d6SAaron LI 
690949a0d6SAaron LI #endif /* _BLAKE2S_H_ */
70