diff --git a/go.mod b/go.mod index df9bd02..09775a7 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b // indirect github.com/tjfoc/gmsm v1.3.0 // indirect github.com/xtaci/kcp-go v5.4.20+incompatible - golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 + golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect golang.org/x/sys v0.0.0-20200331124033-c3d80250170d // indirect ) diff --git a/go.sum b/go.sum index dc3cbd6..c11d598 100644 --- a/go.sum +++ b/go.sum @@ -59,8 +59,8 @@ golang.org/x/crypto v0.0.0-20191010185427-af544f31c8ac/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8 h1:fpnn/HnJONpIu6hkXi1u/7rR0NzilgWr4T0JmWkEitk= +golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= diff --git a/main.go b/main.go index 24e3d0b..f5950a0 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,7 @@ import ( _ "github.com/nadoo/glider/proxy/ws" ) -var version = "0.9.3" +var version = "0.10.0" func main() { // read configs diff --git a/proxy/kcp/kcp.go b/proxy/kcp/kcp.go index cd3bf68..1a70581 100644 --- a/proxy/kcp/kcp.go +++ b/proxy/kcp/kcp.go @@ -3,6 +3,7 @@ package kcp import ( "crypto/sha1" "errors" + "fmt" "net" "net/url" "strconv" @@ -85,45 +86,50 @@ func NewKCP(s string, d proxy.Dialer, p proxy.Proxy) (*KCP, error) { } if k.crypt != "" { - pass := pbkdf2.Key([]byte(k.key), []byte("kcp-go"), 4096, 32, sha1.New) - var block kcp.BlockCrypt - switch k.crypt { - case "sm4": - block, _ = kcp.NewSM4BlockCrypt(pass[:16]) - case "tea": - block, _ = kcp.NewTEABlockCrypt(pass[:16]) - case "xor": - block, _ = kcp.NewSimpleXORBlockCrypt(pass) - case "none": - block, _ = kcp.NewNoneBlockCrypt(pass) - case "aes": - block, _ = kcp.NewAESBlockCrypt(pass) - case "aes-128": - block, _ = kcp.NewAESBlockCrypt(pass[:16]) - case "aes-192": - block, _ = kcp.NewAESBlockCrypt(pass[:24]) - case "blowfish": - block, _ = kcp.NewBlowfishBlockCrypt(pass) - case "twofish": - block, _ = kcp.NewTwofishBlockCrypt(pass) - case "cast5": - block, _ = kcp.NewCast5BlockCrypt(pass[:16]) - case "3des": - block, _ = kcp.NewTripleDESBlockCrypt(pass[:24]) - case "xtea": - block, _ = kcp.NewXTEABlockCrypt(pass[:16]) - case "salsa20": - block, _ = kcp.NewSalsa20BlockCrypt(pass) - default: - return nil, errors.New("[kcp] unknown crypt type '" + k.crypt + "'") + k.block, err = block(k.crypt, k.key) + if err != nil { + return nil, fmt.Errorf("[kcp] error: %s", err) } - - k.block = block } return k, nil } +func block(crypt, key string) (block kcp.BlockCrypt, err error) { + pass := pbkdf2.Key([]byte(key), []byte("kcp-go"), 4096, 32, sha1.New) + switch crypt { + case "sm4": + block, _ = kcp.NewSM4BlockCrypt(pass[:16]) + case "tea": + block, _ = kcp.NewTEABlockCrypt(pass[:16]) + case "xor": + block, _ = kcp.NewSimpleXORBlockCrypt(pass) + case "none": + block, _ = kcp.NewNoneBlockCrypt(pass) + case "aes": + block, _ = kcp.NewAESBlockCrypt(pass) + case "aes-128": + block, _ = kcp.NewAESBlockCrypt(pass[:16]) + case "aes-192": + block, _ = kcp.NewAESBlockCrypt(pass[:24]) + case "blowfish": + block, _ = kcp.NewBlowfishBlockCrypt(pass) + case "twofish": + block, _ = kcp.NewTwofishBlockCrypt(pass) + case "cast5": + block, _ = kcp.NewCast5BlockCrypt(pass[:16]) + case "3des": + block, _ = kcp.NewTripleDESBlockCrypt(pass[:24]) + case "xtea": + block, _ = kcp.NewXTEABlockCrypt(pass[:16]) + case "salsa20": + block, _ = kcp.NewSalsa20BlockCrypt(pass) + default: + err = errors.New("unknown crypt type '" + crypt + "'") + } + return block, err +} + // NewKCPDialer returns a kcp proxy dialer. func NewKCPDialer(s string, d proxy.Dialer) (proxy.Dialer, error) { return NewKCP(s, d, nil) diff --git a/strategy/strategy.go b/strategy/strategy.go index 512e2cb..4494545 100644 --- a/strategy/strategy.go +++ b/strategy/strategy.go @@ -117,14 +117,6 @@ func (p *Proxy) NextDialer(dstAddr string) proxy.Dialer { p.mu.RLock() defer p.mu.RUnlock() - return p.NextForwarder(dstAddr) -} - -// NextDialer returns the next dialer. -func (p *Proxy) NextForwarder(dstAddr string) *Forwarder { - p.mu.RLock() - defer p.mu.RUnlock() - if len(p.avail) == 0 { return p.fwdrs[atomic.AddUint32(&p.index, 1)%uint32(len(p.fwdrs))] }