mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
lib: uuid: add functions to generate UUID version 4
This patch adds support to generate UUID (Universally Unique Identifier) in version 4 based on RFC4122, which is randomly. Source: https://www.ietf.org/rfc/rfc4122.txt Changes: - new configs: - CONFIG_LIB_UUID for compile lib/uuid.c - CONFIG_RANDOM_UUID for functions gen_rand_uuid() and gen_rand_uuid_str() - add configs dependency to include/config_fallbacks.h for lib uuid. lib/uuid.c: - add gen_rand_uuid() - this function writes 16 bytes len binary representation of UUID v4 to the memory at given address. - add gen_rand_uuid_str() - this function writes 37 bytes len hexadecimal ASCII string representation of UUID v4 to the memory at given address. Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com> Cc: Stephen Warren <swarren@nvidia.com> Cc: Lukasz Majewski <l.majewski@samsung.com> [trini: Add CONFIG_EFI_PARTITION to fallbacks] Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
d718ded056
commit
4e4815feae
4 changed files with 100 additions and 5 deletions
|
@ -55,6 +55,20 @@
|
|||
#define HAVE_BLOCK_DEVICE
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_PARTITION_UUIDS) || \
|
||||
defined(CONFIG_EFI_PARTITION) || \
|
||||
defined(CONFIG_RANDOM_UUID) || \
|
||||
defined(CONFIG_BOOTP_PXE)) && \
|
||||
!defined(CONFIG_LIB_UUID)
|
||||
#define CONFIG_LIB_UUID
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RANDOM_UUID) && \
|
||||
!defined(CONFIG_LIB_RAND) && \
|
||||
!defined(CONFIG_LIB_HW_RAND)
|
||||
#define CONFIG_LIB_RAND
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PROMPT
|
||||
#define CONFIG_SYS_PROMPT "=> "
|
||||
#endif
|
||||
|
|
|
@ -7,15 +7,35 @@
|
|||
#ifndef __UUID_H__
|
||||
#define __UUID_H__
|
||||
|
||||
/* This is structure is in big-endian */
|
||||
struct uuid {
|
||||
unsigned int time_low;
|
||||
unsigned short time_mid;
|
||||
unsigned short time_hi_and_version;
|
||||
unsigned char clock_seq_hi_and_reserved;
|
||||
unsigned char clock_seq_low;
|
||||
unsigned char node[6];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
UUID_STR_FORMAT_STD,
|
||||
UUID_STR_FORMAT_GUID
|
||||
};
|
||||
|
||||
#define UUID_STR_LEN 36
|
||||
#define UUID_BIN_LEN 16
|
||||
#define UUID_BIN_LEN sizeof(struct uuid)
|
||||
|
||||
#define UUID_VERSION_MASK 0xf000
|
||||
#define UUID_VERSION_SHIFT 12
|
||||
#define UUID_VERSION 0x4
|
||||
|
||||
#define UUID_VARIANT_MASK 0xc0
|
||||
#define UUID_VARIANT_SHIFT 7
|
||||
#define UUID_VARIANT 0x1
|
||||
|
||||
int uuid_str_valid(const char *uuid);
|
||||
int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format);
|
||||
void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format);
|
||||
void gen_rand_uuid(unsigned char *uuid_bin);
|
||||
void gen_rand_uuid_str(char *uuid_str, int str_format);
|
||||
#endif
|
||||
|
|
|
@ -60,8 +60,7 @@ obj-$(CONFIG_REGEX) += slre.o
|
|||
obj-y += string.o
|
||||
obj-y += time.o
|
||||
obj-$(CONFIG_TRACE) += trace.o
|
||||
obj-$(CONFIG_BOOTP_PXE) += uuid.o
|
||||
obj-$(CONFIG_PARTITION_UUIDS) += uuid.o
|
||||
obj-$(CONFIG_LIB_UUID) += uuid.o
|
||||
obj-y += vsprintf.o
|
||||
obj-$(CONFIG_LIB_RAND) += rand.o
|
||||
|
||||
|
|
66
lib/uuid.c
66
lib/uuid.c
|
@ -14,8 +14,22 @@
|
|||
/*
|
||||
* UUID - Universally Unique IDentifier - 128 bits unique number.
|
||||
* There are 5 versions and one variant of UUID defined by RFC4122
|
||||
* specification. Depends on version uuid number base on a time,
|
||||
* host name, MAC address or random data.
|
||||
* specification. A UUID contains a set of fields. The set varies
|
||||
* depending on the version of the UUID, as shown below:
|
||||
* - time, MAC address(v1),
|
||||
* - user ID(v2),
|
||||
* - MD5 of name or URL(v3),
|
||||
* - random data(v4),
|
||||
* - SHA-1 of name or URL(v5),
|
||||
*
|
||||
* Layout of UUID:
|
||||
* timestamp - 60-bit: time_low, time_mid, time_hi_and_version
|
||||
* version - 4 bit (bit 4 through 7 of the time_hi_and_version)
|
||||
* clock seq - 14 bit: clock_seq_hi_and_reserved, clock_seq_low
|
||||
* variant: - bit 6 and 7 of clock_seq_hi_and_reserved
|
||||
* node - 48 bit
|
||||
*
|
||||
* source: https://www.ietf.org/rfc/rfc4122.txt
|
||||
*
|
||||
* UUID binary format (16 bytes):
|
||||
*
|
||||
|
@ -149,3 +163,51 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gen_rand_uuid() - this function generates a random binary UUID version 4.
|
||||
* In this version all fields beside 4 bits of version and
|
||||
* 2 bits of variant are randomly generated.
|
||||
*
|
||||
* @param uuid_bin - pointer to allocated array [16B]. Output is in big endian.
|
||||
*/
|
||||
#ifdef CONFIG_RANDOM_UUID
|
||||
void gen_rand_uuid(unsigned char *uuid_bin)
|
||||
{
|
||||
struct uuid uuid;
|
||||
unsigned int *ptr = (unsigned int *)&uuid;
|
||||
int i;
|
||||
|
||||
/* Set all fields randomly */
|
||||
for (i = 0; i < sizeof(struct uuid) / sizeof(*ptr); i++)
|
||||
*(ptr + i) = cpu_to_be32(rand());
|
||||
|
||||
clrsetbits_be16(&uuid.time_hi_and_version,
|
||||
UUID_VERSION_MASK,
|
||||
UUID_VERSION << UUID_VERSION_SHIFT);
|
||||
|
||||
clrsetbits_8(&uuid.clock_seq_hi_and_reserved,
|
||||
UUID_VARIANT_MASK,
|
||||
UUID_VARIANT << UUID_VARIANT_SHIFT);
|
||||
|
||||
memcpy(uuid_bin, &uuid, sizeof(struct uuid));
|
||||
}
|
||||
|
||||
/*
|
||||
* gen_rand_uuid_str() - this function generates UUID v4 (random) in two string
|
||||
* formats UUID or GUID.
|
||||
*
|
||||
* @param uuid_str - pointer to allocated array [37B].
|
||||
* @param - uuid output type: UUID - 0, GUID - 1
|
||||
*/
|
||||
void gen_rand_uuid_str(char *uuid_str, int str_format)
|
||||
{
|
||||
unsigned char uuid_bin[UUID_BIN_LEN];
|
||||
|
||||
/* Generate UUID (big endian) */
|
||||
gen_rand_uuid(uuid_bin);
|
||||
|
||||
/* Convert UUID bin to UUID or GUID formated STRING */
|
||||
uuid_bin_to_str(uuid_bin, uuid_str, str_format);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue