Add uuidgen.

Reuse create_uuid, but make it match the current RFC.
This commit is contained in:
Elliott Hughes 2018-05-02 22:32:07 -07:00 committed by Rob Landley
parent 3169d948c0
commit ec66213424
3 changed files with 40 additions and 15 deletions

View File

@ -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)

7
tests/uuidgen.test Executable file
View File

@ -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" "" ""

25
toys/pending/uuidgen.c Normal file
View File

@ -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));
}