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