Documentation
¶
Index ¶
- Constants
- Variables
- func BindSockets(con1, con2 *QSocket) error
- func CalcChecksum(data []byte, base byte) byte
- func CreateSocketChan(sock *QSocket) chan []byte
- func GetDeviceUserAgent() string
- func NewChecksumUri(sType SocketType) string
- func RandomString(charset string, length int) string
- type QSocket
- func (qs *QSocket) Close()
- func (qs *QSocket) Dial(useTls bool) error
- func (qs *QSocket) DoWsProtocolSwitch() error
- func (qs *QSocket) InitClientSRP() ([]byte, error)
- func (qs *QSocket) InitE2ECipher(key []byte) error
- func (qs *QSocket) InitServerSRP() ([]byte, error)
- func (qs *QSocket) InitiateKnockSequence() error
- func (qs *QSocket) IsClient() bool
- func (qs *QSocket) IsClosed() bool
- func (qs *QSocket) IsE2E() bool
- func (qs *QSocket) IsServer() bool
- func (qs *QSocket) IsTLS() bool
- func (qs *QSocket) LocalAddr() net.Addr
- func (qs *QSocket) Read(b []byte) (int, error)
- func (qs *QSocket) RemoteAddr() net.Addr
- func (qs *QSocket) SetCertFingerprint(h string) error
- func (qs *QSocket) SetE2E(v bool) error
- func (qs *QSocket) SetProxy(proxyAddr string) error
- func (qs *QSocket) SetReadDeadline(t time.Time) error
- func (qs *QSocket) SetWriteDeadline(t time.Time) error
- func (qs *QSocket) VerifyTlsCertificate() error
- func (qs *QSocket) Write(b []byte) (int, error)
- type SocketType
Constants ¶
const ( // QSRN_GATE is the static gate address for the QSocket network. QSRN_GATE = "relay.qsocket.io" // QSRN_TOR_GATE is the static ONION address for the QSocket network. QSRN_TOR_GATE = "5cah65fto4tjklhocryenlgti6bfnh4y5szjfvxeqqh3vvw2ff4uq2id.onion" // QSRN_GATE_TLS_PORT Default TLS port for the QSocket gate. QSRN_GATE_TLS_PORT = 443 // QSRN_GATE_PORT Default TCP port for the QSocket gate. QSRN_GATE_PORT = 80 // CHECKSUM_BASE is the constant base value for calculating knock sequence URI checksums. CHECKSUM_BASE = 0xEE URI_CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-" CRLF = "\r\n" )
Some global constants for These values can be changed for obfuscating the knock protocol
const SRP_BITS = 4096
const UserAgentTemplate = "Mozilla/5.0 (%s; %s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.3"
Variables ¶
var ( ErrFailedReadingProtocolSwitchResponse = errors.New("Failed reading protocol switch response.") ErrInvalidProtocolSwitchResponse = errors.New("Invalid protocol switch response.") ErrProtocolSwitchFailed = errors.New("Websocket protocol switch failed.") ErrServerCollision = errors.New("Address already in use. (server secret collision)") ErrPeerNotFound = errors.New("Connection refused. (no server listening with given secret)") ErrUpgradeRequired = errors.New("Protocol upgrade required!") HttpResponseRgx = regexp.MustCompile(`^HTTP/([0-9]|[0-9]\.[0-9]) ([0-9]{1,3}) [a-z A-Z]+`) WebsocketAcceptRgx = regexp.MustCompile(`Sec-WebSocket-Accept: ([A-Za-z0-9+/]+={0,2})`) )
var ( Version = "?" ErrUntrustedCert = errors.New("Certificate fingerprint mismatch!") ErrUninitializedSocket = errors.New("Socket not initiated,") ErrQSocketSessionEnd = errors.New("QSocket session has ended.") ErrUnexpectedSocket = errors.New("Unexpected socket type.") ErrInvalidIdTag = errors.New("Invalid peer ID tag.") ErrNoTlsConnection = errors.New("TLS socket is nil.") ErrSocketNotConnected = errors.New("Socket is not connected.") ErrSrpFailed = errors.New("SRP auth failed.") ErrSocketInUse = errors.New("Socket already dialed.") ErrInvalidCertFingerprint = errors.New("Invalid TLS certificate fingerprint.") // TOR_MODE = false )
Functions ¶
func BindSockets ¶
BindSockets is used for creating a full duplex channel between `con1` and `con2` sockets, effectively binding two sockets.
func CalcChecksum ¶
CalcChecksum calculates the modulus based checksum of the given data, modulus base is given in the base variable.
func CreateSocketChan ¶
chanFromConn creates a channel from a Conn object, and sends everything it
Read()s from the socket to the channel.
func GetDeviceUserAgent ¶
func GetDeviceUserAgent() string
func NewChecksumUri ¶
func NewChecksumUri(sType SocketType) string
func RandomString ¶
Types ¶
type QSocket ¶
type QSocket struct {
// contains filtered or unexported fields
}
A QSocket structure contains required values for performing a knock sequence with the QSRN gate.
`Secret` value can be considered as the password for the QSocket connection, It will be used for generating a 128bit unique identifier (UID) for the connection.
`*tag` values are used internally for QoS purposes. It specifies the operating system, architecture and the type of connection initiated by the peers, the relay server uses these values for optimizing the connection performance.
func NewSocket ¶
func NewSocket(sType SocketType, secret string) *QSocket
NewSocket creates a new QSocket structure with the given secret. `certVerify` value is used for enabling the certificate validation on TLS connections
func (*QSocket) Close ¶
func (qs *QSocket) Close()
Close closes the QSocket connection and underlying TCP/TLS connections.
func (*QSocket) Dial ¶
Dial creates a TLS connection to the `QSRN_GATE` on `QSRN_GATE_TLS_PORT`. Based on the `VerifyCert` parameter, certificate fingerprint validation (a.k.a. SSL pinning) will be performed after establishing the TLS connection.
func (*QSocket) DoWsProtocolSwitch ¶
SendKnockSequence sends a knock sequence to the QSRN gate with the socket properties.
func (*QSocket) InitClientSRP ¶
InitClientSRP performs the client SRP sequence for establishing PAKE.
func (*QSocket) InitE2ECipher ¶
InitE2ECipher initiates the end-to-end encrypted stream with the given key.
func (*QSocket) InitServerSRP ¶
InitServerSRP performs the server SRP sequence for establishing PAKE.
func (*QSocket) InitiateKnockSequence ¶
func (*QSocket) IsClient ¶
IsClient checks if the QSocket connection is initiated as a client or a server.
func (*QSocket) IsServer ¶
IsClient checks if the QSocket connection is initiated as a client or a server.
func (*QSocket) Read ¶
Read reads data from the connection.
As Read calls Handshake, in order to prevent indefinite blocking a deadline must be set for both Read and Write before Read is called when the handshake has not yet completed. See SetDeadline, SetReadDeadline, and SetWriteDeadline.
func (*QSocket) RemoteAddr ¶
RemoteAddr returns the remote network address.
func (*QSocket) SetCertFingerprint ¶
AddIdTag adds a peer identification tag to the QSocket.
func (*QSocket) SetReadDeadline ¶
SetReadDeadline sets the read deadline on the underlying connection. A zero value for t means Read will not time out.
func (*QSocket) SetWriteDeadline ¶
SetWriteDeadline sets the write deadline on the underlying connection. A zero value for t means Write will not time out. After a Write has timed out, the TLS state is corrupt and all future writes will return the same error. 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.
func (*QSocket) VerifyTlsCertificate ¶
type SocketType ¶
type SocketType byte
const ( // Tag ID for representing server mode connections. Server SocketType = iota // 00000000 => Server // Tag ID for representing client mode connections. Client )