From fa0a0a895f86cc50f5c87247a44442d4ac757910 Mon Sep 17 00:00:00 2001 From: Jonas Pfenniger Date: Wed, 23 Oct 2013 10:58:48 +0100 Subject: [PATCH] Fixes missing entropy in the uuid package. math/crypto is seeded with 1 and thus will create predictable UUIDs. Because amazon-instance and amazon-ebs in the same second when building both targets the timestamp in front doesn't help either. See #552 --- common/uuid/uuid.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/common/uuid/uuid.go b/common/uuid/uuid.go index 496a2f6ef..0f6cf11b6 100644 --- a/common/uuid/uuid.go +++ b/common/uuid/uuid.go @@ -2,17 +2,26 @@ package uuid import ( "fmt" - "math/rand" + "crypto/rand" + "encoding/binary" "time" ) +func uint32rand() (value uint32) { + err := binary.Read(rand.Reader, binary.LittleEndian, &value) + if err != nil { + panic(err) + } + return +} + // Generates a time ordered UUID. Top 32 bits are a timestamp, // bottom 96 are random. func TimeOrderedUUID() string { unix := uint32(time.Now().UTC().Unix()) - rand1 := rand.Uint32() - rand2 := rand.Uint32() - rand3 := rand.Uint32() + rand1 := uint32rand() + rand2 := uint32rand() + rand3 := uint32rand() return fmt.Sprintf("%08x-%04x-%04x-%04x-%04x%08x", unix, uint16(rand1>>16),