diff options
-rw-r--r-- | lib/lib.c | 23 | ||||
-rwxr-xr-x | tests/uuidgen.test | 7 | ||||
-rw-r--r-- | toys/pending/uuidgen.c | 25 |
3 files changed, 40 insertions, 15 deletions
@@ -1138,29 +1138,22 @@ int qstrcmp(const void *a, const void *b) return strcmp(*(char **)a, *(char **)b); } -// According to http://www.opengroup.org/onlinepubs/9629399/apdxa.htm -// we should generate a uuid structure by reading a clock with 100 nanosecond -// precision, normalizing it to the start of the gregorian calendar in 1582, -// and looking up our eth0 mac address. -// -// On the other hand, we have 128 bits to come up with a unique identifier, of -// which 6 have a defined value. /dev/urandom it is. - +// See https://tools.ietf.org/html/rfc4122, specifically section 4.4 +// "Algorithms for Creating a UUID from Truly Random or Pseudo-Random +// Numbers". void create_uuid(char *uuid) { - // Read 128 random bits + // "Set all the ... bits to randomly (or pseudo-randomly) chosen values". int fd = xopenro("/dev/urandom"); xreadall(fd, uuid, 16); close(fd); - // Claim to be a DCE format UUID. + // "Set the four most significant bits ... of the time_hi_and_version + // field to the 4-bit version number [4]". uuid[6] = (uuid[6] & 0x0F) | 0x40; + // "Set the two most significant bits (bits 6 and 7) of + // clock_seq_hi_and_reserved to zero and one, respectively". uuid[8] = (uuid[8] & 0x3F) | 0x80; - - // rfc2518 section 6.4.1 suggests if we're not using a macaddr, we should - // set bit 1 of the node ID, which is the mac multicast bit. This means we - // should never collide with anybody actually using a macaddr. - uuid[11] |= 128; } char *show_uuid(char *uuid) diff --git a/tests/uuidgen.test b/tests/uuidgen.test new file mode 100755 index 00000000..2042a4b9 --- /dev/null +++ b/tests/uuidgen.test @@ -0,0 +1,7 @@ +#!/bin/bash + +[ -f testing.sh ] && . testing.sh + +#testing "name" "command" "result" "infile" "stdin" + +testing "smoke" "uuidgen | grep -Eq '[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}' && echo okay" "okay\n" "" "" diff --git a/toys/pending/uuidgen.c b/toys/pending/uuidgen.c new file mode 100644 index 00000000..682dec4c --- /dev/null +++ b/toys/pending/uuidgen.c @@ -0,0 +1,25 @@ +/* uuidgen.c - Create a new random UUID + * + * Copyright 2018 The Android Open Source Project + * + * UUID RFC: https://tools.ietf.org/html/rfc4122 + +USE_UUIDGEN(NEWTOY(uuidgen, ">0r(random)", TOYFLAG_USR|TOYFLAG_BIN)) + +config UUIDGEN + bool "uuidgen" + default n + help + usage: uuidgen + + Create and print a new RFC4122 random UUID. +*/ + +#define FOR_uuidgen +#include "toys.h" + +void uuidgen_main(void) +{ + create_uuid(toybuf); + puts(show_uuid(toybuf)); +} |