Documentation ¶
Overview ¶
Package shadowsocks provides compatible functionality to Shadowsocks.
Shadowsocks client and server are implemented as outbound and inbound respectively in V2Ray's term.
Shadowsocks OTA is fully supported. By default both client and server enable OTA, but it can be optionally disabled.
Supperted Ciphers: * AES-256-CFB * AES-128-CFB * Chacha20 * Chacha20-IEFT
R.I.P Shadowsocks
Index ¶
- Constants
- Variables
- func ChunkKeyGenerator(iv []byte) func() []byte
- func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.RequestHeader, *buf.Buffer, error)
- func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buffer, error)
- func HeaderKeyGenerator(key []byte, iv []byte) func() []byte
- func ReadTCPResponse(user *protocol.User, reader io.Reader) (buf.Reader, error)
- func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHeader, buf.Reader, error)
- func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Writer, error)
- func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Writer, error)
- type AEADCipher
- func (c *AEADCipher) DecodePacket(key []byte, b *buf.Buffer) error
- func (c *AEADCipher) EncodePacket(key []byte, b *buf.Buffer) error
- func (c *AEADCipher) IVSize() int32
- func (*AEADCipher) IsAEAD() bool
- func (c *AEADCipher) KeySize() int32
- func (c *AEADCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error)
- func (c *AEADCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error)
- type Account
- func (a *Account) AsAccount() (protocol.Account, error)
- func (*Account) Descriptor() ([]byte, []int)
- func (m *Account) GetCipherType() CipherType
- func (m *Account) GetOta() Account_OneTimeAuth
- func (m *Account) GetPassword() string
- func (*Account) ProtoMessage()
- func (m *Account) Reset()
- func (m *Account) String() string
- func (m *Account) XXX_DiscardUnknown()
- func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (dst *Account) XXX_Merge(src proto.Message)
- func (m *Account) XXX_Size() int
- func (m *Account) XXX_Unmarshal(b []byte) error
- type Account_OneTimeAuth
- type AesCfb
- func (v *AesCfb) DecodePacket(key []byte, b *buf.Buffer) error
- func (v *AesCfb) EncodePacket(key []byte, b *buf.Buffer) error
- func (v *AesCfb) IVSize() int32
- func (*AesCfb) IsAEAD() bool
- func (v *AesCfb) KeySize() int32
- func (v *AesCfb) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error)
- func (v *AesCfb) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error)
- type Authenticator
- type ChaCha20
- func (v *ChaCha20) DecodePacket(key []byte, b *buf.Buffer) error
- func (v *ChaCha20) EncodePacket(key []byte, b *buf.Buffer) error
- func (v *ChaCha20) IVSize() int32
- func (*ChaCha20) IsAEAD() bool
- func (v *ChaCha20) KeySize() int32
- func (v *ChaCha20) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error)
- func (v *ChaCha20) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error)
- type ChunkReader
- type ChunkWriter
- type Cipher
- type CipherType
- type Client
- type ClientConfig
- func (*ClientConfig) Descriptor() ([]byte, []int)
- func (m *ClientConfig) GetServer() []*protocol.ServerEndpoint
- func (*ClientConfig) ProtoMessage()
- func (m *ClientConfig) Reset()
- func (m *ClientConfig) String() string
- func (m *ClientConfig) XXX_DiscardUnknown()
- func (m *ClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (dst *ClientConfig) XXX_Merge(src proto.Message)
- func (m *ClientConfig) XXX_Size() int
- func (m *ClientConfig) XXX_Unmarshal(b []byte) error
- type KeyGenerator
- type MemoryAccount
- type NoneCipher
- func (NoneCipher) DecodePacket(key []byte, b *buf.Buffer) error
- func (NoneCipher) EncodePacket(key []byte, b *buf.Buffer) error
- func (NoneCipher) IVSize() int32
- func (NoneCipher) IsAEAD() bool
- func (NoneCipher) KeySize() int32
- func (NoneCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error)
- func (NoneCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error)
- type Server
- type ServerConfig
- func (*ServerConfig) Descriptor() ([]byte, []int)
- func (m *ServerConfig) GetNetwork() []net.Network
- func (m *ServerConfig) GetUdpEnabled() booldeprecated
- func (m *ServerConfig) GetUser() *protocol.User
- func (*ServerConfig) ProtoMessage()
- func (m *ServerConfig) Reset()
- func (m *ServerConfig) String() string
- func (m *ServerConfig) XXX_DiscardUnknown()
- func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (dst *ServerConfig) XXX_Merge(src proto.Message)
- func (m *ServerConfig) XXX_Size() int
- func (m *ServerConfig) XXX_Unmarshal(b []byte) error
- type UDPReader
- type UDPWriter
Constants ¶
const ( Version = 1 RequestOptionOneTimeAuth bitmask.Byte = 0x01 )
const (
// AuthSize is the number of extra bytes for Shadowsocks OTA.
AuthSize = 10
)
Variables ¶
var Account_OneTimeAuth_name = map[int32]string{
0: "Auto",
1: "Disabled",
2: "Enabled",
}
var Account_OneTimeAuth_value = map[string]int32{
"Auto": 0,
"Disabled": 1,
"Enabled": 2,
}
var CipherType_name = map[int32]string{
0: "UNKNOWN",
1: "AES_128_CFB",
2: "AES_256_CFB",
3: "CHACHA20",
4: "CHACHA20_IETF",
5: "AES_128_GCM",
6: "AES_256_GCM",
7: "CHACHA20_POLY1305",
8: "NONE",
}
var CipherType_value = map[string]int32{
"UNKNOWN": 0,
"AES_128_CFB": 1,
"AES_256_CFB": 2,
"CHACHA20": 3,
"CHACHA20_IETF": 4,
"AES_128_GCM": 5,
"AES_256_GCM": 6,
"CHACHA20_POLY1305": 7,
"NONE": 8,
}
Functions ¶
func ChunkKeyGenerator ¶
func DecodeUDPPacket ¶
func EncodeUDPPacket ¶
func HeaderKeyGenerator ¶
func ReadTCPResponse ¶
func ReadTCPSession ¶
func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHeader, buf.Reader, error)
ReadTCPSession reads a Shadowsocks TCP session from the given reader, returns its header and remaining parts.
func WriteTCPRequest ¶
WriteTCPRequest writes Shadowsocks request into the given writer, and returns a writer for body.
func WriteTCPResponse ¶
Types ¶
type AEADCipher ¶
type AEADCipher struct { KeyBytes int32 IVBytes int32 AEADAuthCreator func(key []byte) cipher.AEAD }
func (*AEADCipher) DecodePacket ¶
func (c *AEADCipher) DecodePacket(key []byte, b *buf.Buffer) error
func (*AEADCipher) EncodePacket ¶
func (c *AEADCipher) EncodePacket(key []byte, b *buf.Buffer) error
func (*AEADCipher) IVSize ¶
func (c *AEADCipher) IVSize() int32
func (*AEADCipher) IsAEAD ¶
func (*AEADCipher) IsAEAD() bool
func (*AEADCipher) KeySize ¶
func (c *AEADCipher) KeySize() int32
func (*AEADCipher) NewDecryptionReader ¶
func (*AEADCipher) NewEncryptionWriter ¶
type Account ¶
type Account struct { Password string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"` CipherType CipherType `` /* 128-byte string literal not displayed */ Ota Account_OneTimeAuth `protobuf:"varint,3,opt,name=ota,enum=com.core.proxy.shadowsocks.Account_OneTimeAuth" json:"ota,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
func (*Account) Descriptor ¶
func (*Account) GetCipherType ¶
func (m *Account) GetCipherType() CipherType
func (*Account) GetOta ¶
func (m *Account) GetOta() Account_OneTimeAuth
func (*Account) GetPassword ¶
func (*Account) ProtoMessage ¶
func (*Account) ProtoMessage()
func (*Account) XXX_DiscardUnknown ¶
func (m *Account) XXX_DiscardUnknown()
func (*Account) XXX_Marshal ¶
func (*Account) XXX_Unmarshal ¶
type Account_OneTimeAuth ¶
type Account_OneTimeAuth int32
const ( Account_Auto Account_OneTimeAuth = 0 Account_Disabled Account_OneTimeAuth = 1 Account_Enabled Account_OneTimeAuth = 2 )
func (Account_OneTimeAuth) EnumDescriptor ¶
func (Account_OneTimeAuth) EnumDescriptor() ([]byte, []int)
func (Account_OneTimeAuth) String ¶
func (x Account_OneTimeAuth) String() string
type AesCfb ¶
type AesCfb struct {
KeyBytes int32
}
AesCfb represents all AES-CFB ciphers.
func (*AesCfb) NewDecryptionReader ¶
type Authenticator ¶
type Authenticator struct {
// contains filtered or unexported fields
}
func NewAuthenticator ¶
func NewAuthenticator(keygen KeyGenerator) *Authenticator
func (*Authenticator) Authenticate ¶
func (v *Authenticator) Authenticate(data []byte) buf.Supplier
type ChunkReader ¶
type ChunkReader struct {
// contains filtered or unexported fields
}
func NewChunkReader ¶
func NewChunkReader(reader io.Reader, auth *Authenticator) *ChunkReader
func (*ChunkReader) ReadMultiBuffer ¶
func (v *ChunkReader) ReadMultiBuffer() (buf.MultiBuffer, error)
type ChunkWriter ¶
type ChunkWriter struct {
// contains filtered or unexported fields
}
func NewChunkWriter ¶
func NewChunkWriter(writer io.Writer, auth *Authenticator) *ChunkWriter
func (*ChunkWriter) WriteMultiBuffer ¶
func (w *ChunkWriter) WriteMultiBuffer(mb buf.MultiBuffer) error
WriteMultiBuffer implements buf.Writer.
type Cipher ¶
type Cipher interface { KeySize() int32 IVSize() int32 NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) IsAEAD() bool EncodePacket(key []byte, b *buf.Buffer) error DecodePacket(key []byte, b *buf.Buffer) error }
Cipher is an interface for all Shadowsocks ciphers.
type CipherType ¶
type CipherType int32
const ( CipherType_UNKNOWN CipherType = 0 CipherType_AES_128_CFB CipherType = 1 CipherType_AES_256_CFB CipherType = 2 CipherType_CHACHA20 CipherType = 3 CipherType_CHACHA20_IETF CipherType = 4 CipherType_AES_128_GCM CipherType = 5 CipherType_AES_256_GCM CipherType = 6 CipherType_CHACHA20_POLY1305 CipherType = 7 CipherType_NONE CipherType = 8 )
func (CipherType) EnumDescriptor ¶
func (CipherType) EnumDescriptor() ([]byte, []int)
func (CipherType) String ¶
func (x CipherType) String() string
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a inbound handler for Shadowsocks protocol
type ClientConfig ¶
type ClientConfig struct { Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server" json:"server,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
func (*ClientConfig) Descriptor ¶
func (*ClientConfig) Descriptor() ([]byte, []int)
func (*ClientConfig) GetServer ¶
func (m *ClientConfig) GetServer() []*protocol.ServerEndpoint
func (*ClientConfig) ProtoMessage ¶
func (*ClientConfig) ProtoMessage()
func (*ClientConfig) Reset ¶
func (m *ClientConfig) Reset()
func (*ClientConfig) String ¶
func (m *ClientConfig) String() string
func (*ClientConfig) XXX_DiscardUnknown ¶
func (m *ClientConfig) XXX_DiscardUnknown()
func (*ClientConfig) XXX_Marshal ¶
func (m *ClientConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
func (*ClientConfig) XXX_Merge ¶
func (dst *ClientConfig) XXX_Merge(src proto.Message)
func (*ClientConfig) XXX_Size ¶
func (m *ClientConfig) XXX_Size() int
func (*ClientConfig) XXX_Unmarshal ¶
func (m *ClientConfig) XXX_Unmarshal(b []byte) error
type KeyGenerator ¶
type KeyGenerator func() []byte
type MemoryAccount ¶
type MemoryAccount struct { Cipher Cipher Key []byte OneTimeAuth Account_OneTimeAuth }
MemoryAccount is an account type converted from Account.
type NoneCipher ¶
type NoneCipher struct{}
func (NoneCipher) DecodePacket ¶
func (NoneCipher) DecodePacket(key []byte, b *buf.Buffer) error
func (NoneCipher) EncodePacket ¶
func (NoneCipher) EncodePacket(key []byte, b *buf.Buffer) error
func (NoneCipher) IVSize ¶
func (NoneCipher) IVSize() int32
func (NoneCipher) IsAEAD ¶
func (NoneCipher) IsAEAD() bool
func (NoneCipher) KeySize ¶
func (NoneCipher) KeySize() int32
func (NoneCipher) NewDecryptionReader ¶
func (NoneCipher) NewEncryptionWriter ¶
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
func NewServer ¶
func NewServer(ctx context.Context, config *ServerConfig) (*Server, error)
NewServer create a new Shadowsocks server.
func (*Server) Network ¶
func (s *Server) Network() net.NetworkList
type ServerConfig ¶
type ServerConfig struct { // UdpEnabled specified whether or not to enable UDP for Shadowsocks. // Deprecated. Use 'network' field. UdpEnabled bool `protobuf:"varint,1,opt,name=udp_enabled,json=udpEnabled" json:"udp_enabled,omitempty"` // Deprecated: Do not use. User *protocol.User `protobuf:"bytes,2,opt,name=user" json:"user,omitempty"` Network []net.Network `protobuf:"varint,3,rep,packed,name=network,enum=com.core.common.net.Network" json:"network,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
func (*ServerConfig) Descriptor ¶
func (*ServerConfig) Descriptor() ([]byte, []int)
func (*ServerConfig) GetNetwork ¶
func (m *ServerConfig) GetNetwork() []net.Network
func (*ServerConfig) GetUdpEnabled
deprecated
func (m *ServerConfig) GetUdpEnabled() bool
Deprecated: Do not use.
func (*ServerConfig) GetUser ¶
func (m *ServerConfig) GetUser() *protocol.User
func (*ServerConfig) ProtoMessage ¶
func (*ServerConfig) ProtoMessage()
func (*ServerConfig) Reset ¶
func (m *ServerConfig) Reset()
func (*ServerConfig) String ¶
func (m *ServerConfig) String() string
func (*ServerConfig) XXX_DiscardUnknown ¶
func (m *ServerConfig) XXX_DiscardUnknown()
func (*ServerConfig) XXX_Marshal ¶
func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
func (*ServerConfig) XXX_Merge ¶
func (dst *ServerConfig) XXX_Merge(src proto.Message)
func (*ServerConfig) XXX_Size ¶
func (m *ServerConfig) XXX_Size() int
func (*ServerConfig) XXX_Unmarshal ¶
func (m *ServerConfig) XXX_Unmarshal(b []byte) error
type UDPReader ¶
func (*UDPReader) ReadMultiBuffer ¶
func (v *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error)