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).

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

Reply via email to