Skip to content

Commit

Permalink
VLESS ALPHA 2
Browse files Browse the repository at this point in the history
  • Loading branch information
RPRX authored Jun 23, 2020
1 parent 00dccb8 commit a51a137
Show file tree
Hide file tree
Showing 8 changed files with 707 additions and 54 deletions.
2 changes: 0 additions & 2 deletions common/protocol/headers.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ type RequestHeader struct {
Port net.Port
Address net.Address
User *MemoryUser
MessName string
MessSeed []byte
}

func (h *RequestHeader) Destination() net.Destination {
Expand Down
127 changes: 127 additions & 0 deletions proxy/vless/encoding/addons.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
// +build !confonly

package encoding

import (
"crypto/rand"
"io"

"v2ray.com/core/common"
"v2ray.com/core/common/buf"
"v2ray.com/core/common/crypto"
"v2ray.com/core/common/protocol"

"github.com/golang/protobuf/proto"
)

func EncodeAddonsHeader(addons *Addons, buffer *buf.Buffer) {

switch addons.MessName {
case "shake":

addons.MessSeed = make([]byte, 16)
rand.Read(addons.MessSeed)

bytes := common.Must2(proto.Marshal(addons)).([]byte)

common.Must(buffer.WriteByte(byte(len(bytes))))
common.Must2(buffer.Write(bytes))

default:

common.Must(buffer.WriteByte(0))

}

}

func DecodeAddonsHeader(reader io.Reader, buffer *buf.Buffer) (*Addons, error) {

addons := &Addons{}

buffer.Clear()
if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
return nil, newError("failed to read addons length").Base(err)
}

length := int32(buffer.Byte(0))
if length != 0 {

buffer.Clear()
if _, err := buffer.ReadFullFrom(reader, length); err != nil {
return nil, newError("failed to read addons bytes").Base(err)
}

common.Must(proto.Unmarshal(buffer.Bytes(), addons))

// Verification
switch addons.MessName {
case "shake":
if len(addons.MessSeed) != 16 {
return nil, newError("mess: shake's seed length is not 16")
}
}

}

return addons, nil

}

// EncodeAddonsBody returns a Writer that auto-encrypt content written by caller.
func EncodeAddonsBody(request *protocol.RequestHeader, addons *Addons, writer io.Writer) buf.Writer {

switch addons.MessName {
case "shake":

var sizeParser crypto.ChunkSizeEncoder = crypto.PlainChunkSizeParser{}
sizeParser = NewShakeSizeParser(addons.MessSeed)
var padding crypto.PaddingLengthGenerator
//padding = sizeParser.(crypto.PaddingLengthGenerator)

if request.Command.TransferType() == protocol.TransferTypeStream {
return crypto.NewChunkStreamWriter(sizeParser, writer)
}
auth := &crypto.AEADAuthenticator{
AEAD: new(NoOpAuthenticator),
NonceGenerator: crypto.GenerateEmptyBytes(),
AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
}
return crypto.NewAuthenticationWriter(auth, sizeParser, writer, protocol.TransferTypePacket, padding)

default:

return buf.NewWriter(writer)

}

}

// DecodeAddonsBody returns a Reader from which caller can fetch decrypted body.
func DecodeAddonsBody(request *protocol.RequestHeader, addons *Addons, reader io.Reader) buf.Reader {

switch addons.MessName {
case "shake":

var sizeParser crypto.ChunkSizeDecoder = crypto.PlainChunkSizeParser{}
sizeParser = NewShakeSizeParser(addons.MessSeed)
var padding crypto.PaddingLengthGenerator
//padding = sizeParser.(crypto.PaddingLengthGenerator)

if request.Command.TransferType() == protocol.TransferTypeStream {
return crypto.NewChunkStreamReader(sizeParser, reader)
}
auth := &crypto.AEADAuthenticator{
AEAD: new(NoOpAuthenticator),
NonceGenerator: crypto.GenerateEmptyBytes(),
AdditionalDataGenerator: crypto.GenerateEmptyBytes(),
}
return crypto.NewAuthenticationReader(auth, sizeParser, reader, protocol.TransferTypePacket, padding)

default:

return buf.NewReader(reader)

}

}
Loading

0 comments on commit a51a137

Please sign in to comment.