1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 /* 3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4 */ 5 6 #ifndef _CRYPTO_BLAKE2S_H 7 #define _CRYPTO_BLAKE2S_H 8 9 #include <string.h> 10 #include <linux/types.h> 11 12 #define BLAKE2S_BLOCK_SIZE 64 13 14 struct blake2s_ctx { 15 u32 h[8]; 16 u32 t[2]; 17 u32 f[2]; 18 u8 buf[BLAKE2S_BLOCK_SIZE]; 19 unsigned int buflen; 20 unsigned int outlen; 21 }; 22 23 enum blake2s_iv { 24 BLAKE2S_IV0 = 0x6A09E667UL, 25 BLAKE2S_IV1 = 0xBB67AE85UL, 26 BLAKE2S_IV2 = 0x3C6EF372UL, 27 BLAKE2S_IV3 = 0xA54FF53AUL, 28 BLAKE2S_IV4 = 0x510E527FUL, 29 BLAKE2S_IV5 = 0x9B05688CUL, 30 BLAKE2S_IV6 = 0x1F83D9ABUL, 31 BLAKE2S_IV7 = 0x5BE0CD19UL, 32 }; 33 34 static inline void __blake2s_init(struct blake2s_ctx *ctx, size_t outlen, 35 const void *key, size_t keylen) 36 { 37 ctx->h[0] = BLAKE2S_IV0 ^ (0x01010000 | keylen << 8 | outlen); 38 ctx->h[1] = BLAKE2S_IV1; 39 ctx->h[2] = BLAKE2S_IV2; 40 ctx->h[3] = BLAKE2S_IV3; 41 ctx->h[4] = BLAKE2S_IV4; 42 ctx->h[5] = BLAKE2S_IV5; 43 ctx->h[6] = BLAKE2S_IV6; 44 ctx->h[7] = BLAKE2S_IV7; 45 ctx->t[0] = 0; 46 ctx->t[1] = 0; 47 ctx->f[0] = 0; 48 ctx->f[1] = 0; 49 ctx->buflen = 0; 50 ctx->outlen = outlen; 51 if (keylen) { 52 memcpy(ctx->buf, key, keylen); 53 memset(&ctx->buf[keylen], 0, BLAKE2S_BLOCK_SIZE - keylen); 54 ctx->buflen = BLAKE2S_BLOCK_SIZE; 55 } 56 } 57 58 static inline void blake2s_init(struct blake2s_ctx *ctx, size_t outlen) 59 { 60 __blake2s_init(ctx, outlen, NULL, 0); 61 } 62 63 static inline void blake2s_init_key(struct blake2s_ctx *ctx, size_t outlen, 64 const void *key, size_t keylen) 65 { 66 __blake2s_init(ctx, outlen, key, keylen); 67 } 68 69 void blake2s_update(struct blake2s_ctx *ctx, const u8 *in, size_t inlen); 70 71 void blake2s_final(struct blake2s_ctx *ctx, u8 *out); 72 73 #endif /* _CRYPTO_BLAKE2S_H */ 74