]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package uuid |
2 | ||
3 | import ( | |
4 | "crypto/rand" | |
5 | "encoding/hex" | |
6 | "fmt" | |
7 | ) | |
8 | ||
15c0b25d AP |
9 | // GenerateRandomBytes is used to generate random bytes of given size. |
10 | func GenerateRandomBytes(size int) ([]byte, error) { | |
11 | buf := make([]byte, size) | |
bae9f6d2 | 12 | if _, err := rand.Read(buf); err != nil { |
15c0b25d | 13 | return nil, fmt.Errorf("failed to read random bytes: %v", err) |
bae9f6d2 | 14 | } |
15c0b25d AP |
15 | return buf, nil |
16 | } | |
bae9f6d2 | 17 | |
107c1cdb ND |
18 | const uuidLen = 16 |
19 | ||
15c0b25d AP |
20 | // GenerateUUID is used to generate a random UUID |
21 | func GenerateUUID() (string, error) { | |
107c1cdb | 22 | buf, err := GenerateRandomBytes(uuidLen) |
15c0b25d AP |
23 | if err != nil { |
24 | return "", err | |
25 | } | |
bae9f6d2 JC |
26 | return FormatUUID(buf) |
27 | } | |
28 | ||
29 | func FormatUUID(buf []byte) (string, error) { | |
107c1cdb ND |
30 | if buflen := len(buf); buflen != uuidLen { |
31 | return "", fmt.Errorf("wrong length byte slice (%d)", buflen) | |
bae9f6d2 JC |
32 | } |
33 | ||
107c1cdb | 34 | return fmt.Sprintf("%x-%x-%x-%x-%x", |
bae9f6d2 JC |
35 | buf[0:4], |
36 | buf[4:6], | |
37 | buf[6:8], | |
38 | buf[8:10], | |
39 | buf[10:16]), nil | |
40 | } | |
41 | ||
42 | func ParseUUID(uuid string) ([]byte, error) { | |
107c1cdb | 43 | if len(uuid) != 2 * uuidLen + 4 { |
bae9f6d2 JC |
44 | return nil, fmt.Errorf("uuid string is wrong length") |
45 | } | |
46 | ||
107c1cdb ND |
47 | if uuid[8] != '-' || |
48 | uuid[13] != '-' || | |
49 | uuid[18] != '-' || | |
50 | uuid[23] != '-' { | |
bae9f6d2 JC |
51 | return nil, fmt.Errorf("uuid is improperly formatted") |
52 | } | |
53 | ||
54 | hexStr := uuid[0:8] + uuid[9:13] + uuid[14:18] + uuid[19:23] + uuid[24:36] | |
55 | ||
56 | ret, err := hex.DecodeString(hexStr) | |
57 | if err != nil { | |
58 | return nil, err | |
59 | } | |
107c1cdb | 60 | if len(ret) != uuidLen { |
bae9f6d2 JC |
61 | return nil, fmt.Errorf("decoded hex is the wrong length") |
62 | } | |
63 | ||
64 | return ret, nil | |
65 | } |