add cipher for transfer data

This commit is contained in:
ginuerzh 2015-03-23 21:43:44 +08:00
parent 9ccddf3cf8
commit f3d3a66d03
2 changed files with 32 additions and 15 deletions

46
gost.go
View File

@ -28,6 +28,7 @@ const (
type Gost struct { type Gost struct {
Laddr, Saddr, Proxy string Laddr, Saddr, Proxy string
Shadows bool // shadowsocks compatible Shadows bool // shadowsocks compatible
Cipher bool
} }
func (g *Gost) Run() error { func (g *Gost) Run() error {
@ -80,20 +81,39 @@ func (g *Gost) cli(conn net.Conn) {
lg.Logln(err) lg.Logln(err)
return return
} }
defer sconn.Close()
defer sconn.Close()
laddr := sconn.(*net.TCPConn).LocalAddr().String() laddr := sconn.(*net.TCPConn).LocalAddr().String()
lg.Logln(laddr) lg.Logln(laddr)
if _, err := sconn.Write([]byte{5, 1, 0}); err != nil { b := make([]byte, 8192)
b[0] = 5
b[1] = 1
if gost.Cipher {
b[2] = 0x88
}
if _, err := sconn.Write(b[:3]); err != nil {
lg.Logln(err) lg.Logln(err)
return return
} }
lg.Logln(">>>|", []byte{5, 1, 0}) lg.Logln(">>>|", b[:3])
n, err := io.ReadFull(sconn, b[:2])
if err != nil {
lg.Logln(err)
return
}
lg.Logln("<<<|", b[:n])
if b[1] == 0x88 {
cipher, _ := shadowsocks.NewCipher("aes-256-cfb", "gost")
sconn = shadowsocks.NewConn(sconn, cipher)
}
if g.Shadows { if g.Shadows {
lg.Logln("shadowsocks, aes-256-cfb") lg.Logln("shadowsocks, aes-256-cfb")
cipher, _ := shadowsocks.NewCipher("aes-256-cfb", "123456") cipher, _ := shadowsocks.NewCipher("aes-256-cfb", "gost")
conn = shadowsocks.NewConn(conn, cipher) conn = shadowsocks.NewConn(conn, cipher)
addr, port, extra, err := getRequest(conn) addr, port, extra, err := getRequest(conn)
if err != nil { if err != nil {
@ -133,15 +153,6 @@ func (g *Gost) cli(conn net.Conn) {
return return
} }
b := make([]byte, 8192)
n, err := io.ReadFull(sconn, b[:2])
if err != nil {
lg.Logln(err)
return
}
lg.Logln("<<<|", b[:n])
n, err = conn.Read(b) n, err = conn.Read(b)
if err != nil { if err != nil {
lg.Logln(err) lg.Logln(err)
@ -262,12 +273,17 @@ func (g *Gost) srv(conn net.Conn) {
if b[0] == 5 { // socks5,NO AUTHENTICATION if b[0] == 5 { // socks5,NO AUTHENTICATION
lg.Logln("|>>>", b[:n]) lg.Logln("|>>>", b[:n])
if _, err := conn.Write([]byte{5, 0}); err != nil { method := b[2]
if _, err := conn.Write([]byte{5, method}); err != nil {
lg.Logln(err) lg.Logln(err)
return return
} }
lg.Logln("|<<<", []byte{5, 0}) lg.Logln("|<<<", []byte{5, method})
if method == 0x88 {
cipher, _ := shadowsocks.NewCipher("aes-256-cfb", "gost")
conn = shadowsocks.NewConn(conn, cipher)
}
cmd, err := ReadCmd(conn) cmd, err := ReadCmd(conn)
if err != nil { if err != nil {
lg.Logln(err) lg.Logln(err)

View File

@ -12,6 +12,7 @@ func init() {
flag.StringVar(&gost.Proxy, "P", "", "proxy for forward") flag.StringVar(&gost.Proxy, "P", "", "proxy for forward")
flag.StringVar(&gost.Saddr, "S", "", "the server that connecting to") flag.StringVar(&gost.Saddr, "S", "", "the server that connecting to")
flag.StringVar(&gost.Laddr, "L", ":8080", "listen address") flag.StringVar(&gost.Laddr, "L", ":8080", "listen address")
flag.BoolVar(&gost.Cipher, "cipher", true, "cipher transfer data")
flag.BoolVar(&gost.Shadows, "ss", false, "shadowsocks compatible") flag.BoolVar(&gost.Shadows, "ss", false, "shadowsocks compatible")
flag.BoolVar(&Debug, "d", false, "debug option") flag.BoolVar(&Debug, "d", false, "debug option")
flag.Parse() flag.Parse()