mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-12-28 04:55:37 -05:00
rewrite alloc.buffer
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/any"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -31,7 +32,9 @@ func (v *NoneResponse) AsAny() *any.Any {
|
||||
}
|
||||
|
||||
func (v *HTTPResponse) WriteTo(writer v2io.Writer) {
|
||||
writer.Write(alloc.NewLocalBuffer(512).Clear().AppendString(http403response))
|
||||
b := alloc.NewLocalBuffer(512)
|
||||
b.AppendFunc(serial.WriteString(http403response))
|
||||
writer.Write(b)
|
||||
}
|
||||
|
||||
func (v *HTTPResponse) AsAny() *any.Any {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
func TestHTTPResponse(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewBuffer().Clear()
|
||||
buffer := alloc.NewBuffer()
|
||||
|
||||
httpResponse := new(HTTPResponse)
|
||||
httpResponse.WriteTo(v2io.NewAdaptiveWriter(buffer))
|
||||
|
||||
@@ -47,7 +47,8 @@ func TestSinglePacket(t *testing.T) {
|
||||
|
||||
traffic := ray.NewRay()
|
||||
data2Send := "Data to be sent to remote"
|
||||
payload := alloc.NewLocalBuffer(2048).Clear().Append([]byte(data2Send))
|
||||
payload := alloc.NewLocalBuffer(2048)
|
||||
payload.Append([]byte(data2Send))
|
||||
|
||||
go freedom.Dispatch(v2net.TCPDestination(v2net.LocalHostIP, tcpServer.Port), payload, traffic)
|
||||
traffic.InboundInput().Close()
|
||||
|
||||
@@ -26,11 +26,14 @@ func NewAuthenticator(keygen KeyGenerator) *Authenticator {
|
||||
}
|
||||
}
|
||||
|
||||
func (v *Authenticator) Authenticate(auth []byte, data []byte) []byte {
|
||||
func (v *Authenticator) Authenticate(data []byte) alloc.BytesWriter {
|
||||
hasher := hmac.New(sha1.New, v.key())
|
||||
hasher.Write(data)
|
||||
res := hasher.Sum(nil)
|
||||
return append(auth, res[:AuthSize]...)
|
||||
return func(b []byte) int {
|
||||
copy(b, res[:AuthSize])
|
||||
return AuthSize
|
||||
}
|
||||
}
|
||||
|
||||
func HeaderKeyGenerator(key []byte, iv []byte) func() []byte {
|
||||
@@ -71,7 +74,7 @@ func (v *ChunkReader) Release() {
|
||||
}
|
||||
|
||||
func (v *ChunkReader) Read() (*alloc.Buffer, error) {
|
||||
buffer := alloc.NewBuffer().Clear()
|
||||
buffer := alloc.NewBuffer()
|
||||
if _, err := buffer.FillFullFrom(v.reader, 2); err != nil {
|
||||
buffer.Release()
|
||||
return nil, err
|
||||
@@ -94,7 +97,8 @@ func (v *ChunkReader) Read() (*alloc.Buffer, error) {
|
||||
authBytes := buffer.BytesTo(AuthSize)
|
||||
payload := buffer.BytesFrom(AuthSize)
|
||||
|
||||
actualAuthBytes := v.auth.Authenticate(nil, payload)
|
||||
actualAuthBytes := make([]byte, AuthSize)
|
||||
v.auth.Authenticate(payload)(actualAuthBytes)
|
||||
if !bytes.Equal(authBytes, actualAuthBytes) {
|
||||
buffer.Release()
|
||||
return nil, errors.New("Shadowsocks|AuthenticationReader: Invalid auth.")
|
||||
@@ -123,9 +127,8 @@ func (v *ChunkWriter) Release() {
|
||||
|
||||
func (v *ChunkWriter) Write(payload *alloc.Buffer) error {
|
||||
totalLength := payload.Len()
|
||||
payload.SliceBack(AuthSize)
|
||||
v.auth.Authenticate(payload.BytesTo(0), payload.BytesFrom(AuthSize))
|
||||
payload.PrependUint16(uint16(totalLength))
|
||||
payload.PrependFunc(AuthSize, v.auth.Authenticate(payload.Bytes()))
|
||||
payload.PrependFunc(2, serial.WriteUint16(uint16(totalLength)))
|
||||
_, err := v.writer.Write(payload.Bytes())
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -11,7 +11,8 @@ import (
|
||||
func TestNormalChunkReading(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewBuffer().Clear().AppendBytes(
|
||||
buffer := alloc.NewBuffer()
|
||||
buffer.AppendBytes(
|
||||
0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18)
|
||||
reader := NewChunkReader(buffer, NewAuthenticator(ChunkKeyGenerator(
|
||||
[]byte{21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36})))
|
||||
@@ -26,11 +27,13 @@ func TestNormalChunkReading(t *testing.T) {
|
||||
func TestNormalChunkWriting(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewLocalBuffer(512).Clear()
|
||||
buffer := alloc.NewLocalBuffer(512)
|
||||
writer := NewChunkWriter(buffer, NewAuthenticator(ChunkKeyGenerator(
|
||||
[]byte{21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36})))
|
||||
|
||||
err := writer.Write(alloc.NewLocalBuffer(256).Clear().Append([]byte{11, 12, 13, 14, 15, 16, 17, 18}))
|
||||
b := alloc.NewLocalBuffer(256)
|
||||
b.Append([]byte{11, 12, 13, 14, 15, 16, 17, 18})
|
||||
err := writer.Write(b)
|
||||
assert.Error(err).IsNil()
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte{0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18})
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
v2io "v2ray.com/core/common/io"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/common/protocol"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -28,7 +29,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
}
|
||||
account := rawAccount.(*ShadowsocksAccount)
|
||||
|
||||
buffer := alloc.NewLocalBuffer(512).Clear()
|
||||
buffer := alloc.NewLocalBuffer(512)
|
||||
defer buffer.Release()
|
||||
|
||||
ivLen := account.Cipher.IVSize()
|
||||
@@ -106,7 +107,8 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
|
||||
request.Port = v2net.PortFromBytes(buffer.BytesFrom(-2))
|
||||
|
||||
if request.Option.Has(RequestOptionOneTimeAuth) {
|
||||
actualAuth := authenticator.Authenticate(nil, buffer.Bytes())
|
||||
actualAuth := make([]byte, AuthSize)
|
||||
authenticator.Authenticate(buffer.Bytes())(actualAuth)
|
||||
|
||||
_, err := buffer.FillFullFrom(reader, AuthSize)
|
||||
if err != nil {
|
||||
@@ -150,7 +152,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr
|
||||
|
||||
writer = crypto.NewCryptionWriter(stream, writer)
|
||||
|
||||
header := alloc.NewLocalBuffer(512).Clear()
|
||||
header := alloc.NewLocalBuffer(512)
|
||||
|
||||
switch request.Address.Family() {
|
||||
case v2net.AddressFamilyIPv4:
|
||||
@@ -166,16 +168,16 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Wr
|
||||
return nil, errors.New("Shadowsocks|TCP: Unsupported address type: ", request.Address.Family())
|
||||
}
|
||||
|
||||
header.AppendUint16(uint16(request.Port))
|
||||
header.AppendFunc(serial.WriteUint16(uint16(request.Port)))
|
||||
|
||||
if request.Option.Has(RequestOptionOneTimeAuth) {
|
||||
header.Bytes()[0] |= 0x10
|
||||
|
||||
authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
|
||||
header.Value = authenticator.Authenticate(header.Value, header.Value)
|
||||
header.AppendFunc(authenticator.Authenticate(header.Bytes()))
|
||||
}
|
||||
|
||||
_, err = writer.Write(header.Value)
|
||||
_, err = writer.Write(header.Bytes())
|
||||
if err != nil {
|
||||
return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to write header.")
|
||||
}
|
||||
@@ -243,9 +245,8 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload *alloc.Buffer) (*a
|
||||
|
||||
buffer := alloc.NewSmallBuffer()
|
||||
ivLen := account.Cipher.IVSize()
|
||||
buffer.Slice(0, ivLen)
|
||||
rand.Read(buffer.Value)
|
||||
iv := buffer.Value
|
||||
buffer.FillFullFrom(rand.Reader, ivLen)
|
||||
iv := buffer.Bytes()
|
||||
|
||||
switch request.Address.Family() {
|
||||
case v2net.AddressFamilyIPv4:
|
||||
@@ -261,14 +262,14 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload *alloc.Buffer) (*a
|
||||
return nil, errors.New("Shadowsocks|UDP: Unsupported address type: ", request.Address.Family())
|
||||
}
|
||||
|
||||
buffer.AppendUint16(uint16(request.Port))
|
||||
buffer.Append(payload.Value)
|
||||
buffer.AppendFunc(serial.WriteUint16(uint16(request.Port)))
|
||||
buffer.Append(payload.Bytes())
|
||||
|
||||
if request.Option.Has(RequestOptionOneTimeAuth) {
|
||||
authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
|
||||
buffer.Value[ivLen] |= 0x10
|
||||
buffer.Bytes()[ivLen] |= 0x10
|
||||
|
||||
buffer.Value = authenticator.Authenticate(buffer.Value, buffer.Value[ivLen:])
|
||||
buffer.AppendFunc(authenticator.Authenticate(buffer.BytesFrom(ivLen)))
|
||||
}
|
||||
|
||||
stream, err := account.Cipher.NewEncodingStream(account.Key, iv)
|
||||
@@ -276,7 +277,7 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload *alloc.Buffer) (*a
|
||||
return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to create encoding stream.")
|
||||
}
|
||||
|
||||
stream.XORKeyStream(buffer.Value[ivLen:], buffer.Value[ivLen:])
|
||||
stream.XORKeyStream(buffer.BytesFrom(ivLen), buffer.BytesFrom(ivLen))
|
||||
return buffer, nil
|
||||
}
|
||||
|
||||
@@ -288,14 +289,14 @@ func DecodeUDPPacket(user *protocol.User, payload *alloc.Buffer) (*protocol.Requ
|
||||
account := rawAccount.(*ShadowsocksAccount)
|
||||
|
||||
ivLen := account.Cipher.IVSize()
|
||||
iv := payload.Value[:ivLen]
|
||||
iv := payload.BytesTo(ivLen)
|
||||
payload.SliceFrom(ivLen)
|
||||
|
||||
stream, err := account.Cipher.NewDecodingStream(account.Key, iv)
|
||||
if err != nil {
|
||||
return nil, nil, errors.Base(err).Message("Shadowsocks|UDP: Failed to initialize decoding stream.")
|
||||
}
|
||||
stream.XORKeyStream(payload.Value, payload.Value)
|
||||
stream.XORKeyStream(payload.Bytes(), payload.Bytes())
|
||||
|
||||
authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
|
||||
request := &protocol.RequestHeader{
|
||||
@@ -304,8 +305,8 @@ func DecodeUDPPacket(user *protocol.User, payload *alloc.Buffer) (*protocol.Requ
|
||||
Command: protocol.RequestCommandUDP,
|
||||
}
|
||||
|
||||
addrType := (payload.Value[0] & 0x0F)
|
||||
if (payload.Value[0] & 0x10) == 0x10 {
|
||||
addrType := (payload.Byte(0) & 0x0F)
|
||||
if (payload.Byte(0) & 0x10) == 0x10 {
|
||||
request.Option |= RequestOptionOneTimeAuth
|
||||
}
|
||||
|
||||
@@ -319,9 +320,10 @@ func DecodeUDPPacket(user *protocol.User, payload *alloc.Buffer) (*protocol.Requ
|
||||
|
||||
if request.Option.Has(RequestOptionOneTimeAuth) {
|
||||
payloadLen := payload.Len() - AuthSize
|
||||
authBytes := payload.Value[payloadLen:]
|
||||
authBytes := payload.BytesFrom(payloadLen)
|
||||
|
||||
actualAuth := authenticator.Authenticate(nil, payload.Value[0:payloadLen])
|
||||
actualAuth := make([]byte, AuthSize)
|
||||
authenticator.Authenticate(payload.BytesTo(payloadLen))(actualAuth)
|
||||
if !bytes.Equal(actualAuth, authBytes) {
|
||||
return nil, nil, errors.New("Shadowsocks|UDP: Invalid OTA.")
|
||||
}
|
||||
@@ -333,20 +335,20 @@ func DecodeUDPPacket(user *protocol.User, payload *alloc.Buffer) (*protocol.Requ
|
||||
|
||||
switch addrType {
|
||||
case AddrTypeIPv4:
|
||||
request.Address = v2net.IPAddress(payload.Value[:4])
|
||||
request.Address = v2net.IPAddress(payload.BytesTo(4))
|
||||
payload.SliceFrom(4)
|
||||
case AddrTypeIPv6:
|
||||
request.Address = v2net.IPAddress(payload.Value[:16])
|
||||
request.Address = v2net.IPAddress(payload.BytesTo(16))
|
||||
payload.SliceFrom(16)
|
||||
case AddrTypeDomain:
|
||||
domainLength := int(payload.Value[0])
|
||||
request.Address = v2net.DomainAddress(string(payload.Value[1 : 1+domainLength]))
|
||||
domainLength := int(payload.Byte(0))
|
||||
request.Address = v2net.DomainAddress(string(payload.BytesRange(1, 1+domainLength)))
|
||||
payload.SliceFrom(1 + domainLength)
|
||||
default:
|
||||
return nil, nil, errors.New("Shadowsocks|UDP: Unknown address type: ", addrType)
|
||||
}
|
||||
|
||||
request.Port = v2net.PortFromBytes(payload.Value[:2])
|
||||
request.Port = v2net.PortFromBytes(payload.BytesTo(2))
|
||||
payload.SliceFrom(2)
|
||||
|
||||
return request, payload, nil
|
||||
@@ -359,12 +361,11 @@ type UDPReader struct {
|
||||
|
||||
func (v *UDPReader) Read() (*alloc.Buffer, error) {
|
||||
buffer := alloc.NewSmallBuffer()
|
||||
nBytes, err := v.Reader.Read(buffer.Value)
|
||||
_, err := buffer.FillFrom(v.Reader)
|
||||
if err != nil {
|
||||
buffer.Release()
|
||||
return nil, err
|
||||
}
|
||||
buffer.Slice(0, nBytes)
|
||||
_, payload, err := DecodeUDPPacket(v.User, buffer)
|
||||
if err != nil {
|
||||
buffer.Release()
|
||||
@@ -386,7 +387,7 @@ func (v *UDPWriter) Write(buffer *alloc.Buffer) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = v.Writer.Write(payload.Value)
|
||||
_, err = v.Writer.Write(payload.Bytes())
|
||||
payload.Release()
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"v2ray.com/core/common/loader"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/common/protocol"
|
||||
"v2ray.com/core/common/serial"
|
||||
. "v2ray.com/core/proxy/shadowsocks"
|
||||
"v2ray.com/core/testing/assert"
|
||||
)
|
||||
@@ -29,7 +30,8 @@ func TestUDPEncoding(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
data := alloc.NewLocalBuffer(256).Clear().AppendString("test string")
|
||||
data := alloc.NewLocalBuffer(256)
|
||||
data.AppendFunc(serial.WriteString("test string"))
|
||||
encodedData, err := EncodeUDPPacket(request, data)
|
||||
assert.Error(err).IsNil()
|
||||
|
||||
@@ -58,8 +60,9 @@ func TestTCPRequest(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
data := alloc.NewLocalBuffer(256).Clear().AppendString("test string")
|
||||
cache := alloc.NewBuffer().Clear()
|
||||
data := alloc.NewLocalBuffer(256)
|
||||
data.AppendFunc(serial.WriteString("test string"))
|
||||
cache := alloc.NewBuffer()
|
||||
|
||||
writer, err := WriteTCPRequest(request, cache)
|
||||
assert.Error(err).IsNil()
|
||||
@@ -85,7 +88,7 @@ func TestUDPReaderWriter(t *testing.T) {
|
||||
CipherType: CipherType_CHACHA20_IEFT,
|
||||
}),
|
||||
}
|
||||
cache := alloc.NewBuffer().Clear()
|
||||
cache := alloc.NewBuffer()
|
||||
writer := &UDPWriter{
|
||||
Writer: cache,
|
||||
Request: &protocol.RequestHeader{
|
||||
@@ -102,14 +105,18 @@ func TestUDPReaderWriter(t *testing.T) {
|
||||
User: user,
|
||||
}
|
||||
|
||||
err := writer.Write(alloc.NewBuffer().Clear().AppendString("test payload"))
|
||||
b := alloc.NewBuffer()
|
||||
b.AppendFunc(serial.WriteString("test payload"))
|
||||
err := writer.Write(b)
|
||||
assert.Error(err).IsNil()
|
||||
|
||||
payload, err := reader.Read()
|
||||
assert.Error(err).IsNil()
|
||||
assert.String(payload.String()).Equals("test payload")
|
||||
|
||||
err = writer.Write(alloc.NewBuffer().Clear().AppendString("test payload 2"))
|
||||
b = alloc.NewBuffer()
|
||||
b.AppendFunc(serial.WriteString("test payload 2"))
|
||||
err = writer.Write(b)
|
||||
assert.Error(err).IsNil()
|
||||
|
||||
payload, err = reader.Read()
|
||||
|
||||
@@ -122,28 +122,30 @@ func ReadUserPassRequest(reader io.Reader) (request Socks5UserPassRequest, err e
|
||||
buffer := alloc.NewLocalBuffer(512)
|
||||
defer buffer.Release()
|
||||
|
||||
_, err = reader.Read(buffer.Value[0:2])
|
||||
_, err = buffer.FillFullFrom(reader, 2)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.version = buffer.Value[0]
|
||||
nUsername := buffer.Value[1]
|
||||
nBytes, err := reader.Read(buffer.Value[:nUsername])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.username = string(buffer.Value[:nBytes])
|
||||
request.version = buffer.Byte(0)
|
||||
nUsername := int(buffer.Byte(1))
|
||||
|
||||
_, err = reader.Read(buffer.Value[0:1])
|
||||
buffer.Clear()
|
||||
_, err = buffer.FillFullFrom(reader, nUsername)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
nPassword := buffer.Value[0]
|
||||
nBytes, err = reader.Read(buffer.Value[:nPassword])
|
||||
request.username = string(buffer.Bytes())
|
||||
|
||||
_, err = buffer.FillFullFrom(reader, 1)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.password = string(buffer.Value[:nBytes])
|
||||
nPassword := int(buffer.Byte(0))
|
||||
_, err = buffer.FillFullFrom(reader, nPassword)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.password = string(buffer.Bytes())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -185,7 +187,7 @@ type Socks5Request struct {
|
||||
}
|
||||
|
||||
func ReadRequest(reader io.Reader) (request *Socks5Request, err error) {
|
||||
buffer := alloc.NewLocalBuffer(512).Clear()
|
||||
buffer := alloc.NewLocalBuffer(512)
|
||||
defer buffer.Release()
|
||||
|
||||
_, err = buffer.FillFullFrom(reader, 4)
|
||||
@@ -194,10 +196,10 @@ func ReadRequest(reader io.Reader) (request *Socks5Request, err error) {
|
||||
}
|
||||
|
||||
request = &Socks5Request{
|
||||
Version: buffer.Value[0],
|
||||
Command: buffer.Value[1],
|
||||
Version: buffer.Byte(0),
|
||||
Command: buffer.Byte(1),
|
||||
// buffer[2] is a reserved field
|
||||
AddrType: buffer.Value[3],
|
||||
AddrType: buffer.Byte(3),
|
||||
}
|
||||
switch request.AddrType {
|
||||
case AddrTypeIPv4:
|
||||
|
||||
@@ -31,9 +31,9 @@ func TestSocks4AuthenticationResponseToBytes(t *testing.T) {
|
||||
|
||||
response := NewSocks4AuthenticationResponse(byte(0x10), 443, []byte{1, 2, 3, 4})
|
||||
|
||||
buffer := alloc.NewLocalBuffer(2048).Clear()
|
||||
buffer := alloc.NewLocalBuffer(2048)
|
||||
defer buffer.Release()
|
||||
|
||||
response.Write(buffer)
|
||||
assert.Bytes(buffer.Value).Equals([]byte{0x00, 0x10, 0x01, 0xBB, 0x01, 0x02, 0x03, 0x04})
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte{0x00, 0x10, 0x01, 0xBB, 0x01, 0x02, 0x03, 0x04})
|
||||
}
|
||||
|
||||
@@ -29,7 +29,8 @@ func TestHasAuthenticationMethod(t *testing.T) {
|
||||
func TestAuthenticationRequestRead(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewBuffer().Clear().AppendBytes(
|
||||
buffer := alloc.NewBuffer()
|
||||
buffer.AppendBytes(
|
||||
0x05, // version
|
||||
0x01, // nMethods
|
||||
0x02, // methods
|
||||
@@ -83,7 +84,7 @@ func TestResponseWrite(t *testing.T) {
|
||||
[16]byte{},
|
||||
v2net.Port(53),
|
||||
}
|
||||
buffer := alloc.NewLocalBuffer(2048).Clear()
|
||||
buffer := alloc.NewLocalBuffer(2048)
|
||||
defer buffer.Release()
|
||||
|
||||
response.Write(buffer)
|
||||
@@ -104,7 +105,7 @@ func TestSetIPv6(t *testing.T) {
|
||||
response := NewSocks5Response()
|
||||
response.SetIPv6([]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15})
|
||||
|
||||
buffer := alloc.NewLocalBuffer(2048).Clear()
|
||||
buffer := alloc.NewLocalBuffer(2048)
|
||||
defer buffer.Release()
|
||||
response.Write(buffer)
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte{
|
||||
@@ -117,7 +118,7 @@ func TestSetDomain(t *testing.T) {
|
||||
response := NewSocks5Response()
|
||||
response.SetDomain("v2ray.com")
|
||||
|
||||
buffer := alloc.NewLocalBuffer(2048).Clear()
|
||||
buffer := alloc.NewLocalBuffer(2048)
|
||||
defer buffer.Release()
|
||||
response.Write(buffer)
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte{
|
||||
@@ -127,7 +128,7 @@ func TestSetDomain(t *testing.T) {
|
||||
func TestEmptyAuthRequest(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
_, _, err := ReadAuthentication(alloc.NewBuffer().Clear())
|
||||
_, _, err := ReadAuthentication(alloc.NewBuffer())
|
||||
assert.Error(err).Equals(io.EOF)
|
||||
}
|
||||
|
||||
@@ -141,14 +142,16 @@ func TestSingleByteAuthRequest(t *testing.T) {
|
||||
func TestZeroAuthenticationMethod(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewBuffer().Clear().AppendBytes(5, 0)
|
||||
buffer := alloc.NewBuffer()
|
||||
buffer.AppendBytes(5, 0)
|
||||
_, _, err := ReadAuthentication(buffer)
|
||||
assert.Error(err).Equals(proxy.ErrInvalidAuthentication)
|
||||
}
|
||||
func TestWrongProtocolVersion(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewBuffer().Clear().AppendBytes(6, 1, 0)
|
||||
buffer := alloc.NewBuffer()
|
||||
buffer.AppendBytes(6, 1, 0)
|
||||
_, _, err := ReadAuthentication(buffer)
|
||||
assert.Error(err).Equals(proxy.ErrInvalidProtocolVersion)
|
||||
}
|
||||
@@ -156,14 +159,16 @@ func TestWrongProtocolVersion(t *testing.T) {
|
||||
func TestEmptyRequest(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
_, err := ReadRequest(alloc.NewBuffer().Clear())
|
||||
_, err := ReadRequest(alloc.NewBuffer())
|
||||
assert.Error(err).Equals(io.EOF)
|
||||
}
|
||||
|
||||
func TestIPv6Request(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
request, err := ReadRequest(alloc.NewBuffer().Clear().AppendBytes(5, 1, 0, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 8))
|
||||
b := alloc.NewBuffer()
|
||||
b.AppendBytes(5, 1, 0, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 8)
|
||||
request, err := ReadRequest(b)
|
||||
assert.Error(err).IsNil()
|
||||
assert.Byte(request.Command).Equals(1)
|
||||
assert.Bytes(request.IPv6[:]).Equals([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6})
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"v2ray.com/core/common/alloc"
|
||||
"v2ray.com/core/common/errors"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -26,14 +27,17 @@ func (request *Socks5UDPRequest) Write(buffer *alloc.Buffer) {
|
||||
buffer.AppendBytes(0, 0, request.Fragment)
|
||||
switch request.Address.Family() {
|
||||
case v2net.AddressFamilyIPv4:
|
||||
buffer.AppendBytes(AddrTypeIPv4).Append(request.Address.IP())
|
||||
buffer.AppendBytes(AddrTypeIPv4)
|
||||
buffer.Append(request.Address.IP())
|
||||
case v2net.AddressFamilyIPv6:
|
||||
buffer.AppendBytes(AddrTypeIPv6).Append(request.Address.IP())
|
||||
buffer.AppendBytes(AddrTypeIPv6)
|
||||
buffer.Append(request.Address.IP())
|
||||
case v2net.AddressFamilyDomain:
|
||||
buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))).Append([]byte(request.Address.Domain()))
|
||||
buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain())))
|
||||
buffer.Append([]byte(request.Address.Domain()))
|
||||
}
|
||||
buffer.AppendUint16(request.Port.Value())
|
||||
buffer.Append(request.Data.Value)
|
||||
buffer.AppendFunc(serial.WriteUint16(request.Port.Value()))
|
||||
buffer.Append(request.Data.Bytes())
|
||||
}
|
||||
|
||||
func ReadUDPRequest(packet []byte) (*Socks5UDPRequest, error) {
|
||||
@@ -79,7 +83,9 @@ func ReadUDPRequest(packet []byte) (*Socks5UDPRequest, error) {
|
||||
}
|
||||
|
||||
if len(packet) > dataBegin {
|
||||
request.Data = alloc.NewBuffer().Clear().Append(packet[dataBegin:])
|
||||
b := alloc.NewSmallBuffer()
|
||||
b.Append(packet[dataBegin:])
|
||||
request.Data = b
|
||||
}
|
||||
|
||||
return request, nil
|
||||
|
||||
@@ -32,5 +32,5 @@ func TestDomainAddressRequest(t *testing.T) {
|
||||
assert.Byte(request.Fragment).Equals(1)
|
||||
assert.Address(request.Address).EqualsString("v2ray.com")
|
||||
assert.Port(request.Port).Equals(v2net.Port(80))
|
||||
assert.Bytes(request.Data.Value).Equals([]byte("Actual payload"))
|
||||
assert.String(request.Data.String()).Equals("Actual payload")
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ func (v *Server) listenUDP() error {
|
||||
func (v *Server) handleUDPPayload(payload *alloc.Buffer, session *proxy.SessionInfo) {
|
||||
source := session.Source
|
||||
log.Info("Socks: Client UDP connection from ", source)
|
||||
request, err := protocol.ReadUDPRequest(payload.Value)
|
||||
request, err := protocol.ReadUDPRequest(payload.Bytes())
|
||||
payload.Release()
|
||||
|
||||
if err != nil {
|
||||
@@ -55,7 +55,7 @@ func (v *Server) handleUDPPayload(payload *alloc.Buffer, session *proxy.SessionI
|
||||
}
|
||||
log.Info("Socks: Writing back UDP response with ", payload.Len(), " bytes to ", destination)
|
||||
|
||||
udpMessage := alloc.NewLocalBuffer(2048).Clear()
|
||||
udpMessage := alloc.NewLocalBuffer(2048)
|
||||
response.Write(udpMessage)
|
||||
|
||||
v.udpMutex.RLock()
|
||||
@@ -63,7 +63,7 @@ func (v *Server) handleUDPPayload(payload *alloc.Buffer, session *proxy.SessionI
|
||||
v.udpMutex.RUnlock()
|
||||
return
|
||||
}
|
||||
nBytes, err := v.udpHub.WriteTo(udpMessage.Value, destination)
|
||||
nBytes, err := v.udpHub.WriteTo(udpMessage.Bytes(), destination)
|
||||
v.udpMutex.RUnlock()
|
||||
udpMessage.Release()
|
||||
response.Data.Release()
|
||||
|
||||
@@ -32,7 +32,7 @@ func MarshalCommand(command interface{}, writer io.Writer) error {
|
||||
return ErrUnknownCommand
|
||||
}
|
||||
|
||||
buffer := alloc.NewLocalBuffer(512).Clear()
|
||||
buffer := alloc.NewLocalBuffer(512)
|
||||
defer buffer.Release()
|
||||
|
||||
err := factory.Marshal(command, buffer)
|
||||
|
||||
@@ -21,7 +21,7 @@ func TestSwitchAccount(t *testing.T) {
|
||||
ValidMin: 16,
|
||||
}
|
||||
|
||||
buffer := alloc.NewBuffer().Clear()
|
||||
buffer := alloc.NewBuffer()
|
||||
err := MarshalCommand(sa, buffer)
|
||||
assert.Error(err).IsNil()
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ func TestRequestSerialization(t *testing.T) {
|
||||
Port: v2net.Port(443),
|
||||
}
|
||||
|
||||
buffer := alloc.NewBuffer().Clear()
|
||||
buffer := alloc.NewBuffer()
|
||||
client := NewClientSession(protocol.DefaultIDHash)
|
||||
client.EncodeRequestHeader(expectedRequest, buffer)
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@ func (v *VMessInboundHandler) HandleConnection(connection internet.Connection) {
|
||||
}
|
||||
output.Release()
|
||||
if request.Option.Has(protocol.RequestOptionChunkStream) {
|
||||
if err := v2writer.Write(alloc.NewLocalBuffer(32).Clear()); err != nil {
|
||||
if err := v2writer.Write(alloc.NewLocalBuffer(32)); err != nil {
|
||||
connection.SetReusable(false)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"v2ray.com/core/common/alloc"
|
||||
"v2ray.com/core/common/errors"
|
||||
v2io "v2ray.com/core/common/io"
|
||||
"v2ray.com/core/common/serial"
|
||||
. "v2ray.com/core/proxy/vmess/io"
|
||||
"v2ray.com/core/testing/assert"
|
||||
)
|
||||
@@ -16,7 +17,7 @@ import (
|
||||
func TestAuthenticate(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
buffer := alloc.NewBuffer().Clear()
|
||||
buffer := alloc.NewBuffer()
|
||||
buffer.AppendBytes(1, 2, 3, 4)
|
||||
Authenticate(buffer)
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte{0, 8, 87, 52, 168, 125, 1, 2, 3, 4})
|
||||
@@ -32,8 +33,10 @@ func TestSingleIO(t *testing.T) {
|
||||
content := bytes.NewBuffer(make([]byte, 0, 1024*1024))
|
||||
|
||||
writer := NewAuthChunkWriter(v2io.NewAdaptiveWriter(content))
|
||||
writer.Write(alloc.NewBuffer().Clear().AppendString("abcd"))
|
||||
writer.Write(alloc.NewBuffer().Clear())
|
||||
b := alloc.NewBuffer()
|
||||
b.AppendFunc(serial.WriteString("abcd"))
|
||||
writer.Write(b)
|
||||
writer.Write(alloc.NewBuffer())
|
||||
writer.Release()
|
||||
|
||||
reader := NewAuthChunkReader(content)
|
||||
@@ -56,13 +59,17 @@ func TestLargeIO(t *testing.T) {
|
||||
if chunkSize+writeSize > len(content) {
|
||||
chunkSize = len(content) - writeSize
|
||||
}
|
||||
writer.Write(alloc.NewBuffer().Clear().Append(content[writeSize : writeSize+chunkSize]))
|
||||
b := alloc.NewBuffer()
|
||||
b.Append(content[writeSize : writeSize+chunkSize])
|
||||
writer.Write(b)
|
||||
b.Release()
|
||||
|
||||
writeSize += chunkSize
|
||||
if writeSize == len(content) {
|
||||
break
|
||||
}
|
||||
}
|
||||
writer.Write(alloc.NewBuffer().Clear())
|
||||
writer.Write(alloc.NewBuffer())
|
||||
writer.Release()
|
||||
|
||||
actualContent := make([]byte, 0, len(content))
|
||||
|
||||
@@ -50,7 +50,7 @@ func (v *AuthChunkReader) Read() (*alloc.Buffer, error) {
|
||||
buffer = v.last
|
||||
v.last = nil
|
||||
} else {
|
||||
buffer = alloc.NewBuffer().Clear()
|
||||
buffer = alloc.NewBuffer()
|
||||
}
|
||||
|
||||
if v.chunkLength == -1 {
|
||||
@@ -96,7 +96,7 @@ func (v *AuthChunkReader) Read() (*alloc.Buffer, error) {
|
||||
}
|
||||
leftLength := buffer.Len() - v.chunkLength
|
||||
if leftLength > 0 {
|
||||
v.last = alloc.NewBuffer().Clear()
|
||||
v.last = alloc.NewBuffer()
|
||||
v.last.Append(buffer.BytesFrom(v.chunkLength))
|
||||
buffer.Slice(0, v.chunkLength)
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
"v2ray.com/core/common/alloc"
|
||||
v2io "v2ray.com/core/common/io"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
type AuthChunkWriter struct {
|
||||
@@ -30,7 +31,7 @@ func (v *AuthChunkWriter) Release() {
|
||||
func Authenticate(buffer *alloc.Buffer) {
|
||||
fnvHash := fnv.New32a()
|
||||
fnvHash.Write(buffer.Bytes())
|
||||
buffer.PrependHash(fnvHash)
|
||||
buffer.PrependFunc(4, serial.WriteHash(fnvHash))
|
||||
|
||||
buffer.PrependUint16(uint16(buffer.Len()))
|
||||
buffer.PrependFunc(2, serial.WriteUint16(uint16(buffer.Len())))
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ func (v *VMessOutboundHandler) handleRequest(session *encoding.ClientSession, co
|
||||
}
|
||||
|
||||
if request.Option.Has(protocol.RequestOptionChunkStream) {
|
||||
err := streamWriter.Write(alloc.NewLocalBuffer(32).Clear())
|
||||
err := streamWriter.Write(alloc.NewLocalBuffer(32))
|
||||
if err != nil {
|
||||
conn.SetReusable(false)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user