diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2024-03-04 20:00:34 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2024-03-05 16:28:06 +0100 |
commit | 19395849543714e4820c0c0dff30e34285aef275 (patch) | |
tree | de4123ccb52f3797e390808a75096242096c6887 /lib | |
parent | 387d6f9ed9a1e45a3d1659c531f8c578cc626f05 (diff) | |
download | barebox-19395849543714e4820c0c0dff30e34285aef275.tar.gz barebox-19395849543714e4820c0c0dff30e34285aef275.tar.xz |
lib: uuid: implement uuid/guid_parse
We opencode this at least once in EFI code, so import the Linux
definition and start using that instead.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Link: https://lore.barebox.org/20240304190038.3486881-110-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/uuid.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/uuid.c b/lib/uuid.c index 60a651e330..1c134bfb4b 100644 --- a/lib/uuid.c +++ b/lib/uuid.c @@ -9,6 +9,7 @@ #include <linux/uuid.h> #include <module.h> #include <stdlib.h> +#include <linux/ctype.h> #include <linux/export.h> const guid_t guid_null; @@ -16,6 +17,9 @@ EXPORT_SYMBOL(guid_null); const uuid_t uuid_null; EXPORT_SYMBOL(uuid_null); +const u8 guid_index[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15}; +const u8 uuid_index[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; + /** * generate_random_uuid - generate a random UUID * @uuid: where to put the generated UUID @@ -44,3 +48,62 @@ void generate_random_guid(unsigned char guid[16]) guid[8] = (guid[8] & 0x3F) | 0x80; } EXPORT_SYMBOL(generate_random_guid); + +/** + * uuid_is_valid - checks if a UUID string is valid + * @uuid: UUID string to check + * + * Description: + * It checks if the UUID string is following the format: + * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + * + * where x is a hex digit. + * + * Return: true if input is valid UUID string. + */ +bool uuid_is_valid(const char *uuid) +{ + unsigned int i; + + for (i = 0; i < UUID_STRING_LEN; i++) { + if (i == 8 || i == 13 || i == 18 || i == 23) { + if (uuid[i] != '-') + return false; + } else if (!isxdigit(uuid[i])) { + return false; + } + } + + return true; +} +EXPORT_SYMBOL(uuid_is_valid); + +static int __uuid_parse(const char *uuid, __u8 b[16], const u8 ei[16]) +{ + static const u8 si[16] = {0,2,4,6,9,11,14,16,19,21,24,26,28,30,32,34}; + unsigned int i; + + if (!uuid_is_valid(uuid)) + return -EINVAL; + + for (i = 0; i < 16; i++) { + int hi = hex_to_bin(uuid[si[i] + 0]); + int lo = hex_to_bin(uuid[si[i] + 1]); + + b[ei[i]] = (hi << 4) | lo; + } + + return 0; +} + +int guid_parse(const char *uuid, guid_t *u) +{ + return __uuid_parse(uuid, u->b, guid_index); +} +EXPORT_SYMBOL(guid_parse); + +int uuid_parse(const char *uuid, uuid_t *u) +{ + return __uuid_parse(uuid, u->b, uuid_index); +} +EXPORT_SYMBOL(uuid_parse); |