]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: add virRandomToken API
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 19 Nov 2020 12:22:47 +0000 (12:22 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Thu, 13 May 2021 10:07:13 +0000 (11:07 +0100)
A random token is simply a string of random bytes formatted in
hexidecimal.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/libvirt_private.syms
src/util/virrandom.c
src/util/virrandom.h

index 1b12c490183265d1af9aebbd337d8d68f9db08ad..23621fcfd0b1b2f28ac4b3eb040b50d323e2f602 100644 (file)
@@ -3081,6 +3081,7 @@ virRandomBits;
 virRandomBytes;
 virRandomGenerateWWN;
 virRandomInt;
+virRandomToken;
 
 
 # util/virresctrl.h
index 3ae1297e6b09ed68f04d245ada0c04ed02d26123..c3f3aa1fa605839e57aad28ba8196a55a8034025 100644 (file)
@@ -161,3 +161,21 @@ virRandomGenerateWWN(char **wwn,
                            (unsigned long long)virRandomBits(36));
     return 0;
 }
+
+char *virRandomToken(size_t len)
+{
+    g_autofree unsigned char *data = g_new0(unsigned char, len);
+    g_autofree char *token = g_new0(char, (len * 2) + 1);
+    static const char hex[] = "0123456789abcdef";
+    size_t i;
+
+    if (virRandomBytes(data, len) < 0)
+        return NULL;
+
+    for (i = 0; i < len; i++) {
+        token[(i*2)] = hex[data[i] & 0xf];
+        token[(i*2)+1] = hex[(data[i] >> 4) & 0xf];
+    }
+
+    return g_steal_pointer(&token);
+}
index 297721f9128253954df9f01de66c284990612ed3..aac684ada95566c95bcf65f39d4b5addb27a2cf6 100644 (file)
@@ -26,3 +26,4 @@ uint32_t virRandomInt(uint32_t max);
 int virRandomBytes(unsigned char *buf, size_t buflen)
     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT G_GNUC_NO_INLINE;
 int virRandomGenerateWWN(char **wwn, const char *virt_type) G_GNUC_NO_INLINE;
+char *virRandomToken(size_t len);