diff options
Diffstat (limited to 'include/crypto/internal/blake2s.h')
| -rw-r--r-- | include/crypto/internal/blake2s.h | 40 | 
1 files changed, 25 insertions, 15 deletions
diff --git a/include/crypto/internal/blake2s.h b/include/crypto/internal/blake2s.h index d39cfa0d333e..52363eee2b20 100644 --- a/include/crypto/internal/blake2s.h +++ b/include/crypto/internal/blake2s.h @@ -24,14 +24,11 @@ static inline void blake2s_set_lastblock(struct blake2s_state *state)  	state->f[0] = -1;  } -typedef void (*blake2s_compress_t)(struct blake2s_state *state, -				   const u8 *block, size_t nblocks, u32 inc); -  /* Helper functions for BLAKE2s shared by the library and shash APIs */ -static inline void __blake2s_update(struct blake2s_state *state, -				    const u8 *in, size_t inlen, -				    blake2s_compress_t compress) +static __always_inline void +__blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen, +		 bool force_generic)  {  	const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen; @@ -39,7 +36,12 @@ static inline void __blake2s_update(struct blake2s_state *state,  		return;  	if (inlen > fill) {  		memcpy(state->buf + state->buflen, in, fill); -		(*compress)(state, state->buf, 1, BLAKE2S_BLOCK_SIZE); +		if (force_generic) +			blake2s_compress_generic(state, state->buf, 1, +						 BLAKE2S_BLOCK_SIZE); +		else +			blake2s_compress(state, state->buf, 1, +					 BLAKE2S_BLOCK_SIZE);  		state->buflen = 0;  		in += fill;  		inlen -= fill; @@ -47,7 +49,12 @@ static inline void __blake2s_update(struct blake2s_state *state,  	if (inlen > BLAKE2S_BLOCK_SIZE) {  		const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);  		/* Hash one less (full) block than strictly possible */ -		(*compress)(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE); +		if (force_generic) +			blake2s_compress_generic(state, in, nblocks - 1, +						 BLAKE2S_BLOCK_SIZE); +		else +			blake2s_compress(state, in, nblocks - 1, +					 BLAKE2S_BLOCK_SIZE);  		in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);  		inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);  	} @@ -55,13 +62,16 @@ static inline void __blake2s_update(struct blake2s_state *state,  	state->buflen += inlen;  } -static inline void __blake2s_final(struct blake2s_state *state, u8 *out, -				   blake2s_compress_t compress) +static __always_inline void +__blake2s_final(struct blake2s_state *state, u8 *out, bool force_generic)  {  	blake2s_set_lastblock(state);  	memset(state->buf + state->buflen, 0,  	       BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */ -	(*compress)(state, state->buf, 1, state->buflen); +	if (force_generic) +		blake2s_compress_generic(state, state->buf, 1, state->buflen); +	else +		blake2s_compress(state, state->buf, 1, state->buflen);  	cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));  	memcpy(out, state->h, state->outlen);  } @@ -99,20 +109,20 @@ static inline int crypto_blake2s_init(struct shash_desc *desc)  static inline int crypto_blake2s_update(struct shash_desc *desc,  					const u8 *in, unsigned int inlen, -					blake2s_compress_t compress) +					bool force_generic)  {  	struct blake2s_state *state = shash_desc_ctx(desc); -	__blake2s_update(state, in, inlen, compress); +	__blake2s_update(state, in, inlen, force_generic);  	return 0;  }  static inline int crypto_blake2s_final(struct shash_desc *desc, u8 *out, -				       blake2s_compress_t compress) +				       bool force_generic)  {  	struct blake2s_state *state = shash_desc_ctx(desc); -	__blake2s_final(state, out, compress); +	__blake2s_final(state, out, force_generic);  	return 0;  }  |