package tunnel import ( "crypto/aes" "crypto/cipher" "crypto/md5" "crypto/rand" "crypto/rsa" "crypto/sha1" "encoding/binary" "github.com/Lafeng/deblocus/exception" "github.com/monnand/dhkx" ) var ( UNSUPPORTED_CIPHER = exception.NewW("Unsupported cipher") ) type cipherBuilder func(k, iv []byte) *XORCipherKit type cipherDecr struct { keyLen int builder cipherBuilder } type cipherKit interface { encrypt(dst, src []byte) decrypt(dst, src []byte) } type XORCipherKit struct {
ERR_PING_TIMEOUT = 0xe ERR_NEW_PING = 0xf ERR_UNKNOWN = 0x0 ) const sid_max uint32 = 0xffff var ( // [1, 0xfffe] sid_seq uint32 bytePoolOnce sync.Once bytePool *bytepool.BytePool ) var ( ERR_DATA_TAMPERED = ex.NewW("data tampered") ) // -------------------- // event_handler // -------------------- type event byte const ( evt_tokens = event(1) ) type event_handler func(e event, msg ...interface{}) // -------------------- // idler
VERSION uint32 VER_STRING string DEBUG bool ) var ( // socks5 exceptions INVALID_SOCKS5_HEADER = exception.New(0xff, "Invalid socks5 header") INVALID_SOCKS5_REQUEST = exception.New(0x07, "Invalid socks5 request") GENERAL_FAILURE = exception.New(0x01, "General failure") HOST_UNREACHABLE = exception.New(0x04, "Host is unreachable") ) var ( // D5 exceptions INVALID_D5PARAMS = exception.NewW("Invalid D5Params") D5SER_UNREACHABLE = exception.NewW("D5Server is unreachable") VALIDATION_FAILED = exception.NewW("Validation failed") NEGOTIATION_FAILED = exception.NewW("Negotiation failed") DATATUN_SESSION = exception.NewW("DT") INCONSISTENT_HASH = exception.NewW("Inconsistent hash") INCOMPATIBLE_VERSION = exception.NewW("Incompatible version") UNRECOGNIZED_REQ = exception.NewW("Unrecognized Request") ) // len_inByte: first segment length of bytes, enum: 1,2,4 func ReadFullByLen(len_inByte int, reader io.Reader) (buf []byte, err error) { lb := make([]byte, len_inByte) _, err = io.ReadFull(reader, lb) if err != nil { return
package auth import ( "bufio" "github.com/Lafeng/deblocus/exception" "os" "strings" ) var ( NO_SUCH_USER = exception.NewW("No such user") AUTH_FAILED = exception.NewW("Auth failed") UNIMPLEMENTED_AUTHSYS = exception.NewW("Unimplemented authsys") INVALID_AUTH_CONF = exception.NewW("Invalid Auth config") INVALID_AUTH_PARAMS = exception.NewW("Invalid Auth params") ) type AuthSys interface { Authenticate(input []byte) (bool, error) AddUser(user *User) error UserInfo(user string) (*User, error) } type User struct { Name string Pass string } func GetAuthSysImpl(proto string) (AuthSys, error) { if strings.HasPrefix(proto, "file://") { return NewFileAuthSys(proto[7:])
"regexp" "sort" "strconv" "strings" ) const ( SER_KEY_TYPE = "deblocus/SERVER-PRIVATEKEY" USER_CREDENTIAL_TYPE = "deblocus/CLIENT-CREDENTIAL" WORD_d5p = "D5P" WORD_provider = "Provider" SIZE_UNIT = "BKMG" ) var ( FILE_NOT_FOUND = exception.NewW("File not found") FILE_EXISTS = exception.NewW("File is already exists") INVALID_D5P_FRAGMENT = exception.NewW("Invalid d5p fragment") INVALID_D5C_FILE = exception.NewW("Invalid d5c file format") INVALID_D5S_FILE = exception.NewW("Invalid d5s file format") UNRECOGNIZED_SYMBOLS = exception.NewW("Unrecognized symbols") UNRECOGNIZED_DIRECTIVES = exception.NewW("Unrecognized directives") LOCAL_BIND_ERROR = exception.NewW("Local bind error") CONF_MISS = exception.NewW("Missed config") CONF_ERROR = exception.NewW("Error config") ) // client type D5ClientConf struct { Listen string `importable:":9009"` Verbose int `importable:"1"`
) const ( DT_PING_INTERVAL = 110 RETRY_INTERVAL = time.Second * 5 REST_INTERVAL = RETRY_INTERVAL ) const ( CLT_CLOSED int32 = -1 CLT_WORKING int32 = 0 CLT_PENDING int32 = 1 ) var ( ERR_REQ_TK_TIMEOUT = ex.NewW("Request token timeout") ERR_REQ_TK_ABORTED = ex.NewW("Requst token aborted") ) type Client struct { mux *multiplexer token []byte nego *dbcCltNego params *tunParams lock sync.Locker dtCnt int32 reqCnt int32 state int32 round int32 pendingConn *semaphore pendingTK *semaphore