summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-11-28 12:11:49 +0100
committerThomas Haller <thaller@redhat.com>2014-12-04 17:02:22 +0100
commite7661c9b525e5a4cd3bafe605b4fc464a4d5f620 (patch)
tree748afd15ba8cf58a7cfe25aca77bf4ebe25ced77
parent1e313e000dceda2bd7a753c407cc3078a37ce402 (diff)
downloadNetworkManager-e7661c9b525e5a4cd3bafe605b4fc464a4d5f620.tar.gz
libnm: implement variant3 UUIDs according to rfc4122
Compare the results: perl -e 'use UUID::Tiny ":std"; print(uuid_to_string(create_uuid(UUID_V3, UUID_NS_DNS, "test"))."\n");' python -c 'from uuid import *; print(uuid3(UUID("6ba7b810-9dad-11d1-80b4-00c04fd430c8"), "test"))'
-rw-r--r--libnm-core/nm-utils.c36
-rw-r--r--libnm-core/nm-utils.h1
-rw-r--r--libnm-core/tests/test-general.c24
3 files changed, 51 insertions, 10 deletions
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index a5acc24cd5..bfb68636f0 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -1969,17 +1969,41 @@ nm_utils_uuid_generate_from_string (const char *s, gssize slen, int uuid_type, g
uuid_t uuid;
char *buf = NULL;
- g_return_val_if_fail (s && *s, NULL);
- g_return_val_if_fail (slen < 0 || slen > 0, FALSE);
+ g_return_val_if_fail (slen == 0 || s, FALSE);
- /* for now, only support legacy type */
- g_return_val_if_fail (uuid_type == NM_UTILS_UUID_TYPE_LEGACY, NULL);
- g_return_val_if_fail (!type_args, NULL);
+ g_return_val_if_fail (uuid_type == NM_UTILS_UUID_TYPE_LEGACY || uuid_type == NM_UTILS_UUID_TYPE_VARIANT3, NULL);
+ g_return_val_if_fail (!type_args || uuid_type == NM_UTILS_UUID_TYPE_VARIANT3, NULL);
if (slen < 0)
slen = strlen (s);
+ else if (slen == 0)
+ s = "";
- crypto_md5_hash (NULL, 0, s, slen, (char *) uuid, sizeof (uuid));
+ switch (uuid_type) {
+ case NM_UTILS_UUID_TYPE_LEGACY:
+ g_return_val_if_fail (slen > 0, NULL);
+ crypto_md5_hash (NULL, 0, s, slen, (char *) uuid, sizeof (uuid));
+ break;
+ case NM_UTILS_UUID_TYPE_VARIANT3: {
+ uuid_t ns_uuid = { 0 };
+ GString *str;
+
+ if (type_args) {
+ /* type_args can be a name space UUID. Interpret it as (char *) */
+ if (uuid_parse ((char *) type_args, ns_uuid) != 0)
+ g_return_val_if_reached (NULL);
+ }
+ str = g_string_sized_new (sizeof (ns_uuid) + slen + 1);
+ g_string_append_len (str, (const char *) ns_uuid, sizeof (ns_uuid));
+ g_string_append_len (str, s, slen);
+ crypto_md5_hash (NULL, 0, str->str, str->len, (char *) uuid, sizeof (uuid));
+ uuid[6] = (uuid[6] & 0x0F) | 0x30;
+ uuid[8] = (uuid[8] & 0x3F) | 0x80;
+ break;
+ }
+ default:
+ g_return_val_if_reached (NULL);
+ }
buf = g_malloc0 (37);
uuid_unparse_lower (uuid, &buf[0]);
diff --git a/libnm-core/nm-utils.h b/libnm-core/nm-utils.h
index 9aecaa94e1..fe67bc3384 100644
--- a/libnm-core/nm-utils.h
+++ b/libnm-core/nm-utils.h
@@ -121,6 +121,7 @@ GPtrArray *nm_utils_ip_routes_from_variant (GVariant *value,
int family);
#define NM_UTILS_UUID_TYPE_LEGACY 0
+#define NM_UTILS_UUID_TYPE_VARIANT3 1
char *nm_utils_uuid_generate (void);
char *nm_utils_uuid_generate_from_string (const char *s, gssize slen, int uuid_type, gpointer type_args);
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c
index c18b7a066e..72b7765e09 100644
--- a/libnm-core/tests/test-general.c
+++ b/libnm-core/tests/test-general.c
@@ -3804,13 +3804,14 @@ test_hexstr2bin (void)
/******************************************************************************/
+#define UUID_NIL "00000000-0000-0000-0000-000000000000"
+#define UUID_NS_DNS "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
+
static void
_test_uuid (int uuid_type, const char *expected_uuid, const char *str, gssize slen, gpointer type_args)
{
gs_free char *uuid_test = NULL;
- g_assert (str);
-
uuid_test = nm_utils_uuid_generate_from_string (str, slen, uuid_type, type_args);
g_assert (uuid_test);
@@ -3823,6 +3824,9 @@ _test_uuid (int uuid_type, const char *expected_uuid, const char *str, gssize sl
if (slen < 0)
_test_uuid (uuid_type, expected_uuid, str, strlen (str), type_args);
+
+ if (uuid_type == NM_UTILS_UUID_TYPE_VARIANT3 && !type_args)
+ _test_uuid (uuid_type, expected_uuid, str, slen, UUID_NIL);
}
static void
@@ -3834,15 +3838,27 @@ test_nm_utils_uuid_generate_from_string (void)
_test_uuid (NM_UTILS_UUID_TYPE_LEGACY, "098f6bcd-4621-d373-cade-4e832627b4f6", "test", -1, NULL);
_test_uuid (NM_UTILS_UUID_TYPE_LEGACY, "59c0547b-7fe2-1c15-2cce-e328e8bf6742", "/etc/NetworkManager/system-connections/em1", -1, NULL);
- g_test_expect_message ("libnm", G_LOG_LEVEL_CRITICAL, "*char *nm_utils_uuid_generate_from_string(const char *, gssize, int, gpointer): *s && *s*");
+ g_test_expect_message ("libnm", G_LOG_LEVEL_CRITICAL, "*char *nm_utils_uuid_generate_from_string(const char *, gssize, int, gpointer): *slen > 0*");
uuid_test = nm_utils_uuid_generate_from_string ("", 0, NM_UTILS_UUID_TYPE_LEGACY, NULL);
g_assert (uuid_test == NULL);
g_test_assert_expected_messages ();
- g_test_expect_message ("libnm", G_LOG_LEVEL_CRITICAL, "*char *nm_utils_uuid_generate_from_string(const char *, gssize, int, gpointer): *s && *s*");
+ g_test_expect_message ("libnm", G_LOG_LEVEL_CRITICAL, "*char *nm_utils_uuid_generate_from_string(const char *, gssize, int, gpointer): *slen > 0*");
uuid_test = nm_utils_uuid_generate_from_string (NULL, 0, NM_UTILS_UUID_TYPE_LEGACY, NULL);
g_assert (uuid_test == NULL);
g_test_assert_expected_messages ();
+
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "4ae71336-e44b-39bf-b9d2-752e234818a5", NULL, 0, NULL);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "4ae71336-e44b-39bf-b9d2-752e234818a5", "", -1, NULL);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "0531103a-d8fc-3dd4-b972-d98e4750994e", "a", -1, NULL);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "96e17d7a-ac89-38cf-95e1-bf5098da34e1", "test", -1, NULL);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "8156568e-4ae6-3f34-a93e-18e2c6cbbf78", "a\0b", 3, NULL);
+
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "c87ee674-4ddc-3efe-a74e-dfe25da5d7b3", NULL, 0, UUID_NS_DNS);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "c87ee674-4ddc-3efe-a74e-dfe25da5d7b3", "", -1, UUID_NS_DNS);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "4c104dd0-4821-30d5-9ce3-0e7a1f8b7c0d", "a", -1, UUID_NS_DNS);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "45a113ac-c7f2-30b0-90a5-a399ab912716", "test", -1, UUID_NS_DNS);
+ _test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "002a0ada-f547-375a-bab5-896a11d1927e", "a\0b", 3, UUID_NS_DNS);
}
/******************************************************************************/