]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: guid - Add guid_uuid4_generate()
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 20 Apr 2023 20:27:57 +0000 (23:27 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 2 May 2023 09:55:12 +0000 (09:55 +0000)
Generates a UUIDv4 UUID

src/lib/guid.c
src/lib/guid.h
src/lib/test-guid.c

index 7a825fd5cdc2e4bf1b3528ab1a5ac2d4d19daee2..1bafbcf25dec90d87a2159344afdd499e05fcac7 100644 (file)
@@ -9,6 +9,7 @@
 #include "hex-binary.h"
 #include "hostpid.h"
 #include "guid.h"
+#include "randgen.h"
 
 #include <unistd.h>
 #include <time.h>
@@ -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;
index 0bf58d85f7c66119d6c6787db2c99e952bf66672..5ed628c78fed8b9da162eff5b816520d4bf42593 100644 (file)
@@ -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)
index 0a13cf1142524227f3eff043763645b839912826..268a89b13efef1113e8ed2f9801b71a641e31ed6 100644 (file)
@@ -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();