mirror of https://github.com/v2ray/v2ray-core
Remove unnecessary copy in VMess protocol
parent
b126c5ce2a
commit
3d1a6322bd
|
@ -34,9 +34,9 @@ const (
|
||||||
type VMessRequest struct {
|
type VMessRequest struct {
|
||||||
Version byte
|
Version byte
|
||||||
UserId user.ID
|
UserId user.ID
|
||||||
RequestIV [16]byte
|
RequestIV []byte
|
||||||
RequestKey [16]byte
|
RequestKey []byte
|
||||||
ResponseHeader [4]byte
|
ResponseHeader []byte
|
||||||
Command byte
|
Command byte
|
||||||
Address v2net.Address
|
Address v2net.Address
|
||||||
}
|
}
|
||||||
|
@ -102,9 +102,9 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
||||||
return nil, errors.NewProtocolVersionError(int(request.Version))
|
return nil, errors.NewProtocolVersionError(int(request.Version))
|
||||||
}
|
}
|
||||||
|
|
||||||
copy(request.RequestIV[:], buffer[1:17]) // 16 bytes
|
request.RequestIV = buffer[1:17] // 16 bytes
|
||||||
copy(request.RequestKey[:], buffer[17:33]) // 16 bytes
|
request.RequestKey = buffer[17:33] // 16 bytes
|
||||||
copy(request.ResponseHeader[:], buffer[33:37]) // 4 bytes
|
request.ResponseHeader = buffer[33:37] // 4 bytes
|
||||||
request.Command = buffer[37]
|
request.Command = buffer[37]
|
||||||
|
|
||||||
port := binary.BigEndian.Uint16(buffer[38:40])
|
port := binary.BigEndian.Uint16(buffer[38:40])
|
||||||
|
@ -169,9 +169,9 @@ func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 u
|
||||||
encryptionBegin := len(buffer)
|
encryptionBegin := len(buffer)
|
||||||
|
|
||||||
buffer = append(buffer, request.Version)
|
buffer = append(buffer, request.Version)
|
||||||
buffer = append(buffer, request.RequestIV[:]...)
|
buffer = append(buffer, request.RequestIV...)
|
||||||
buffer = append(buffer, request.RequestKey[:]...)
|
buffer = append(buffer, request.RequestKey...)
|
||||||
buffer = append(buffer, request.ResponseHeader[:]...)
|
buffer = append(buffer, request.ResponseHeader...)
|
||||||
buffer = append(buffer, request.Command)
|
buffer = append(buffer, request.Command)
|
||||||
buffer = append(buffer, request.Address.PortBytes()...)
|
buffer = append(buffer, request.Address.PortBytes()...)
|
||||||
|
|
||||||
|
|
|
@ -26,20 +26,12 @@ func TestVMessSerialization(t *testing.T) {
|
||||||
request.Version = byte(0x01)
|
request.Version = byte(0x01)
|
||||||
request.UserId = userId
|
request.UserId = userId
|
||||||
|
|
||||||
_, err = rand.Read(request.RequestIV[:])
|
randBytes := make([]byte, 36)
|
||||||
if err != nil {
|
_, err = rand.Read(randBytes)
|
||||||
t.Fatal(err)
|
assert.Error(err).IsNil()
|
||||||
}
|
request.RequestIV = randBytes[:16]
|
||||||
|
request.RequestKey = randBytes[16:32]
|
||||||
_, err = rand.Read(request.RequestKey[:])
|
request.ResponseHeader = randBytes[32:]
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = rand.Read(request.ResponseHeader[:])
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
request.Command = byte(0x01)
|
request.Command = byte(0x01)
|
||||||
request.Address = v2net.DomainAddress("v2ray.com", 80)
|
request.Address = v2net.DomainAddress("v2ray.com", 80)
|
||||||
|
@ -61,9 +53,9 @@ func TestVMessSerialization(t *testing.T) {
|
||||||
|
|
||||||
assert.Byte(actualRequest.Version).Named("Version").Equals(byte(0x01))
|
assert.Byte(actualRequest.Version).Named("Version").Equals(byte(0x01))
|
||||||
assert.String(actualRequest.UserId.String).Named("UserId").Equals(request.UserId.String)
|
assert.String(actualRequest.UserId.String).Named("UserId").Equals(request.UserId.String)
|
||||||
assert.Bytes(actualRequest.RequestIV[:]).Named("RequestIV").Equals(request.RequestIV[:])
|
assert.Bytes(actualRequest.RequestIV).Named("RequestIV").Equals(request.RequestIV[:])
|
||||||
assert.Bytes(actualRequest.RequestKey[:]).Named("RequestKey").Equals(request.RequestKey[:])
|
assert.Bytes(actualRequest.RequestKey).Named("RequestKey").Equals(request.RequestKey[:])
|
||||||
assert.Bytes(actualRequest.ResponseHeader[:]).Named("ResponseHeader").Equals(request.ResponseHeader[:])
|
assert.Bytes(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader[:])
|
||||||
assert.Byte(actualRequest.Command).Named("Command").Equals(request.Command)
|
assert.Byte(actualRequest.Command).Named("Command").Equals(request.Command)
|
||||||
assert.String(actualRequest.Address.String()).Named("Address").Equals(request.Address.String())
|
assert.String(actualRequest.Address.String()).Named("Address").Equals(request.Address.String())
|
||||||
}
|
}
|
||||||
|
@ -77,9 +69,11 @@ func BenchmarkVMessRequestWriting(b *testing.B) {
|
||||||
request.Version = byte(0x01)
|
request.Version = byte(0x01)
|
||||||
request.UserId = userId
|
request.UserId = userId
|
||||||
|
|
||||||
rand.Read(request.RequestIV[:])
|
randBytes := make([]byte, 36)
|
||||||
rand.Read(request.RequestKey[:])
|
rand.Read(randBytes)
|
||||||
rand.Read(request.ResponseHeader[:])
|
request.RequestIV = randBytes[:16]
|
||||||
|
request.RequestKey = randBytes[16:32]
|
||||||
|
request.ResponseHeader = randBytes[32:]
|
||||||
|
|
||||||
request.Command = byte(0x01)
|
request.Command = byte(0x01)
|
||||||
request.Address = v2net.DomainAddress("v2ray.com", 80)
|
request.Address = v2net.DomainAddress("v2ray.com", 80)
|
||||||
|
|
|
@ -80,9 +80,12 @@ func (handler *VMessOutboundHandler) Dispatch(firstPacket v2net.Packet, ray core
|
||||||
Command: command,
|
Command: command,
|
||||||
Address: firstPacket.Destination().Address(),
|
Address: firstPacket.Destination().Address(),
|
||||||
}
|
}
|
||||||
rand.Read(request.RequestIV[:])
|
|
||||||
rand.Read(request.RequestKey[:])
|
buffer := make([]byte, 36) // 16 + 16 + 4
|
||||||
rand.Read(request.ResponseHeader[:])
|
rand.Read(buffer)
|
||||||
|
request.RequestIV = buffer[:16]
|
||||||
|
request.RequestKey = buffer[16:32]
|
||||||
|
request.ResponseHeader = buffer[32:]
|
||||||
|
|
||||||
go startCommunicate(request, vNextAddress, ray, firstPacket)
|
go startCommunicate(request, vNextAddress, ray, firstPacket)
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue