From: Aki Tuomi Date: Thu, 20 Apr 2023 20:27:57 +0000 (+0300) Subject: lib: guid - Add guid_uuid4_generate() X-Git-Tag: 2.4.0~2776 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07e2010125fe44525bab646b9230c374e0cf2690;p=thirdparty%2Fdovecot%2Fcore.git lib: guid - Add guid_uuid4_generate() Generates a UUIDv4 UUID --- diff --git a/src/lib/guid.c b/src/lib/guid.c index 7a825fd5cd..1bafbcf25d 100644 --- a/src/lib/guid.c +++ b/src/lib/guid.c @@ -9,6 +9,7 @@ #include "hex-binary.h" #include "hostpid.h" #include "guid.h" +#include "randgen.h" #include #include @@ -93,6 +94,13 @@ void guid_128_generate(guid_128_t guid_r) memcpy(guid_r + 8, guid_static, 8); } +void guid_128_uuid4_generate(guid_128_t uuid) +{ + random_fill(uuid, sizeof(guid_128_t)); + uuid[6] = (uuid[6] & 0x0F) | 0x40; /* Set version 4 */ + uuid[8] = (uuid[8] & 0xBF) | 0x80; /* Set variant 2 (first 2 bits to 10) */ +} + bool guid_128_is_empty(const guid_128_t guid) { unsigned int i; diff --git a/src/lib/guid.h b/src/lib/guid.h index 0bf58d85f7..5ed628c78f 100644 --- a/src/lib/guid.h +++ b/src/lib/guid.h @@ -8,6 +8,10 @@ typedef uint8_t guid_128_t[GUID_128_SIZE]; ARRAY_DEFINE_TYPE(guid_128_t, guid_128_t); +/* Very liberal check, checks only version. */ +#define GUID_128_IS_UUID4(uuid) \ + (((uuid)[6] & 0xF0) == 0x40) + enum uuid_format { FORMAT_RECORD, FORMAT_COMPACT, @@ -17,6 +21,9 @@ enum uuid_format { const char *guid_generate(void); /* Generate 128 bit GUID */ void guid_128_generate(guid_128_t guid_r); +/* Generate UUID4gen1 */ +void guid_128_uuid4_generate(guid_128_t guid_r); + /* Returns TRUE if GUID is empty (not set / unknown). */ bool guid_128_is_empty(const guid_128_t guid) ATTR_PURE; static inline void guid_128_empty(guid_128_t guid) diff --git a/src/lib/test-guid.c b/src/lib/test-guid.c index 0a13cf1142..268a89b13e 100644 --- a/src/lib/test-guid.c +++ b/src/lib/test-guid.c @@ -174,7 +174,7 @@ void test_guid(void) 0xab, 0xcd, 0xef, 0xAB, 0xCD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00 }; - guid_128_t guid1, guid2, guid3; + guid_128_t guid1, guid2, guid3, guid_empty; const char *str; char guidbuf[GUID_128_SIZE*2 + 2]; unsigned int i; @@ -242,6 +242,8 @@ void test_guid(void) guidbuf[0] = ' '; test_assert(guid_128_from_string(guidbuf, guid3) < 0); + test_assert(guid_128_from_uuid_string("00000000-0000-0000-0000-000000000000", guid_empty) == 0); + test_assert(guid_128_is_empty(guid_empty)); test_assert(guid_128_from_uuid_string("fee0ceac-0327-11e7-ad39-52540078f374", guid3) == 0); test_assert(guid_128_from_uuid_string("fee0ceac032711e7ad3952540078f374", guid2) == 0); test_assert(guid_128_cmp(guid3, guid2) == 0); @@ -253,6 +255,12 @@ void test_guid(void) /* failure test */ test_assert(guid_128_from_uuid_string("fe-e0ceac-0327-11e7-ad39-52540078f374", guid3) < 0); + /* UUIDv4 */ + guid_128_t uuidv4; + guid_128_uuid4_generate(uuidv4); + test_assert((uuidv4[6] & 0xF0) == 0x40); + test_assert((uuidv4[8] & 0xC0) == 0x80); + test_end(); test_ioloop_guid_128_generate();