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 handleRequest(conn net.Conn) { defer conn.Close() 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 } //random data head length randomDataLen, _ := tool.ReadInt(initKey[len(initKey)-2:]) if randomDataLen < 32767 { randomDataLen = randomDataLen + 2984 } proxy(conn, es, ds, randomDataLen, &initKey) }