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