Remove unnecessary copy in VMess protocol

pull/40/head
V2Ray 2015-10-07 14:50:17 +02:00
parent b126c5ce2a
commit 3d1a6322bd
3 changed files with 29 additions and 32 deletions

View File

@ -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()...)

View File

@ -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)

View File

@ -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