xref: /dflybsd-src/sys/crypto/blake2/blake2s.h (revision 979e91ed6ebcb6c0635c3d2b61c3cf694dd66384)
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 
4004473dc8SAaron LI void blake2s_init(struct blake2s_state *state, size_t outlen);
4104473dc8SAaron LI void blake2s_init_key(struct blake2s_state *state, size_t outlen,
4204473dc8SAaron 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 static inline void
blake2s(uint8_t * out,const uint8_t * in,const uint8_t * key,size_t outlen,size_t inlen,size_t keylen)4815b48a60SAaron LI blake2s(uint8_t *out, const uint8_t *in, const uint8_t *key,
4904473dc8SAaron LI 	size_t outlen, size_t inlen, size_t keylen)
500949a0d6SAaron LI {
510949a0d6SAaron LI 	struct blake2s_state state;
520949a0d6SAaron LI 
5315b48a60SAaron LI 	KKASSERT((in != NULL || inlen == 0) &&
540949a0d6SAaron LI 		 out != NULL && outlen <= BLAKE2S_HASH_SIZE &&
550949a0d6SAaron LI 		 (key != NULL || keylen == 0) && keylen <= BLAKE2S_KEY_SIZE);
560949a0d6SAaron LI 
57*01a03001SAaron LI 	if (keylen > 0)
580949a0d6SAaron LI 		blake2s_init_key(&state, outlen, key, keylen);
590949a0d6SAaron LI 	else
600949a0d6SAaron LI 		blake2s_init(&state, outlen);
610949a0d6SAaron LI 
620949a0d6SAaron LI 	blake2s_update(&state, in, inlen);
630949a0d6SAaron LI 	blake2s_final(&state, out);
640949a0d6SAaron LI }
650949a0d6SAaron LI 
660949a0d6SAaron LI #endif /* _BLAKE2S_H_ */
67