On Fri, 24 May 2024 at 15:20, Caleb Connolly <caleb.conno...@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)