[PATCH RFC 1/4] lib: uuid: add UUID v5 support
Ilias Apalodimas
ilias.apalodimas at linaro.org
Fri May 24 14:23:05 CEST 2024
On Fri, 24 May 2024 at 15:20, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>
>
>
> On 24/05/2024 08:01, Ilias Apalodimas wrote:
> > [...]
> >
> >> #include <dm/uclass.h>
> >> #include <rng.h>
> >> +#include <u-boot/sha1.h>
> >>
> >> int uuid_str_valid(const char *uuid)
> >> {
> >> int i, valid;
> >> @@ -368,8 +369,40 @@ void uuid_bin_to_str(const unsigned char *uuid_bin, char *uuid_str,
> >> }
> >> }
> >> }
> >>
> >> +#if CONFIG_IS_ENABLED(UUID_GEN_V5)
> >> +void gen_uuid_v5(struct uuid *namespace, struct uuid *uuid, ...)
> >> +{
> >> + sha1_context ctx;
> >> + va_list args;
> >> + const u8 *data;
> >> + u8 hash[SHA1_SUM_LEN];
> >> +
> >> + sha1_starts(&ctx);
> >> + /* Hash the namespace UUID as salt */
> >> + sha1_update(&ctx, (char *)namespace, UUID_BIN_LEN);
> >> + va_start(args, uuid);
> >
> > Should we use sha1 here? Is it described somewhere in UUIDv5 requirements?
> > If not I'd rather have a sha256
>
> The spec says sha1 yeah, this doesn't need to be cryptographically
> secure (the inputs are generally known) but just not have collisions.
>
> That said, we don't need to be spec compliant - just consistent. So I'm
> fine either way. I'd err on the side of what's fastest to compute (if
> that even matters here).
Ok, that's fine, we can stick to the spec
Cheers
/Ilias
> >
> >> +
> >> + while ((data = va_arg(args, const u8 *)))
> >> + sha1_update(&ctx, (char *)data, va_arg(args, int));
> >
> > sha1_update second argument is an unsigned int
>
> Ah thanks.
> >
> >> +
> >> + va_end(args);
> >> + sha1_finish(&ctx, hash);
> >> +
> >> + /* Truncate the hash into output UUID and convert it to big endian */
> >> + cpu_to_be32_array((u32 *)uuid, (u32 *)hash, 4);
> >> +
> >> + /* Configure variant/version bits */
> >> + clrsetbits_be16(&uuid->time_hi_and_version,
> >> + UUID_VERSION_MASK,
> >> + 5 << UUID_VERSION_SHIFT);
> >> + clrsetbits_8(&uuid->clock_seq_hi_and_reserved,
> >> + UUID_VARIANT_MASK,
> >> + UUID_VARIANT << UUID_VARIANT_SHIFT);
> >> +}
> >> +#endif
> >> +
> >> #if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID)
> >> void gen_rand_uuid(unsigned char *uuid_bin)
> >> {
> >> u32 ptr[4];
> >>
> >> --
> >> 2.44.0
> >>
> >
> > Thanks
> > /Ilias
>
> --
> // Caleb (they/them)
More information about the U-Boot
mailing list