[PATCH v2 4/5] lib: sha256: Add support for hardware specific sha256_process

Loic Poulain loic.poulain at linaro.org
Mon Feb 6 23:12:23 CET 2023


Hi Simon,

Le lun. 6 févr. 2023 à 18:12, Simon Glass <sjg at chromium.org> a écrit :

> Hi Loic,
>
> On Wed, 1 Jun 2022 at 12:27, Loic Poulain <loic.poulain at linaro.org> wrote:
> >
> > Mark sha256_process as weak to allow hardware specific implementation.
> > Add parameter for supporting multiple blocks processing.
> >
> > Signed-off-by: Loic Poulain <loic.poulain at linaro.org>
> > ---
> >  lib/sha256.c | 26 +++++++++++++++++++-------
> >  1 file changed, 19 insertions(+), 7 deletions(-)
> >
> > diff --git a/lib/sha256.c b/lib/sha256.c
> > index c1fe93d..50b0b51 100644
> > --- a/lib/sha256.c
> > +++ b/lib/sha256.c
> > @@ -14,6 +14,8 @@
> >  #include <watchdog.h>
> >  #include <u-boot/sha256.h>
> >
> > +#include <linux/compiler_attributes.h>
> > +
> >  const uint8_t sha256_der_prefix[SHA256_DER_LEN] = {
> >         0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
> >         0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
> > @@ -55,7 +57,7 @@ void sha256_starts(sha256_context * ctx)
> >         ctx->state[7] = 0x5BE0CD19;
> >  }
> >
> > -static void sha256_process(sha256_context *ctx, const uint8_t data[64])
> > +static void sha256_process_one(sha256_context *ctx, const uint8_t
> data[64])
> >  {
> >         uint32_t temp1, temp2;
> >         uint32_t W[64];
> > @@ -186,6 +188,18 @@ static void sha256_process(sha256_context *ctx,
> const uint8_t data[64])
> >         ctx->state[7] += H;
> >  }
> >
> > +__weak void sha256_process(sha256_context *ctx, const unsigned char
> *data,
> > +                          unsigned int blocks)
> > +{
> > +       if (!blocks)
> > +               return;
> > +
> > +       while (blocks--) {
> > +               sha256_process_one(ctx, data);
> > +               data += 64;
> > +       }
> > +}
> > +
> >  void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t
> length)
> >  {
> >         uint32_t left, fill;
> > @@ -204,17 +218,15 @@ void sha256_update(sha256_context *ctx, const
> uint8_t *input, uint32_t length)
> >
> >         if (left && length >= fill) {
> >                 memcpy((void *) (ctx->buffer + left), (void *) input,
> fill);
> > -               sha256_process(ctx, ctx->buffer);
> > +               sha256_process(ctx, ctx->buffer, 1);
> >                 length -= fill;
> >                 input += fill;
> >                 left = 0;
> >         }
> >
> > -       while (length >= 64) {
> > -               sha256_process(ctx, input);
> > -               length -= 64;
> > -               input += 64;
> > -       }
> > +       sha256_process(ctx, input, length / 64);
> > +       input += length / 64 * 64;
> > +       length = length % 64;
> >
> >         if (length)
> >                 memcpy((void *) (ctx->buffer + left), (void *) input,
> length);
> > --
> > 2.7.4
> >
>
> I just came across this patch as it broke minnowmax.


Ok, is it a build time or runtime break?


>
> This should be using driver model, not weak functions. Please can you
> take a look?


Yes I can look at it in the next few days. I have used weak function
because it’s an architecture feature offered by armv8 instructions, It’s
not strictly speaking an internal device/IP.

Regards,
Loic

>


More information about the U-Boot mailing list