Documentation ¶
Overview ¶
Package tapdance implements a refraction networking client in golang.
Index ¶
- Constants
- func Assets() *assets
- func AssetsSetDir(dir string) (*assets, error)
- func Connect(ctx context.Context, reg *ConjureReg) (net.Conn, error)
- func Dial(network, address string) (net.Conn, error)
- func DialConjure(ctx context.Context, cjSession *ConjureSession, registrationMethod Registrar) (net.Conn, error)
- func DialConjureAddr(ctx context.Context, address string, registrationMethod Registrar) (net.Conn, error)
- func EnableProxyProtocol()
- func Logger() *logrus.Logger
- func NewTapDanceConn() (net.Conn, error)
- func SelectDecoys(sharedSecret []byte, version uint, width uint) ([]*pb.TLSDecoySpec, error)
- func SelectPhantom(seed []byte, support uint) (*net.IP, *net.IP, error)
- func SetTlsLogFilename(filename string) error
- func WriteTlsLog(clientRandom, masterSecret []byte) error
- type APIRegistrar
- type APIRegistrarBidirectional
- type ConjureReg
- type ConjureSession
- type CounterUint64
- type DecoyRegistrar
- type Dialer
- type Obfs4Keys
- type RegError
- type Registrar
- type TapdanceFlowConn
- func (flowConn *TapdanceFlowConn) Close() error
- func (flowConn *TapdanceFlowConn) DialContext(ctx context.Context) error
- func (flowConn *TapdanceFlowConn) LocalAddr() net.Addr
- func (flowConn *TapdanceFlowConn) Read(b []byte) (int, error)
- func (flowConn *TapdanceFlowConn) RemoteAddr() net.Addr
- func (flowConn *TapdanceFlowConn) SetDeadline(t time.Time) error
- func (flowConn *TapdanceFlowConn) SetReadDeadline(t time.Time) error
- func (flowConn *TapdanceFlowConn) SetWriteDeadline(t time.Time) error
- func (flowConn *TapdanceFlowConn) Write(b []byte) (int, error)
- type V6
Constants ¶
const ( // Unreachable -Dial Error Unreachable -- likely network unavailable (i.e. ipv6 error) Unreachable = iota // DialFailure - Dial Error Other than unreachable DialFailure // NotImplemented - Related Function Not Implemented NotImplemented // TLS Error (Expired, Wrong-Host, Untrusted-Root, ...) TLSError // Unknown - Error occurred without obvious explanation Unknown )
const AES_GCM_TAG_SIZE = 16
Variables ¶
This section is empty.
Functions ¶
func Assets ¶
func Assets() *assets
Assets is an access point to asset managing singleton. First access to singleton sets path. Assets(), if called before SetAssetsDir() sets path to "./assets/"
func AssetsSetDir ¶
AssetsSetDir sets the directory to read assets from. Functionally equivalent to Assets() after initialization, unless dir changes.
func Dial ¶
Dial connects to the address on the named network.
The only supported network at this time: "tcp". The address has the form "host:port". The host must be a literal IP address, or a host name that can be resolved to IP addresses. To avoid abuse, only certain whitelisted ports are allowed.
Example: Dial("tcp", "golang.org:80")
func DialConjure ¶
func DialConjure(ctx context.Context, cjSession *ConjureSession, registrationMethod Registrar) (net.Conn, error)
DialConjure - Perform Registration and Dial on an existing Conjure session
func DialConjureAddr ¶
func DialConjureAddr(ctx context.Context, address string, registrationMethod Registrar) (net.Conn, error)
DialConjureAddr - Perform Registration and Dial after creating a Conjure session from scratch
func EnableProxyProtocol ¶
func EnableProxyProtocol()
Global EnableProxyProtocol() is deprecated, use tapdance.Dialer with UseProxyHeader flag instead
Requests station to send client's IP to covert in following form: PROXY TCP4 x.x.x.x 127.0.0.1 1111 1234\r\n
^__^ ^_____^ ^_________________^ proto clientIP garbage
func NewTapDanceConn ¶
NewTapDanceConn returns TapDance connection, that is ready to be Dial'd
func SelectDecoys ¶
SelectDecoys - Get an array of `width` decoys to be used for registration
func SelectPhantom ¶
SelectPhantom - select one phantom IP address based on shared secret
func SetTlsLogFilename ¶
func WriteTlsLog ¶
Types ¶
type APIRegistrar ¶
type APIRegistrar struct { // Endpoint to use in registration request Endpoint string // HTTP client to use in request Client *http.Client // Length of time to delay after confirming successful // registration before attempting a connection, // allowing for propagation throughout the stations. ConnectionDelay time.Duration // Maximum number of retries before giving up MaxRetries int // A secondary registration method to use on failure. // Because the API registration can give us definite // indication of a failure to register, this can be // used as a "backup" in the case of the API being // down or being blocked. // // If this field is nil, no secondary registration will // be attempted. If it is non-nil, after failing to register // (retrying MaxRetries times) we will fall back to // the Register method on this field. SecondaryRegistrar Registrar }
Registration strategy using a centralized REST API to create registrations. Only the Endpoint need be specified; the remaining fields are valid with their zero values and provide the opportunity for additional control over the process.
func (APIRegistrar) Register ¶
func (r APIRegistrar) Register(cjSession *ConjureSession, ctx context.Context) (*ConjureReg, error)
type APIRegistrarBidirectional ¶
type APIRegistrarBidirectional struct { // Endpoint to use in registration request Endpoint string // HTTP client to use in request Client *http.Client // Length of time to delay after confirming successful // registration before attempting a connection, // allowing for propagation throughout the stations. ConnectionDelay time.Duration // Maximum number of retries before giving up MaxRetries int // A secondary registration method to use on failure. // Because the API registration can give us definite // indication of a failure to register, this can be // used as a "backup" in the case of the API being // down or being blocked. // // If this field is nil, no secondary registration will // be attempted. If it is non-nil, after failing to register // (retrying MaxRetries times) we will fall back to // the Register method on this field. SecondaryRegistrar Registrar }
Registration strategy using a centralized REST API to create registrations. Only the Endpoint need be specified; the remaining fields are valid with their zero values and provide the opportunity for additional control over the process.
func (APIRegistrarBidirectional) Register ¶
func (r APIRegistrarBidirectional) Register(cjSession *ConjureSession, ctx context.Context) (*ConjureReg, error)
type ConjureReg ¶
type ConjureReg struct { // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID // we use their dialer to prevent connection loopback into our own proxy // connection when tunneling the whole device. TcpDialer func(context.Context, string, string) (net.Conn, error) // contains filtered or unexported fields }
ConjureReg - Registration structure created for each individual registration within a session.
type ConjureSession ¶
type ConjureSession struct { Keys *sharedKeys Width uint V6Support *V6 UseProxyHeader bool SessionID uint64 RegDecoys []*pb.TLSDecoySpec // pb.DecoyList Phantom *net.IP Transport pb.TransportType CovertAddress string // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID // we use their dialer to prevent connection loopback into our own proxy // connection when tunneling the whole device. TcpDialer func(context.Context, string, string) (net.Conn, error) // contains filtered or unexported fields }
ConjureSession - Create a session with details for registration and connection
func (*ConjureSession) IDString ¶
func (cjSession *ConjureSession) IDString() string
IDString - Get the ID string for the session
func (*ConjureSession) String ¶
func (cjSession *ConjureSession) String() string
String - Print the string for debug and/or logging
type CounterUint64 ¶
CounterUint64 is a goroutine-safe uint64 counter. Wraps, if underflows/overflows.
func (*CounterUint64) Dec ¶
func (c *CounterUint64) Dec() uint64
Dec decrements the counter and returns resulting value
func (*CounterUint64) Get ¶
func (c *CounterUint64) Get() (value uint64)
Get returns current counter value
func (*CounterUint64) GetAndInc ¶
func (c *CounterUint64) GetAndInc() uint64
GetAndInc returns current value and then increases the counter
func (*CounterUint64) Inc ¶
func (c *CounterUint64) Inc() uint64
Inc increases the counter and returns resulting value
func (*CounterUint64) Set ¶
func (c *CounterUint64) Set(value uint64)
Set assigns current counter value
type DecoyRegistrar ¶
type DecoyRegistrar struct { // TcpDialer is a custom TCP dailer to use when establishing TCP connections // to decoys. When nil, Dialer.TcpDialer will be used. TcpDialer func(context.Context, string, string) (net.Conn, error) }
func (DecoyRegistrar) Register ¶
func (r DecoyRegistrar) Register(cjSession *ConjureSession, ctx context.Context) (*ConjureReg, error)
type Dialer ¶
type Dialer struct { SplitFlows bool // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID // we use their dialer to prevent connection loopback into our own proxy // connection when tunneling the whole device. TcpDialer func(context.Context, string, string) (net.Conn, error) DarkDecoy bool // The type of registrar to use when performing Conjure registrations. DarkDecoyRegistrar Registrar // The type of transport to use for Conjure connections. Transport pb.TransportType UseProxyHeader bool V6Support bool // *bool so that it is a nullable type. that can be overridden Width int }
Dialer contains options and implements advanced functions for establishing TapDance connection.
func (*Dialer) DialContext ¶
DialContext connects to the address on the named network using the provided context. Long deadline is strongly advised, since tapdance will try multiple decoys.
The only supported network at this time: "tcp". The address has the form "host:port". The host must be a literal IP address, or a host name that can be resolved to IP addresses. To avoid abuse, only certain whitelisted ports are allowed.
Example: Dial("tcp", "golang.org:80")
type RegError ¶
type RegError struct {
// contains filtered or unexported fields
}
RegError - Registration Error passed during registration to indicate failure mode
type Registrar ¶
type Registrar interface {
Register(*ConjureSession, context.Context) (*ConjureReg, error)
}
Registrar defines the interface for a service executing decoy registrations.
type TapdanceFlowConn ¶
type TapdanceFlowConn struct {
// contains filtered or unexported fields
}
TapdanceFlowConn represents single TapDance flow.
func (*TapdanceFlowConn) Close ¶
func (flowConn *TapdanceFlowConn) Close() error
Close closes the connection. Any blocked Read or Write operations will be unblocked and return errors.
func (*TapdanceFlowConn) DialContext ¶
func (flowConn *TapdanceFlowConn) DialContext(ctx context.Context) error
Dial establishes direct connection to TapDance station proxy. Users are expected to send HTTP CONNECT request next.
func (*TapdanceFlowConn) LocalAddr ¶
func (flowConn *TapdanceFlowConn) LocalAddr() net.Addr
LocalAddr returns the local network address.
func (*TapdanceFlowConn) RemoteAddr ¶
func (flowConn *TapdanceFlowConn) RemoteAddr() net.Addr
RemoteAddr returns the address of current decoy. Not goroutine-safe, mostly here to satisfy net.Conn
func (*TapdanceFlowConn) SetDeadline ¶
func (flowConn *TapdanceFlowConn) SetDeadline(t time.Time) error
SetDeadline is supposed to set the read and write deadlines associated with the connection. It is equivalent to calling both SetReadDeadline and SetWriteDeadline.
TODO: In reality, SetDeadline doesn't do that yet, but existence of this function is mandatory to implement net.Conn
A deadline is an absolute time after which I/O operations fail with a timeout (see type Error) instead of blocking. The deadline applies to all future I/O, not just the immediately following call to Read or Write.
An idle timeout can be implemented by repeatedly extending the deadline after successful Read or Write calls.
A zero value for t means I/O operations will not time out.
func (*TapdanceFlowConn) SetReadDeadline ¶
func (flowConn *TapdanceFlowConn) SetReadDeadline(t time.Time) error
SetReadDeadline sets the deadline for future Read calls. A zero value for t means Read will not time out.
func (*TapdanceFlowConn) SetWriteDeadline ¶
func (flowConn *TapdanceFlowConn) SetWriteDeadline(t time.Time) error
SetWriteDeadline sets the deadline for future Write calls. Even if write times out, it may return n > 0, indicating that some of the data was successfully written. A zero value for t means Write will not time out.