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
__blake2s_init(struct blake2s_ctx * ctx,size_t outlen,const void * key,size_t keylen)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
blake2s_init(struct blake2s_ctx * ctx,size_t outlen)58 static inline void blake2s_init(struct blake2s_ctx *ctx, size_t outlen)
59 {
60 __blake2s_init(ctx, outlen, NULL, 0);
61 }
62
blake2s_init_key(struct blake2s_ctx * ctx,size_t outlen,const void * key,size_t keylen)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