[PATCH 3/3] hash: Allow for SHA512 hardware implementations

Heinrich Schuchardt xypron.glpk at gmx.de
Wed May 12 18:01:44 CEST 2021


On 17.02.21 04:20, Joel Stanley wrote:
> Similar to support for SHA1 and SHA256, allow the use of hardware hashing
> engine by enabling the algorithm and setting  CONFIG_SHA_HW_ACCEL /
> CONFIG_SHA_PROG_HW_ACCEL.
>
> Signed-off-by: Joel Stanley <joel at jms.id.au>

This merged patch leads to errors compiling the EFI TCG2 protocol on
boards with CONFIG_SHA_HW_ACCEL.

There is not as single implementation of hw_sha384 and hw_sha512. You
could only use CONFIG_SHA_HW_ACCEL for selecting these functions if
these were implemented for *all* boards with CONFIG_SHA_HW_ACCEL=y. But
this will never happen.

*This patch needs to be reverted.*

Why do we have CONFIG_SHA_HW_ACCEL at all and don't use weak functions
instead?

Best regards

Heinrich


> ---
>  common/hash.c    | 24 ++++++++++++++++++++++--
>  include/hw_sha.h | 26 ++++++++++++++++++++++++++
>  lib/Kconfig      | 15 +++++++--------
>  3 files changed, 55 insertions(+), 10 deletions(-)
>
> diff --git a/common/hash.c b/common/hash.c
> index fc64002f736a..10dff7ddb0e7 100644
> --- a/common/hash.c
> +++ b/common/hash.c
> @@ -97,7 +97,7 @@ static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
>  }
>  #endif
>
> -#if defined(CONFIG_SHA384)
> +#if defined(CONFIG_SHA384) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
>  static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
>  {
>  	sha512_context *ctx = malloc(sizeof(sha512_context));
> @@ -125,7 +125,7 @@ static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
>  }
>  #endif
>
> -#if defined(CONFIG_SHA512)
> +#if defined(CONFIG_SHA512) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
>  static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
>  {
>  	sha512_context *ctx = malloc(sizeof(sha512_context));
> @@ -260,10 +260,20 @@ static struct hash_algo hash_algo[] = {
>  		.name		= "sha384",
>  		.digest_size	= SHA384_SUM_LEN,
>  		.chunk_size	= CHUNKSZ_SHA384,
> +#ifdef CONFIG_SHA_HW_ACCEL
> +		.hash_func_ws	= hw_sha384,
> +#else
>  		.hash_func_ws	= sha384_csum_wd,
> +#endif
> +#ifdef CONFIG_SHA_PROG_HW_ACCEL
> +		.hash_init	= hw_sha_init,
> +		.hash_update	= hw_sha_update,
> +		.hash_finish	= hw_sha_finish,
> +#else
>  		.hash_init	= hash_init_sha384,
>  		.hash_update	= hash_update_sha384,
>  		.hash_finish	= hash_finish_sha384,
> +#endif
>  	},
>  #endif
>  #ifdef CONFIG_SHA512
> @@ -271,10 +281,20 @@ static struct hash_algo hash_algo[] = {
>  		.name		= "sha512",
>  		.digest_size	= SHA512_SUM_LEN,
>  		.chunk_size	= CHUNKSZ_SHA512,
> +#ifdef CONFIG_SHA_HW_ACCEL
> +		.hash_func_ws	= hw_sha512,
> +#else
>  		.hash_func_ws	= sha512_csum_wd,
> +#endif
> +#ifdef CONFIG_SHA_PROG_HW_ACCEL
> +		.hash_init	= hw_sha_init,
> +		.hash_update	= hw_sha_update,
> +		.hash_finish	= hw_sha_finish,
> +#else
>  		.hash_init	= hash_init_sha512,
>  		.hash_update	= hash_update_sha512,
>  		.hash_finish	= hash_finish_sha512,
> +#endif
>  	},
>  #endif
>  	{
> diff --git a/include/hw_sha.h b/include/hw_sha.h
> index 15b1a1c79836..d4f3471c4308 100644
> --- a/include/hw_sha.h
> +++ b/include/hw_sha.h
> @@ -8,6 +8,32 @@
>  #define __HW_SHA_H
>  #include <hash.h>
>
> +/**
> + * Computes hash value of input pbuf using h/w acceleration
> + *
> + * @param in_addr	A pointer to the input buffer
> + * @param bufleni	Byte length of input buffer
> + * @param out_addr	A pointer to the output buffer. When complete
> + *			64 bytes are copied to pout[0]...pout[63]. Thus, a user
> + *			should allocate at least 64 bytes at pOut in advance.
> + * @param chunk_size	chunk size for sha512
> + */
> +void hw_sha512(const uchar *in_addr, uint buflen, uchar *out_addr,
> +	       uint chunk_size);
> +
> +/**
> + * Computes hash value of input pbuf using h/w acceleration
> + *
> + * @param in_addr	A pointer to the input buffer
> + * @param bufleni	Byte length of input buffer
> + * @param out_addr	A pointer to the output buffer. When complete
> + *			48 bytes are copied to pout[0]...pout[47]. Thus, a user
> + *			should allocate at least 48 bytes at pOut in advance.
> + * @param chunk_size	chunk size for sha384
> + */
> +void hw_sha384(const uchar *in_addr, uint buflen, uchar *out_addr,
> +	       uint chunk_size);
> +
>  /**
>   * Computes hash value of input pbuf using h/w acceleration
>   *
> diff --git a/lib/Kconfig b/lib/Kconfig
> index b35a71ac368b..0d753eedeced 100644
> --- a/lib/Kconfig
> +++ b/lib/Kconfig
> @@ -389,19 +389,18 @@ config SHA384
>  config SHA_HW_ACCEL
>  	bool "Enable hashing using hardware"
>  	help
> -	  This option enables hardware acceleration
> -	  for SHA1/SHA256 hashing.
> -	  This affects the 'hash' command and also the
> -	  hash_lookup_algo() function.
> +	  This option enables hardware acceleration for SHA hashing.
> +	  This affects the 'hash' command and also the hash_lookup_algo()
> +	  function.
>
>  config SHA_PROG_HW_ACCEL
>  	bool "Enable Progressive hashing support using hardware"
>  	depends on SHA_HW_ACCEL
>  	help
> -	  This option enables hardware-acceleration for
> -	  SHA1/SHA256 progressive hashing.
> -	  Data can be streamed in a block at a time and the hashing
> -	  is performed in hardware.
> +	  This option enables hardware-acceleration for SHA progressive
> +	  hashing.
> +	  Data can be streamed in a block at a time and the hashing is
> +	  performed in hardware.
>
>  config MD5
>  	bool "Support MD5 algorithm"
>



More information about the U-Boot mailing list