|
@@ -161,48 +161,44 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ToBytes returns a VMessRequest in the form of byte array.
|
|
// ToBytes returns a VMessRequest in the form of byte array.
|
|
|
-func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange, buffer []byte) ([]byte, error) {
|
|
|
|
|
|
|
+func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange, buffer *alloc.Buffer) (*alloc.Buffer, error) {
|
|
|
if buffer == nil {
|
|
if buffer == nil {
|
|
|
- buffer = make([]byte, 0, 300)
|
|
|
|
|
|
|
+ buffer = alloc.NewSmallBuffer().Clear()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
counter := randomRangeInt64(time.Now().UTC().Unix(), 30)
|
|
counter := randomRangeInt64(time.Now().UTC().Unix(), 30)
|
|
|
hash := idHash.Hash(request.UserId.Bytes[:], counter)
|
|
hash := idHash.Hash(request.UserId.Bytes[:], counter)
|
|
|
|
|
|
|
|
- buffer = append(buffer, hash...)
|
|
|
|
|
|
|
+ buffer.Append(hash)
|
|
|
|
|
|
|
|
- encryptionBegin := len(buffer)
|
|
|
|
|
|
|
+ encryptionBegin := buffer.Len()
|
|
|
|
|
|
|
|
- buffer = append(buffer, request.Version)
|
|
|
|
|
- buffer = append(buffer, request.RequestIV...)
|
|
|
|
|
- buffer = append(buffer, request.RequestKey...)
|
|
|
|
|
- buffer = append(buffer, request.ResponseHeader...)
|
|
|
|
|
- buffer = append(buffer, request.Command)
|
|
|
|
|
- buffer = append(buffer, request.Address.PortBytes()...)
|
|
|
|
|
|
|
+ buffer.AppendBytes(request.Version)
|
|
|
|
|
+ buffer.Append(request.RequestIV)
|
|
|
|
|
+ buffer.Append(request.RequestKey)
|
|
|
|
|
+ buffer.Append(request.ResponseHeader)
|
|
|
|
|
+ buffer.AppendBytes(request.Command)
|
|
|
|
|
+ buffer.Append(request.Address.PortBytes())
|
|
|
|
|
|
|
|
switch {
|
|
switch {
|
|
|
case request.Address.IsIPv4():
|
|
case request.Address.IsIPv4():
|
|
|
- buffer = append(buffer, addrTypeIPv4)
|
|
|
|
|
- buffer = append(buffer, request.Address.IP()...)
|
|
|
|
|
|
|
+ buffer.AppendBytes(addrTypeIPv4)
|
|
|
|
|
+ buffer.Append(request.Address.IP())
|
|
|
case request.Address.IsIPv6():
|
|
case request.Address.IsIPv6():
|
|
|
- buffer = append(buffer, addrTypeIPv6)
|
|
|
|
|
- buffer = append(buffer, request.Address.IP()...)
|
|
|
|
|
|
|
+ buffer.AppendBytes(addrTypeIPv6)
|
|
|
|
|
+ buffer.Append(request.Address.IP())
|
|
|
case request.Address.IsDomain():
|
|
case request.Address.IsDomain():
|
|
|
- buffer = append(buffer, addrTypeDomain)
|
|
|
|
|
- buffer = append(buffer, byte(len(request.Address.Domain())))
|
|
|
|
|
- buffer = append(buffer, []byte(request.Address.Domain())...)
|
|
|
|
|
|
|
+ buffer.AppendBytes(addrTypeDomain, byte(len(request.Address.Domain())))
|
|
|
|
|
+ buffer.Append([]byte(request.Address.Domain()))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- encryptionEnd := len(buffer)
|
|
|
|
|
|
|
+ encryptionEnd := buffer.Len()
|
|
|
|
|
|
|
|
fnv1a := fnv.New32a()
|
|
fnv1a := fnv.New32a()
|
|
|
- fnv1a.Write(buffer[encryptionBegin:encryptionEnd])
|
|
|
|
|
|
|
+ fnv1a.Write(buffer.Value[encryptionBegin:encryptionEnd])
|
|
|
|
|
|
|
|
fnvHash := fnv1a.Sum32()
|
|
fnvHash := fnv1a.Sum32()
|
|
|
- buffer = append(buffer, byte(fnvHash>>24))
|
|
|
|
|
- buffer = append(buffer, byte(fnvHash>>16))
|
|
|
|
|
- buffer = append(buffer, byte(fnvHash>>8))
|
|
|
|
|
- buffer = append(buffer, byte(fnvHash))
|
|
|
|
|
|
|
+ buffer.AppendBytes(byte(fnvHash>>24), byte(fnvHash>>16), byte(fnvHash>>8), byte(fnvHash))
|
|
|
encryptionEnd += 4
|
|
encryptionEnd += 4
|
|
|
|
|
|
|
|
aesCipher, err := aes.NewCipher(request.UserId.CmdKey())
|
|
aesCipher, err := aes.NewCipher(request.UserId.CmdKey())
|
|
@@ -210,7 +206,7 @@ func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 u
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
|
aesStream := cipher.NewCFBEncrypter(aesCipher, user.Int64Hash(counter))
|
|
aesStream := cipher.NewCFBEncrypter(aesCipher, user.Int64Hash(counter))
|
|
|
- aesStream.XORKeyStream(buffer[encryptionBegin:encryptionEnd], buffer[encryptionBegin:encryptionEnd])
|
|
|
|
|
|
|
+ aesStream.XORKeyStream(buffer.Value[encryptionBegin:encryptionEnd], buffer.Value[encryptionBegin:encryptionEnd])
|
|
|
|
|
|
|
|
return buffer, nil
|
|
return buffer, nil
|
|
|
}
|
|
}
|