1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
3 * Helper functions for BLAKE2b implementations.
4 * Keep this in sync with the corresponding BLAKE2s header.
7 #ifndef _CRYPTO_INTERNAL_BLAKE2B_H
8 #define _CRYPTO_INTERNAL_BLAKE2B_H
10 #include <crypto/blake2b.h>
11 #include <crypto/internal/hash.h>
12 #include <linux/string.h>
14 void blake2b_compress_generic(struct blake2b_state
*state
,
15 const u8
*block
, size_t nblocks
, u32 inc
);
17 static inline void blake2b_set_lastblock(struct blake2b_state
*state
)
22 typedef void (*blake2b_compress_t
)(struct blake2b_state
*state
,
23 const u8
*block
, size_t nblocks
, u32 inc
);
25 static inline void __blake2b_update(struct blake2b_state
*state
,
26 const u8
*in
, size_t inlen
,
27 blake2b_compress_t compress
)
29 const size_t fill
= BLAKE2B_BLOCK_SIZE
- state
->buflen
;
34 memcpy(state
->buf
+ state
->buflen
, in
, fill
);
35 (*compress
)(state
, state
->buf
, 1, BLAKE2B_BLOCK_SIZE
);
40 if (inlen
> BLAKE2B_BLOCK_SIZE
) {
41 const size_t nblocks
= DIV_ROUND_UP(inlen
, BLAKE2B_BLOCK_SIZE
);
42 /* Hash one less (full) block than strictly possible */
43 (*compress
)(state
, in
, nblocks
- 1, BLAKE2B_BLOCK_SIZE
);
44 in
+= BLAKE2B_BLOCK_SIZE
* (nblocks
- 1);
45 inlen
-= BLAKE2B_BLOCK_SIZE
* (nblocks
- 1);
47 memcpy(state
->buf
+ state
->buflen
, in
, inlen
);
48 state
->buflen
+= inlen
;
51 static inline void __blake2b_final(struct blake2b_state
*state
, u8
*out
,
52 blake2b_compress_t compress
)
56 blake2b_set_lastblock(state
);
57 memset(state
->buf
+ state
->buflen
, 0,
58 BLAKE2B_BLOCK_SIZE
- state
->buflen
); /* Padding */
59 (*compress
)(state
, state
->buf
, 1, state
->buflen
);
60 for (i
= 0; i
< ARRAY_SIZE(state
->h
); i
++)
61 __cpu_to_le64s(&state
->h
[i
]);
62 memcpy(out
, state
->h
, state
->outlen
);
65 /* Helper functions for shash implementations of BLAKE2b */
67 struct blake2b_tfm_ctx
{
68 u8 key
[BLAKE2B_KEY_SIZE
];
72 static inline int crypto_blake2b_setkey(struct crypto_shash
*tfm
,
73 const u8
*key
, unsigned int keylen
)
75 struct blake2b_tfm_ctx
*tctx
= crypto_shash_ctx(tfm
);
77 if (keylen
== 0 || keylen
> BLAKE2B_KEY_SIZE
)
80 memcpy(tctx
->key
, key
, keylen
);
81 tctx
->keylen
= keylen
;
86 static inline int crypto_blake2b_init(struct shash_desc
*desc
)
88 const struct blake2b_tfm_ctx
*tctx
= crypto_shash_ctx(desc
->tfm
);
89 struct blake2b_state
*state
= shash_desc_ctx(desc
);
90 unsigned int outlen
= crypto_shash_digestsize(desc
->tfm
);
92 __blake2b_init(state
, outlen
, tctx
->key
, tctx
->keylen
);
96 static inline int crypto_blake2b_update(struct shash_desc
*desc
,
97 const u8
*in
, unsigned int inlen
,
98 blake2b_compress_t compress
)
100 struct blake2b_state
*state
= shash_desc_ctx(desc
);
102 __blake2b_update(state
, in
, inlen
, compress
);
106 static inline int crypto_blake2b_final(struct shash_desc
*desc
, u8
*out
,
107 blake2b_compress_t compress
)
109 struct blake2b_state
*state
= shash_desc_ctx(desc
);
111 __blake2b_final(state
, out
, compress
);
115 #endif /* _CRYPTO_INTERNAL_BLAKE2B_H */