1 /* $OpenBSD: blake2s.h,v 1.3 2023/02/03 18:31:16 miod Exp $ */ 2 /* 3 * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4 * Copyright (C) 2019-2020 Matt Dunwoodie <ncon@noconroy.net>. 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/types.h> 20 #include <sys/systm.h> 21 22 #ifndef _BLAKE2S_H_ 23 #define _BLAKE2S_H_ 24 25 enum blake2s_lengths { 26 BLAKE2S_BLOCK_SIZE = 64, 27 BLAKE2S_HASH_SIZE = 32, 28 BLAKE2S_KEY_SIZE = 32 29 }; 30 31 struct blake2s_state { 32 uint32_t h[8]; 33 uint32_t t[2]; 34 uint32_t f[2]; 35 uint8_t buf[BLAKE2S_BLOCK_SIZE]; 36 unsigned int buflen; 37 unsigned int outlen; 38 }; 39 40 void blake2s_init(struct blake2s_state *state, size_t outlen); 41 void blake2s_init_key(struct blake2s_state *state, size_t outlen, 42 const void *key, size_t keylen); 43 void blake2s_update(struct blake2s_state *state, const uint8_t *in, 44 size_t inlen); 45 void blake2s_final(struct blake2s_state *state, uint8_t *out); 46 47 void blake2s_hmac(uint8_t *out, const uint8_t *in, const uint8_t *key, 48 size_t outlen, size_t inlen, size_t keylen); 49 50 static inline void 51 blake2s(uint8_t *out, const uint8_t *in, const uint8_t *key, 52 size_t outlen, size_t inlen, size_t keylen) 53 { 54 struct blake2s_state state; 55 56 KKASSERT((in != NULL || inlen == 0) && 57 out != NULL && outlen <= BLAKE2S_HASH_SIZE && 58 (key != NULL || keylen == 0) && keylen <= BLAKE2S_KEY_SIZE); 59 60 if (keylen) 61 blake2s_init_key(&state, outlen, key, keylen); 62 else 63 blake2s_init(&state, outlen); 64 65 blake2s_update(&state, in, inlen); 66 blake2s_final(&state, out); 67 } 68 69 #endif /* _BLAKE2S_H_ */ 70