func handleRequest(conn net.Conn) { timeCookie := tool.GetTimeCookie() initKey := sha256.Sum256([]byte(passwd + timeCookie)) nonce := sha512.Sum512([]byte(timeCookie + passwd)) es, err := chacha20.NewXChaCha(initKey[:], nonce[:XNonceSize]) ds, err := chacha20.NewXChaCha(initKey[:], nonce[:XNonceSize]) if err != nil { log.Println("Error chacha20 init: ", err) return } pconn, err := net.Dial("tcp", server+":"+strconv.Itoa(sport)) if err != nil { log.Println("Create connection failed :", err) return } cconn := cipherConn.NewCipherConn(ds, es, pconn) defer cconn.Close() randomDataLen, _ := tool.ReadInt(initKey[len(initKey)-2:]) if randomDataLen < 32767 { randomDataLen = randomDataLen + 2984 } randomData := make([]byte, randomDataLen+poly1305.TagSize) randbytes.Read(randomData) var mac [poly1305.TagSize]byte poly1305.Sum(&mac, randomData[:randomDataLen], &initKey) copy(randomData[randomDataLen:], mac[:]) // Start proxying finish := make(chan bool, 4) // write random data head _, err = cconn.Write(randomData) if err != nil { log.Println("Connection write failed :", err) return } go proxy(cconn, conn, finish) go proxy(conn, cconn, finish) // Wait select { case <-finish: } time.Sleep(2 * time.Second) }
func proxy(conn net.Conn, encode, decode cipher.Stream, randomDataLen int, key *[32]byte) { cconn := cipherConn.NewCipherConn(decode, encode, conn) var ri = 0 var randomdata = make([]byte, randomDataLen+poly1305.TagSize) for ri < (randomDataLen + poly1305.TagSize) { r, err := cconn.Read(randomdata[ri:]) if err != nil { return } ri += r } var mac [16]byte copy(mac[:], randomdata[randomDataLen:]) if !poly1305.Verify(&mac, randomdata[:randomDataLen], key) { log.Println("poly1305 mac verify error") return } simpleSocks5.Socks5Handle(cconn) time.Sleep(time.Second) }