ssh3

package module
v0.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 4, 2026 License: Apache-2.0 Imports: 31 Imported by: 0

README

SSHOQ: faster and rich secure shell using QUIC and HTTP/3

This repo is a fork of https://github.com/francoismichel/ssh3 as the original repo seems quite abandoned. A number of community PRs has been merged into this fork and light maintenance of this repo will resume going forward. Please still raise your issues in the original repo, but feel free to PR here.

The renaming to "SSHOQ" (SSH Over QUIC) which is a better, easily pronounceable name that specifies that this is different software to SSH, not a next version of SSH.

In a nutshell, SSHOQ uses QUIC+TLS1.3 for secure channel establishment and the HTTP Authorization mechanisms for user authentication.

Notable features:

  • Significantly faster session establishment than SSH
  • The server endpoint can be hidden (by a long URL path), meaning less bruteforce attacks
  • New HTTP authentication methods such as OAuth 2.0 and OpenID Connect in addition to classical SSH authentication
  • Invisible to port scanning attacks due to UDP
  • UDP port forwarding in addition to classical TCP port forwarding

SSHOQ implements the common password-based and public-key (RSA and EdDSA/ed25519) authentication methods. It also supports new authentication methods such as OAuth 2.0 and allows logging in to your servers using your Google/Microsoft/Github accounts.

Installing SSHOQ

You can either download the last release binaries, install it using go install or generate these binaries yourself by compiling the code from source.

Installing sshoq and sshoq-server using Go install
go install github.com/h4sh5/sshoq/cmd/...@latest
Running with Docker

The docker image is published to the Github Container Registry (GHCR) with github actions workflows. You can simply run the client and server like this:

client

docker run --rm -it ghcr.io/h4sh5/sshoq:main sshoq <args>

server

docker run --rm -it ghcr.io/h4sh5/sshoq:main sshoq-server <args>
Compiling SSHOQ from source

You need a recent Golang version to do this. Downloading the source code and compiling the binaries can be done with the following steps:

git clone https://github.com/h4sh5/sshoq
cd sshoq
make

You will find the built client and server binaries in bin/

Deploying an SSHOQ server

[!NOTE] SSHOQ can be run without root in single-user mode, but the server must be run with root priviledges to login as other users

[!NOTE] As SSHOQ runs on top of HTTP/3, a server needs an X.509 certificate and its corresponding private key. Public certificates can be generated automatically for your public domain name through Let's Encrypt using the -generate-public-cert command-line argument on the server. Alternatively you can generate a self-signed one using the -generate-selfsigned-cert command-line argument. Self-signed certificates provide you with similar security guarantees to SSHv2's host keys mechanism, with the same security issue of potential MITM attacks during your first connection.

The following command starts a public SSHOQ server on port 443 with a valid Let's Encrypt public certificate for domain my-domain.example.org and answers to new sessions requests querying the /secret-sshoq-server URL path:

sudo sshoq-server -generate-public-cert my-domain.example.org -url-path /secret-sshoq-server

If you don't have a public domain name (i.e. only an IP address), you can either use an existing certificate for your IP address using the -cert and -key arguments or generate a self-signed certificate using the -generate-selfsigned-cert argument.

If you have existing certificates and keys, you can run the server as follows to use them=

sudo sshoq-server -cert /path/to/cert/or/fullchain -key /path/to/cert/private/key -url-path /secret-sshoq-server

Deploy on a different address and port:

sshoq-server -bind 0.0.0.0:8443 -url-path /secret-sshoq-server

sshoq-server -bind 127.0.0.1:8443 -url-path /secret-sshoq-server

Deploying with docker compose

It's probably safer to deploy with docker compose for now. Use the docker-compose.yml provided.

Deploying with systemd

An example systemd file has been provided at sshoq.service - the command line arguments should be changed to fit your configuration, but overall it just works.

The sshoq-server binary should be copied to /usr/sbin/ for the example systemd configuration to work.

Copy the sshoq.service file to /etc/systemd/system/sshoq.service then run:

sudo systemctl enable sshoq
sudo systemctl start sshoq
sudo systemctl status sshoq

That should install the service and start it and show the status.

Authorized keys and authorized identities

By default, the SSHOQ server will look for identities in the ~/.ssh/authorized_keys and ~/.ssh3/authorized_identities files for each user. ~/.ssh3/authorized_identities allows new identities such as OpenID Connect (oidc) discussed below. Popular key types such as rsa, ed25519 and keys in the OpenSSH format can be used.

Using the SSHOQ client

Once you have an SSHOQ server running, you can connect to it using the SSHOQ client similarly to what you did with your classical SSHv2 tool.

Biggest difference is that the URL path has to match between the client and the server. This prevents bruteforcing attacks when attackers don't know what the url path is.

Private-key authentication

You can connect to your SSHOQ server at my-server.example.org listening on /my-secret-path using the private key located in ~/.ssh/id_rsa with the following command:

  sshoq -i ~/.ssh/id_rsa username@my-server.example.org/my-secret-path
Alternate port

Put the alternative port in the URL like so:

sshoq -i ~/.ssh/id_rsa username@my-server.example.org:8443/my-secret-path

Agent-based private key authentication

The SSHOQ client works with the OpenSSH agent and uses the classical SSH_AUTH_SOCK environment variable to communicate with this agent. Similarly to OpenSSH, SSHOQ will list the keys provided by the SSH agent and connect using the first key listen by the agent by default. If you want to specify a specific key to use with the agent, you can either specify the private key directly with the -i argument like above, or specify the corresponding public key using the -pubkey-for-agent argument. This allows you to authenticate in situations where only the agent has a direct access to the private key but you only have access to the public key.

Password-based authentication

While discouraged, you can connect to your server using passwords (if explicitly enabled on the sshoq-server) with the following command:

  sshoq -use-password username@my-server.example.org/my-secret-path
Config-based session establishment

sshoq parses your OpenSSH config. Currently, it only handles the Hostname; User, Port and IdentityFile OpenSSH options. It also adds new option only used by SSHOQ, such as URLPath or UDPProxyJump. URLPath allows you to omit the secret URL path in your SSHOQ command. UDPProxyJump allows you to perform SSHOQ (#proxy-jump)[Proxy Jump] and has the same meaning as the -proxy-jump command-line argument. Let's say you have the following lines in your OpenSSH config located in ~/.ssh/config :

IgnoreUnknown URLPath
Host my-server
  HostName 192.0.2.0
  User username
  IdentityFile ~/.ssh/id_rsa
  URLPath /my-secret-path

Similarly to what OpenSSH does, the following sshoq command will connect you to the SSHOQ server running on 192.0.2.0 on UDP port 443 using public key authentication with the private key located in .ssh/id_rsa :

  sshoq my-server/my-secret-path

If you do not want a config-based utilization of SSHOQ, you can read the sections below to see how to use the CLI parameters of sshoq.

OpenID Connect authentication (still experimental)

This feature allows you to connect using an external identity provider such as the one of your company or any other provider that implements the OpenID Connect standard, such as Google Identity, Github or Microsoft Entra. The authentication flow is illustrated in the GIF below.

Secure connection without private key using a Google account.

The way it connects to your identity provider is configured in a file named ~/.ssh3/oidc_config.json. Below is an example config.json file for use with a Google account. This configuration file is an array and can contain several identity providers configurations.

[
    {
        "issuer_url": "https://accounts.google.com",
        "client_id": "<your_client_id>",
        "client_secret": "<your_client_secret>"
    }
]

This might change in the future, but currently, to make this feature work with your Google account, you will need to setup a new experimental application in your Google Cloud console and add your email as authorized users. This will provide you with a client_id and a client_secret that you can then set in your ~/.ssh3/oidc_config.json. On the server side, you just have to add the following line in your ~/.ssh3/authorized_identities:

oidc <client_id> https://accounts.google.com <email>

We currently consider removing the need of setting the client_id in the authorized_identities file in the future.

Proxy jump

It is often the case that some SSH hosts can only be accessed through a gateway. SSHOQ allows you to perform a Proxy Jump similarly to what is proposed by OpenSSH. You can connect from A to C using B as a gateway/proxy. B and C must both be running a valid SSHOQ server. This works by establishing UDP port forwarding on B to forward QUIC packets from A to C. The connection from A to C is therefore fully end-to-end and B cannot decrypt or alter the SSHOQ traffic between A and C.

Example syntax where gateway is the jump host and 10.0.0.2 is the final destination:

sshoq -i ~/.ssh/id_rsa -proxy-jump user@gateway:443/sshoq-server root@10.0.0.2:4433/secret

File Sharing

For the time being there's no plan for sftp or scp client or server implementations for this project.

However, file sharing can be done by forwarding the existing sftp-server (part of OpenSSH) on an existing system over TCP port forwarding.

For example, this is how you can use it with SSHFS:

File Sharing with SSHFS

open a session with tcp local port forwarding (1234 to 1234)

sshoq -forward-tcp 1234@127.0.0.1@1234  -i ~/.ssh/id_rsa -insecure user@192.168.1.2/ssh3-term

Then open a sftp-server listener over a localhost port inside sshoq session (openssh must be installed for the sftp-server binary to be available, and for the network server use ncat or socat):

# ncat
ncat -nkvl 127.0.0.1 1234 -e /usr/lib/openssh/sftp-server
# or socat
socat TCP-LISTEN:1234,reuseaddr,fork,bind=127.0.0.1 EXEC:/usr/lib/openssh/sftp-server

(the sftp-server binary may be in different locations depending on your distro, try find /usr | grep sftp-server since its usually not on the $PATH)

Finally, use sshfs (>= 3.7.5) to open mount a directory using the directport option

sshfs -o directport=1234 127.0.0.1:/home/ /tmp/mnt

The performance gains on a local network isn't great; testing on local network shows using sshfs with regular ssh can be faster than sshoq. However over the internet may be a different story.

Even if there're no performance gains, this does enable a method of bulk file transfer over sshoq since there's no builtin sshoq sftp command.

Local port forwarding

As a SSH compatibility shortcut, -L is the same as -forward-tcp

Suppose you have a HTTP server on localhost port 3000 on the remote host, and wants to forward that locally to port 8080 so that you can access it via your browser. Do this with:

sshoq -forward-tcp 8080@127.0.0.1@3000 user@example.com/secret-path

Similarly, to forward a UDP port (5353) from the remote host to local port 8053, but via IPv6 (::1, no [] brackets needed)

sshoq -forward-udp 8053@::1@5353 user@example.com/secret-path

If you want to forward a local network port from the internal network of the target host (like a router interface), try this:

sshoq -forward-tcp 8080@192.168.1.1@80 user@example.com/secret-path

Reverse port forwarding

As a SSH compatibility shortcut, -R is the same as -reverse-tcp

You can also now perform reverse port forwading to forward a port from localhost to the remote host.

For example, if you want to forward localhost port 3000 to the remote host on port 8080, do this:

sshoq -reverse-tcp 8080@127.0.0.1@3000 user@example.com/secret-path

Similarly for UDP:

sshoq -reverse-udp 8080@127.0.0.1@3000 user@example.com/secret-path

Warning: Reverse UDP port forwarding is not well tested and may not be working fully.

SSHOQ is still experimental

While SSHOQ shows promise for faster session establishment, it is still at an early proof-of-concept stage. As with any new complex protocol, expert cryptographic review over an extended timeframe is required before reasonable security conclusions can be made.

We are developing SSHOQ as an open source project to facilitate community feedback and analysis. However, we cannot yet endorse its appropriateness for production systems without further peer review. Please collaborate with us if you have relevant expertise!

Documentation

Index

Constants

View Source
const PROTOCOL_EXPERIMENTAL_SPEC_VERSION string = "alpha-00"
View Source
const PROTOCOL_MAJOR int = 3

EXPERIMENTAL_SPEC_VERSION specifies which version of the protocol this software is implementing. The protocol version string format is:

major + "." + minor[ + "_" + additional-version-information].

It currently implements a first early version with no specification (alpha). Once IETF drafts get published, we plan on having versions such as 3.0_draft-michel-ssh3-XX when implementing the IETF specification from draft-michel-ssh3-XX.

View Source
const PROTOCOL_MINOR int = 0
View Source
const SOFTWARE_IMPLEMENTATION_NAME string = "h4sh5/sshoq"
View Source
const SOFTWARE_MAJOR int = 0
View Source
const SOFTWARE_MINOR int = 2
View Source
const SOFTWARE_PATCH int = 1
View Source
const SOFTWARE_RC int = 0
View Source
const SSH_FRAME_TYPE = 0xaf3627e6

Variables

Functions

func AppendKnownHost

func AppendKnownHost(filename string, host string, cert *x509.Certificate) error

func BuildJWTBearerToken

func BuildJWTBearerToken(signingMethod jwt.SigningMethod, key interface{}, username string, conversation *Conversation) (string, error)

func GetConfigForHost

func GetConfigForHost(host string, config *ssh_config.Config, pluginsOptionsParsers map[client_config.OptionName]client_config.OptionParser) (hostname string, port int, user string, urlPath string, authMethodsToTry []interface{}, pluginOptions map[client_config.OptionName]client_config.Option, err error)

func GetCurrentSoftwareVersion

func GetCurrentSoftwareVersion() string

GetCurrentSoftwareVersion() returns the current software version to be displayed to the user For version string to be communicated between endpoints, use GetCurrentVersionString() instead.

func GetCurrentVersionString

func GetCurrentVersionString() string

GetCurrentVersionString() returns the version string to be exchanged between two endpoints for version negotiation

func IsVersionSupported

func IsVersionSupported(other Version) bool

Tells if the this version (a.k.a. the version returned by ThisVersion()) is compatible with `other`.

Types

type AgentAuthMethod

type AgentAuthMethod struct {
	// contains filtered or unexported fields
}

func NewAgentAuthMethod

func NewAgentAuthMethod(pubkey ssh.PublicKey) *AgentAuthMethod

func (*AgentAuthMethod) IntoIdentity

func (m *AgentAuthMethod) IntoIdentity(agent agent.ExtendedAgent) Identity

A prerequisite of calling this methiod is that the provided pubkey is explicitly listed by the agent This can be verified beforehand by calling agent.List()

type AuthenticatedHandlerFunc

type AuthenticatedHandlerFunc func(authenticatedUserName string, newConv *Conversation, w http.ResponseWriter, r *http.Request)

type Channel

type Channel interface {
	ChannelID() util.ChannelID
	ConversationID() ConversationID
	ConversationStreamID() uint64
	NextMessage() (ssh3.Message, error)
	ReceiveDatagram(ctx context.Context) ([]byte, error)
	SendDatagram(datagram []byte) error
	SendRequest(r *ssh3.ChannelRequestMessage) error
	CancelRead()
	Close()
	MaxPacketSize() uint64
	WriteData(dataBuf []byte, dataType ssh3.SSHDataType) (int, error)
	ChannelType() string
	// contains filtered or unexported methods
}

func NewChannel

func NewChannel(conversationStreamID uint64, conversationID ConversationID, channelID uint64, channelType string, maxPacketSize uint64, recv quic.ReceiveStream,
	send io.WriteCloser, datagramSender util.SSH3DatagramSenderFunc, channelCloseListener channelCloseListener, sendHeader bool, confirmSent bool,
	confirmReceived bool, datagramsQueueSize uint64, additonalHeaderBytes []byte) Channel

type ChannelDataHandler

type ChannelDataHandler func(channel Channel, dataType ssh3.SSHDataType, data string)

type ChannelInfo

type ChannelInfo struct {
	MaxPacketSize        uint64
	ConversationStreamID uint64
	ConversationID       ConversationID
	ChannelID            uint64
	ChannelType          string
}

type ChannelOpenFailure

type ChannelOpenFailure struct {
	ReasonCode uint64
	ErrorMsg   string
}

func (ChannelOpenFailure) Error

func (e ChannelOpenFailure) Error() string

type ControlStreamID

type ControlStreamID = uint64

type Conversation

type Conversation struct {
	// contains filtered or unexported fields
}

func NewClientConversation

func NewClientConversation(maxPacketsize uint64, defaultDatagramsQueueSize uint64, tls *tls.ConnectionState) (*Conversation, error)

func NewServerConversation

func NewServerConversation(ctx context.Context, controlStream http3.Stream, qconn quic.Connection, messageSender util.DatagramSender, maxPacketsize uint64, peerVersion Version) (*Conversation, error)

func (*Conversation) AcceptChannel

func (c *Conversation) AcceptChannel(ctx context.Context) (Channel, error)

func (*Conversation) AddDatagram

func (c *Conversation) AddDatagram(ctx context.Context, datagram []byte) error

blocks until the datagram is added the first field must be the channel ID

func (*Conversation) Close

func (c *Conversation) Close()

func (*Conversation) Context

func (c *Conversation) Context() context.Context

func (*Conversation) ConversationID

func (c *Conversation) ConversationID() ConversationID

func (*Conversation) EstablishClientConversation

func (c *Conversation) EstablishClientConversation(req *http.Request, roundTripper *http3.RoundTripper, supportedVersions []Version) error

func (*Conversation) OpenChannel

func (c *Conversation) OpenChannel(channelType string, maxPacketSize uint64, datagramsQueueSize uint64) (Channel, error)

func (*Conversation) OpenTCPForwardingChannel

func (c *Conversation) OpenTCPForwardingChannel(maxPacketSize uint64, datagramsQueueSize uint64, localAddr *net.TCPAddr, remoteAddr *net.TCPAddr) (Channel, error)

func (*Conversation) OpenTCPReverseForwardingChannel

func (c *Conversation) OpenTCPReverseForwardingChannel(maxPacketSize uint64, datagramsQueueSize uint64, remoteAddr *net.TCPAddr) (Channel, error)

func (*Conversation) OpenUDPForwardingChannel

func (c *Conversation) OpenUDPForwardingChannel(maxPacketSize uint64, datagramsQueueSize uint64, localAddr *net.UDPAddr, remoteAddr *net.UDPAddr) (Channel, error)

func (*Conversation) OpenUDPReverseForwardingChannel

func (c *Conversation) OpenUDPReverseForwardingChannel(maxPacketSize uint64, datagramsQueueSize uint64, localAddr *net.UDPAddr, remoteAddr *net.UDPAddr) (Channel, error)

func (*Conversation) RequestTCPReverseChannel

func (c *Conversation) RequestTCPReverseChannel(maxPacketSize uint64, datagramsQueueSize uint64, localAddr *net.TCPAddr, remoteAddr *net.TCPAddr) (Channel, error)

func (*Conversation) RequestUDPReverseChannel

func (c *Conversation) RequestUDPReverseChannel(maxPacketSize uint64, datagramsQueueSize uint64, localAddr *net.UDPAddr, remoteAddr *net.UDPAddr) (Channel, error)

type ConversationID

type ConversationID [32]byte

func GenerateConversationID

func GenerateConversationID(tls *tls.ConnectionState) (convID ConversationID, err error)

func (ConversationID) String

func (cid ConversationID) String() string

type ExecReqHandler

type ExecReqHandler func(channel Channel, request ssh3.ExecRequest, wantReply bool)

type ExitSignalReqHandler

type ExitSignalReqHandler func(channel Channel, request ssh3.ExitSignalRequest, wantReply bool)

type ExitStatusReqHandler

type ExitStatusReqHandler func(channel Channel, request ssh3.ExitStatusRequest, wantReply bool)

type Identity

type Identity interface {
	SetAuthorizationHeader(req *http.Request, username string, conversation *Conversation) error
	// provides an authentication name that can be used as a hint for the server in the url query params
	AuthHint() string
	fmt.Stringer
}

a generic way to generate SSH3 identities to populate the HTTP Authorization header

type InvalidKnownHost

type InvalidKnownHost struct {
	// contains filtered or unexported fields
}

func (InvalidKnownHost) Error

func (e InvalidKnownHost) Error() string

type InvalidProtocolVersion

type InvalidProtocolVersion struct {
	// contains filtered or unexported fields
}

func (InvalidProtocolVersion) Error

func (e InvalidProtocolVersion) Error() string

type InvalidSSHVersion

type InvalidSSHVersion struct {
	// contains filtered or unexported fields
}

func (InvalidSSHVersion) Error

func (e InvalidSSHVersion) Error() string

type InvalidSoftwareVersion

type InvalidSoftwareVersion struct {
	// contains filtered or unexported fields
}

func (InvalidSoftwareVersion) Error

func (e InvalidSoftwareVersion) Error() string

type KnownHosts

type KnownHosts map[string][]*x509.Certificate

func ParseKnownHosts

func ParseKnownHosts(filename string) (knownHosts KnownHosts, invalidLines []int, err error)

func (KnownHosts) Knows

func (kh KnownHosts) Knows(hostname string) bool

type MessageOnNonConfirmedChannel

type MessageOnNonConfirmedChannel struct {
	// contains filtered or unexported fields
}

func (MessageOnNonConfirmedChannel) Error

type OidcAuthMethod

type OidcAuthMethod struct {
	// contains filtered or unexported fields
}

func NewOidcAuthMethod

func NewOidcAuthMethod(doPKCE bool, config *oidc.OIDCConfig) *OidcAuthMethod

func (*OidcAuthMethod) DoPKCE

func (m *OidcAuthMethod) DoPKCE() bool

func (*OidcAuthMethod) IntoIdentity

func (m *OidcAuthMethod) IntoIdentity(bearerToken string) Identity

func (*OidcAuthMethod) OIDCConfig

func (m *OidcAuthMethod) OIDCConfig() *oidc.OIDCConfig

type PasswordAuthMethod

type PasswordAuthMethod struct{}

func NewPasswordAuthMethod

func NewPasswordAuthMethod() *PasswordAuthMethod

func (*PasswordAuthMethod) IntoIdentity

func (m *PasswordAuthMethod) IntoIdentity(password string) Identity

type PrivkeyFileAuthMethod

type PrivkeyFileAuthMethod struct {
	// contains filtered or unexported fields
}

func NewPrivkeyFileAuthMethod

func NewPrivkeyFileAuthMethod(filename string) *PrivkeyFileAuthMethod

func (*PrivkeyFileAuthMethod) Filename

func (m *PrivkeyFileAuthMethod) Filename() string

func (*PrivkeyFileAuthMethod) IntoIdentityPassphrase

func (m *PrivkeyFileAuthMethod) IntoIdentityPassphrase(passphrase string) (Identity, error)

IntoIdentityPassphrase returns a passphrase-protected private key stored on the provided path. It supports the same keys as ssh.ParsePrivateKey If the passphrase is wrong, it returns an x509.IncorrectPasswordError.

func (*PrivkeyFileAuthMethod) IntoIdentityWithoutPassphrase

func (m *PrivkeyFileAuthMethod) IntoIdentityWithoutPassphrase() (Identity, error)

IntoIdentityWithoutPassphrase returns an SSH3 identity stored on the provided path. It supports the same keys as ssh.ParsePrivateKey If the private key is encrypted, it returns an ssh.PassphraseMissingError.

type ProtocolVersion

type ProtocolVersion struct {
	Major                   int
	Minor                   int
	ExperimentalSpecVersion string
}

func NewProtocolVersion

func NewProtocolVersion(major int, minor int, experimentalspecversion string) ProtocolVersion

func ParseProtocolVersion

func ParseProtocolVersion(versionString string) (ProtocolVersion, error)

func (ProtocolVersion) String

func (v ProtocolVersion) String() string

type PtyReqHandler

type PtyReqHandler func(channel Channel, request ssh3.PtyRequest, wantReply bool)

type ReceivedDatagramOnNonDatagramChannel

type ReceivedDatagramOnNonDatagramChannel struct {
	// contains filtered or unexported fields
}

func (ReceivedDatagramOnNonDatagramChannel) Error

type SentDatagramOnNonDatagramChannel

type SentDatagramOnNonDatagramChannel struct {
	// contains filtered or unexported fields
}

func (SentDatagramOnNonDatagramChannel) Error

type Server

type Server struct {
	// contains filtered or unexported fields
}

func NewServer

func NewServer(maxPacketSize uint64, defaultDatagramQueueSize uint64, h3Server *http3.Server, conversationHandler ServerConversationHandler) *Server

func (*Server) GetHTTPHandlerFunc

func (s *Server) GetHTTPHandlerFunc(ctx context.Context) AuthenticatedHandlerFunc

type ServerConversationHandler

type ServerConversationHandler func(authenticatedUsername string, conversation *Conversation) error

type ShellReqHandler

type ShellReqHandler func(channel Channel, request ssh3.ShellRequest, wantReply bool)

type SignalReqHandler

type SignalReqHandler func(channel Channel, request ssh3.SignalRequest, wantReply bool)

type SoftwareVersion

type SoftwareVersion struct {
	ImplementationName string
	Major              int
	Minor              int
	Patch              int
}

func NewSoftwareVersion

func NewSoftwareVersion(major int, minor int, patch int, implementationName string) SoftwareVersion

func ParseSoftwareVersion

func ParseSoftwareVersion(implementationName string, versionString string) (SoftwareVersion, error)

func (SoftwareVersion) String

func (v SoftwareVersion) String() string

type StreamByteReader

type StreamByteReader struct {
	http3.Stream
}

func (*StreamByteReader) ReadByte

func (r *StreamByteReader) ReadByte() (byte, error)

type SubsystemReqHandler

type SubsystemReqHandler func(channel Channel, request ssh3.SubsystemRequest, wantReply bool)

type TCPForwardingChannelImpl

type TCPForwardingChannelImpl struct {
	RemoteAddr *net.TCPAddr
	Channel
}

type TCPOpenReverseForwardingChannelImpl

type TCPOpenReverseForwardingChannelImpl struct {
	RemoteAddr *net.TCPAddr
	Channel
}

type TCPReverseForwardingChannelImpl

type TCPReverseForwardingChannelImpl struct {
	RemoteAddr *net.TCPAddr
	LocalAddr  *net.TCPAddr
	Channel
}

type UDPForwardingChannelImpl

type UDPForwardingChannelImpl struct {
	RemoteAddr *net.UDPAddr
	LocalAddr  *net.UDPAddr
	Channel
}

type UDPOpenReverseForwardingChannelImpl

type UDPOpenReverseForwardingChannelImpl struct {
	RemoteAddr *net.UDPAddr
	LocalAddr  *net.UDPAddr
	Channel
}

type UDPReverseForwardingChannelImpl

type UDPReverseForwardingChannelImpl struct {
	RemoteAddr *net.UDPAddr
	LocalAddr  *net.UDPAddr
	Channel
}

type UnauthenticatedBearerFunc

type UnauthenticatedBearerFunc func(unauthenticatedBearerString string, base64ConversationID string, w http.ResponseWriter, r *http.Request)

type UnsupportedSSHVersion

type UnsupportedSSHVersion struct {
	// contains filtered or unexported fields
}

func (UnsupportedSSHVersion) Error

func (e UnsupportedSSHVersion) Error() string

type Version

type Version struct {
	// contains filtered or unexported fields
}

func NewVersion

func NewVersion(protocolName string, protocolVersion ProtocolVersion, softwareVersion SoftwareVersion) Version

func ParseVersionString

func ParseVersionString(versionString string) (version Version, err error)

func ThisVersion

func ThisVersion() Version

func (Version) GetProtocolVersion

func (v Version) GetProtocolVersion() ProtocolVersion

func (Version) GetSoftwareVersion

func (v Version) GetSoftwareVersion() SoftwareVersion

func (Version) GetVersionString

func (v Version) GetVersionString() string

GetVersionString() returns the version string to be exchanged between two endpoints for version negotiation

type WindowChangeReqHandler

type WindowChangeReqHandler func(channel Channel, request ssh3.WindowChangeRequest, wantReply bool)

type X11ReqHandler

type X11ReqHandler func(channel Channel, request ssh3.X11Request, wantReply bool)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL