diff --git a/common/uuid/uuid.go b/common/uuid/uuid.go index 32085d49..de27ea63 100644 --- a/common/uuid/uuid.go +++ b/common/uuid/uuid.go @@ -3,6 +3,7 @@ package uuid // import "github.com/xtls/xray-core/common/uuid" import ( "bytes" "crypto/rand" + "crypto/sha1" "encoding/hex" "github.com/xtls/xray-core/common" @@ -67,8 +68,18 @@ func ParseString(str string) (UUID, error) { var uuid UUID text := []byte(str) - if len(text) < 32 { - return uuid, errors.New("invalid UUID: ", str) + if l := len(text); l < 32 || l > 36 { + if l == 0 || l > 30 { + return uuid, errors.New("invalid UUID: ", str) + } + h := sha1.New() + h.Write(uuid[:]) + h.Write(text) + u := h.Sum(nil)[:16] + u[6] = (u[6] & 0x0f) | (5 << 4) + u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) + copy(uuid[:], u) + return uuid, nil } b := uuid.Bytes() diff --git a/common/uuid/uuid_test.go b/common/uuid/uuid_test.go index 982af41a..7e9b24d8 100644 --- a/common/uuid/uuid_test.go +++ b/common/uuid/uuid_test.go @@ -35,9 +35,10 @@ func TestParseString(t *testing.T) { t.Fatal(r) } - _, err = ParseString("2418d087") - if err == nil { - t.Fatal("Expect error but nil") + u0, _ := ParseString("example") + u5, _ := ParseString("feb54431-301b-52bb-a6dd-e1e93e81bb9e") + if r := cmp.Diff(u0, u5); r != "" { + t.Fatal(r) } _, err = ParseString("2418d087-648k-4990-86e8-19dca1d006d3")