TapDance is a free-to-use anti-censorship technology, protected from enumeration attacks.
- Install Golang (currently tested against 1.8-1.9 versions), set GOPATH:
GOPATH="${HOME}/go/"
- Get source code for Go Tapdance and all dependencies:
go get github.com/sergeyfrolov/gotapdance github.com/Sirupsen/logrus \
github.com/agl/ed25519/extra25519 golang.org/x/crypto/curve25519 \
github.com/refraction-networking/utls github.com/sergeyfrolov/bsbuffer \
github.com/golang/protobuf/proto
Ignore the "no buildable Go source files" warning.
If you have outdated versions of libraries above you might want to do go get -u all
There are several ways to use TapDance:
-
Mobile: native applications in Java/Objective C for Android or iOS. Golang bindings are used as a shared library.
-
iOS version: coming
sooneventually
-
Use tapdance directly from other Golang program:
package main
import (
"github.com/sergeyfrolov/gotapdance/tapdance"
"fmt"
)
func main() {
tdConn, err := tapdance.Dial("tcp", "censoredsite.com:80")
if err != nil {
fmt.Printf("tapdance.Dial() failed: %+v\n", err)
return
}
// tdConn implements standard net.Conn, allowing to use it like any other Golang conn with
// Write(), Read(), Close() etc. It also allows to pass tdConn to functions that expect
// net.Conn, such as tls.Client() making it easy to do tls handshake over TapDance conn.
_, err = tdConn.Write([]byte("GET / HTTP/1.1\nHost: censoredsite.com\n\n"))
if err != nil {
fmt.Printf("tdConn.Write() failed: %+v\n", err)
return
}
buf := make([]byte, 16384)
_, err = tdConn.Read(buf)
// ...
}
Refraction Networking is an umberlla term for the family of similarly working technnologies.
TapDance station code released for FOCI'17 on github: refraction-networking/tapdance
Original 2014 paper: "TapDance: End-to-Middle Anticensorship without Flow Blocking"
Newer(2017) paper that shows TapDance working at high-scale: "An ISP-Scale Deployment of TapDance"