34 lines
731 B
Go
34 lines
731 B
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"crypto/sha1"
|
||
|
"encoding/hex"
|
||
|
"github.com/gofrs/uuid"
|
||
|
)
|
||
|
|
||
|
// UUIDMap https://github.com/XTLS/Xray-core/issues/158#issue-783294090
|
||
|
func UUIDMap(str string) (uuid.UUID, error) {
|
||
|
u, err := uuid.FromString(str)
|
||
|
if err != nil {
|
||
|
var Nil [16]byte
|
||
|
h := sha1.New()
|
||
|
h.Write(Nil[:])
|
||
|
h.Write([]byte(str))
|
||
|
u := h.Sum(nil)[:16]
|
||
|
u[6] = (u[6] & 0x0f) | (5 << 4)
|
||
|
u[8] = u[8]&(0xff>>2) | (0x02 << 6)
|
||
|
buf := make([]byte, 36)
|
||
|
hex.Encode(buf[0:8], u[0:4])
|
||
|
buf[8] = '-'
|
||
|
hex.Encode(buf[9:13], u[4:6])
|
||
|
buf[13] = '-'
|
||
|
hex.Encode(buf[14:18], u[6:8])
|
||
|
buf[18] = '-'
|
||
|
hex.Encode(buf[19:23], u[8:10])
|
||
|
buf[23] = '-'
|
||
|
hex.Encode(buf[24:], u[10:])
|
||
|
return uuid.FromString(string(buf))
|
||
|
}
|
||
|
return u, nil
|
||
|
}
|