[PATCH RFC 1/4] lib: uuid: add UUID v5 support

Ilias Apalodimas ilias.apalodimas at linaro.org
Fri May 24 08:01:49 CEST 2024


[...]

>  #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

> +
> +       while ((data = va_arg(args, const u8 *)))
> +               sha1_update(&ctx, (char *)data, va_arg(args, int));

sha1_update second argument is an unsigned int

> +
> +       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


More information about the U-Boot mailing list