mirror of https://github.com/v2ray/v2ray-core
2nd step to reduce number of authentication bits
parent
51695df239
commit
f60747c455
|
@ -138,8 +138,7 @@ func (this *VMessInboundHandler) HandleConnection(connection *net.TCPConn) error
|
|||
// Optimize for small response packet
|
||||
buffer := alloc.NewLargeBuffer().Clear()
|
||||
defer buffer.Release()
|
||||
buffer.AppendBytes(request.ResponseHeader[0] ^ request.ResponseHeader[1])
|
||||
buffer.AppendBytes(request.ResponseHeader[2] ^ request.ResponseHeader[3])
|
||||
buffer.AppendBytes(request.ResponseHeader, byte(0))
|
||||
buffer.AppendBytes(byte(0), byte(0))
|
||||
|
||||
if data, open := <-output; open {
|
||||
|
|
|
@ -41,12 +41,9 @@ func (this *VMessOutboundHandler) Dispatch(firstPacket v2net.Packet, ray ray.Out
|
|||
buffer := alloc.NewSmallBuffer()
|
||||
defer buffer.Release() // Buffer is released after communication finishes.
|
||||
v2net.ReadAllBytes(rand.Reader, buffer.Value[:33]) // 16 + 16 + 1
|
||||
buffer.Value[33] = 0
|
||||
buffer.Value[34] = 0
|
||||
buffer.Value[35] = 0
|
||||
request.RequestIV = buffer.Value[:16]
|
||||
request.RequestKey = buffer.Value[16:32]
|
||||
request.ResponseHeader = buffer.Value[32:36]
|
||||
request.ResponseHeader = buffer.Value[32]
|
||||
|
||||
return this.startCommunicate(request, vNextAddress, ray, firstPacket)
|
||||
}
|
||||
|
@ -139,8 +136,8 @@ func (this *VMessOutboundHandler) handleRequest(conn net.Conn, request *protocol
|
|||
return
|
||||
}
|
||||
|
||||
func headerMatch(request *protocol.VMessRequest, responseHeader []byte) bool {
|
||||
return (request.ResponseHeader[0] == responseHeader[0])
|
||||
func headerMatch(request *protocol.VMessRequest, responseHeader byte) bool {
|
||||
return request.ResponseHeader == responseHeader
|
||||
}
|
||||
|
||||
func (this *VMessOutboundHandler) handleResponse(conn net.Conn, request *protocol.VMessRequest, output chan<- *alloc.Buffer, finish *sync.Mutex, isUDP bool) {
|
||||
|
@ -162,7 +159,7 @@ func (this *VMessOutboundHandler) handleResponse(conn net.Conn, request *protoco
|
|||
buffer.Release()
|
||||
return
|
||||
}
|
||||
if buffer.Len() < 4 || !headerMatch(request, buffer.Value[:2]) {
|
||||
if buffer.Len() < 4 || !headerMatch(request, buffer.Value[0]) {
|
||||
log.Warning("VMessOut: unexepcted response header. The connection is probably hijacked.")
|
||||
return
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ type VMessRequest struct {
|
|||
User *vmess.User
|
||||
RequestIV []byte
|
||||
RequestKey []byte
|
||||
ResponseHeader []byte
|
||||
ResponseHeader byte
|
||||
Command byte
|
||||
Address v2net.Address
|
||||
Port v2net.Port
|
||||
|
@ -108,9 +108,9 @@ func (this *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
|||
return nil, proxy.InvalidProtocolVersion
|
||||
}
|
||||
|
||||
request.RequestIV = append([]byte(nil), buffer.Value[1:17]...) // 16 bytes
|
||||
request.RequestKey = append([]byte(nil), buffer.Value[17:33]...) // 16 bytes
|
||||
request.ResponseHeader = append([]byte(nil), buffer.Value[33:37]...) // 4 bytes
|
||||
request.RequestIV = append([]byte(nil), buffer.Value[1:17]...) // 16 bytes
|
||||
request.RequestKey = append([]byte(nil), buffer.Value[17:33]...) // 16 bytes
|
||||
request.ResponseHeader = buffer.Value[33] // 1 byte + 3 bytes reserved.
|
||||
request.Command = buffer.Value[37]
|
||||
|
||||
request.Port = v2net.PortFromBytes(buffer.Value[38:40])
|
||||
|
@ -189,7 +189,7 @@ func (this *VMessRequest) ToBytes(timestampGenerator RandomTimestampGenerator, b
|
|||
buffer.AppendBytes(this.Version)
|
||||
buffer.Append(this.RequestIV)
|
||||
buffer.Append(this.RequestKey)
|
||||
buffer.Append(this.ResponseHeader)
|
||||
buffer.AppendBytes(this.ResponseHeader, byte(0), byte(0), byte(0))
|
||||
buffer.AppendBytes(this.Command)
|
||||
buffer.Append(this.Port.Bytes())
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ func TestVMessSerialization(t *testing.T) {
|
|||
assert.Error(err).IsNil()
|
||||
request.RequestIV = randBytes[:16]
|
||||
request.RequestKey = randBytes[16:32]
|
||||
request.ResponseHeader = randBytes[32:]
|
||||
request.ResponseHeader = randBytes[32]
|
||||
|
||||
request.Command = byte(0x01)
|
||||
request.Address = v2net.DomainAddress("v2ray.com")
|
||||
|
@ -74,7 +74,7 @@ func TestVMessSerialization(t *testing.T) {
|
|||
assert.String(actualRequest.User.ID).Named("UserId").Equals(request.User.ID.String())
|
||||
assert.Bytes(actualRequest.RequestIV).Named("RequestIV").Equals(request.RequestIV[:])
|
||||
assert.Bytes(actualRequest.RequestKey).Named("RequestKey").Equals(request.RequestKey[:])
|
||||
assert.Bytes(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader[:])
|
||||
assert.Byte(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader)
|
||||
assert.Byte(actualRequest.Command).Named("Command").Equals(request.Command)
|
||||
assert.String(actualRequest.Address).Named("Address").Equals(request.Address.String())
|
||||
}
|
||||
|
@ -107,7 +107,7 @@ func BenchmarkVMessRequestWriting(b *testing.B) {
|
|||
rand.Read(randBytes)
|
||||
request.RequestIV = randBytes[:16]
|
||||
request.RequestKey = randBytes[16:32]
|
||||
request.ResponseHeader = randBytes[32:]
|
||||
request.ResponseHeader = randBytes[32]
|
||||
|
||||
request.Command = byte(0x01)
|
||||
request.Address = v2net.DomainAddress("v2ray.com")
|
||||
|
|
Loading…
Reference in New Issue