Source File
messages.go
Belonging Package
golang.org/x/crypto/ssh
package ssh
import (
)
const (
msgIgnore = 2
msgUnimplemented = 3
msgDebug = 4
msgNewKeys = 21
)
const msgDisconnect = 1
const msgKexInit = 20
type kexInitMsg struct {
Cookie [16]byte `sshtype:"20"`
KexAlgos []string
ServerHostKeyAlgos []string
CiphersClientServer []string
CiphersServerClient []string
MACsClientServer []string
MACsServerClient []string
CompressionClientServer []string
CompressionServerClient []string
LanguagesClientServer []string
LanguagesServerClient []string
FirstKexFollows bool
Reserved uint32
}
const msgKexDHInit = 30
type kexDHInitMsg struct {
X *big.Int `sshtype:"30"`
}
const msgKexECDHInit = 30
type kexECDHInitMsg struct {
ClientPubKey []byte `sshtype:"30"`
}
const msgKexECDHReply = 31
type kexECDHReplyMsg struct {
HostKey []byte `sshtype:"31"`
EphemeralPubKey []byte
Signature []byte
}
const msgKexDHReply = 31
type kexDHReplyMsg struct {
HostKey []byte `sshtype:"31"`
Y *big.Int
Signature []byte
}
const msgKexDHGexGroup = 31
type kexDHGexGroupMsg struct {
P *big.Int `sshtype:"31"`
G *big.Int
}
const msgKexDHGexInit = 32
type kexDHGexInitMsg struct {
X *big.Int `sshtype:"32"`
}
const msgKexDHGexReply = 33
type kexDHGexReplyMsg struct {
HostKey []byte `sshtype:"33"`
Y *big.Int
Signature []byte
}
const msgKexDHGexRequest = 34
type kexDHGexRequestMsg struct {
MinBits uint32 `sshtype:"34"`
PreferedBits uint32
MaxBits uint32
}
const msgServiceRequest = 5
type serviceRequestMsg struct {
Service string `sshtype:"5"`
}
const msgServiceAccept = 6
type serviceAcceptMsg struct {
Service string `sshtype:"6"`
}
const msgUserAuthRequest = 50
type userAuthRequestMsg struct {
User string `sshtype:"50"`
Service string
Method string
Payload []byte `ssh:"rest"`
}
type userAuthSuccessMsg struct {
}
const msgUserAuthFailure = 51
type userAuthFailureMsg struct {
Methods []string `sshtype:"51"`
PartialSuccess bool
}
const msgUserAuthSuccess = 52
const msgUserAuthBanner = 53
type userAuthBannerMsg struct {
const msgUserAuthInfoRequest = 60
const msgUserAuthInfoResponse = 61
type userAuthInfoRequestMsg struct {
User string `sshtype:"60"`
Instruction string
DeprecatedLanguage string
NumPrompts uint32
Prompts []byte `ssh:"rest"`
}
const msgChannelOpen = 90
type channelOpenMsg struct {
ChanType string `sshtype:"90"`
PeersID uint32
PeersWindow uint32
MaxPacketSize uint32
TypeSpecificData []byte `ssh:"rest"`
}
const msgChannelExtendedData = 95
const msgChannelData = 94
const msgChannelOpenConfirm = 91
type channelOpenConfirmMsg struct {
PeersID uint32 `sshtype:"91"`
MyID uint32
MyWindow uint32
MaxPacketSize uint32
TypeSpecificData []byte `ssh:"rest"`
}
const msgChannelOpenFailure = 92
type channelOpenFailureMsg struct {
PeersID uint32 `sshtype:"92"`
Reason RejectionReason
Message string
Language string
}
const msgChannelRequest = 98
type channelRequestMsg struct {
PeersID uint32 `sshtype:"98"`
Request string
WantReply bool
RequestSpecificData []byte `ssh:"rest"`
}
const msgChannelSuccess = 99
type channelRequestSuccessMsg struct {
PeersID uint32 `sshtype:"99"`
}
const msgChannelFailure = 100
type channelRequestFailureMsg struct {
PeersID uint32 `sshtype:"100"`
}
const msgChannelClose = 97
type channelCloseMsg struct {
PeersID uint32 `sshtype:"97"`
}
const msgChannelEOF = 96
type channelEOFMsg struct {
PeersID uint32 `sshtype:"96"`
}
const msgGlobalRequest = 80
type globalRequestMsg struct {
Type string `sshtype:"80"`
WantReply bool
Data []byte `ssh:"rest"`
}
const msgRequestSuccess = 81
type globalRequestSuccessMsg struct {
Data []byte `ssh:"rest" sshtype:"81"`
}
const msgRequestFailure = 82
type globalRequestFailureMsg struct {
Data []byte `ssh:"rest" sshtype:"82"`
}
const msgChannelWindowAdjust = 93
type windowAdjustMsg struct {
PeersID uint32 `sshtype:"93"`
AdditionalBytes uint32
}
const msgUserAuthPubKeyOk = 60
type userAuthPubKeyOkMsg struct {
Algo string `sshtype:"60"`
PubKey []byte
}
const msgUserAuthGSSAPIResponse = 60
type userAuthGSSAPIResponse struct {
SupportMech []byte `sshtype:"60"`
}
const msgUserAuthGSSAPIToken = 61
type userAuthGSSAPIToken struct {
Token []byte `sshtype:"61"`
}
const msgUserAuthGSSAPIMIC = 66
type userAuthGSSAPIMIC struct {
MIC []byte `sshtype:"66"`
}
const msgUserAuthGSSAPIErrTok = 64
type userAuthGSSAPIErrTok struct {
ErrorToken []byte `sshtype:"64"`
}
const msgUserAuthGSSAPIError = 65
type userAuthGSSAPIError struct {
MajorStatus uint32 `sshtype:"65"`
MinorStatus uint32
Message string
LanguageTag string
}
func ( reflect.Type) ( []byte) {
:= .Field(0).Tag.Get("sshtype")
for , := range strings.Split(, "|") {
, := strconv.Atoi()
if == nil {
= append(, byte())
}
}
return
}
func ( reflect.Type, int, string) error {
if != "" {
= ": " +
}
return fmt.Errorf("ssh: unmarshal error for field %s of type %s%s", .Field().Name, .Name(), )
}
var errShortRead = errors.New("ssh: short read")
func ( []byte, interface{}) error {
:= reflect.ValueOf().Elem()
:= .Type()
:= typeTags()
var byte
if len() > 0 {
= [0]
}
if len() == 0 {
return parseError()
}
if len() > 0 {
:= false
for , := range {
if > 0 && [0] == {
= true
break
}
}
if ! {
return fmt.Errorf("ssh: unexpected message type %d (expected one of %v)", [0], )
}
= [1:]
}
var bool
for := 0; < .NumField(); ++ {
:= .Field()
:= .Type()
switch .Kind() {
case reflect.Bool:
if len() < 1 {
return errShortRead
}
.SetBool([0] != 0)
= [1:]
case reflect.Array:
if .Elem().Kind() != reflect.Uint8 {
return fieldError(, , "array of unsupported type")
}
if len() < .Len() {
return errShortRead
}
for , := 0, .Len(); < ; ++ {
.Index().Set(reflect.ValueOf([]))
}
= [.Len():]
case reflect.Uint64:
var uint64
if , , = parseUint64(); ! {
return errShortRead
}
.SetUint()
case reflect.Uint32:
var uint32
if , , = parseUint32(); ! {
return errShortRead
}
.SetUint(uint64())
case reflect.Uint8:
if len() < 1 {
return errShortRead
}
.SetUint(uint64([0]))
= [1:]
case reflect.String:
var []byte
if , , = parseString(); ! {
return fieldError(, , "")
}
.SetString(string())
case reflect.Slice:
switch .Elem().Kind() {
case reflect.Uint8:
if .Field().Tag.Get("ssh") == "rest" {
.Set(reflect.ValueOf())
= nil
} else {
var []byte
if , , = parseString(); ! {
return errShortRead
}
.Set(reflect.ValueOf())
}
case reflect.String:
var []string
if , , = parseNameList(); ! {
return errShortRead
}
.Set(reflect.ValueOf())
default:
return fieldError(, , "slice of unsupported type")
}
case reflect.Ptr:
if == bigIntType {
var *big.Int
if , , = parseInt(); ! {
return errShortRead
}
.Set(reflect.ValueOf())
} else {
return fieldError(, , "pointer to unsupported type")
}
default:
return fieldError(, , fmt.Sprintf("unsupported type: %v", ))
}
}
if len() != 0 {
return parseError()
}
return nil
}
func ( interface{}) []byte {
:= make([]byte, 0, 64)
return marshalStruct(, )
}
func ( []byte, interface{}) []byte {
:= reflect.Indirect(reflect.ValueOf())
:= typeTags(.Type())
if len() > 0 {
= append(, [0])
}
for , := 0, .NumField(); < ; ++ {
:= .Field()
switch := .Type(); .Kind() {
case reflect.Bool:
var uint8
if .Bool() {
= 1
}
= append(, )
case reflect.Array:
if .Elem().Kind() != reflect.Uint8 {
panic(fmt.Sprintf("array of non-uint8 in field %d: %T", , .Interface()))
}
for , := 0, .Len(); < ; ++ {
= append(, uint8(.Index().Uint()))
}
case reflect.Uint32:
= appendU32(, uint32(.Uint()))
case reflect.Uint64:
= appendU64(, uint64(.Uint()))
case reflect.Uint8:
= append(, uint8(.Uint()))
case reflect.String:
:= .String()
= appendInt(, len())
= append(, ...)
case reflect.Slice:
switch .Elem().Kind() {
case reflect.Uint8:
if .Type().Field().Tag.Get("ssh") != "rest" {
= appendInt(, .Len())
}
= append(, .Bytes()...)
case reflect.String:
:= len()
= appendU32(, 0)
if := .Len(); > 0 {
for := 0; < ; ++ {
:= .Index()
if != 0 {
= append(, ',')
}
= append(, .String()...)
binary.BigEndian.PutUint32([:], uint32(len()--4))
}
default:
panic(fmt.Sprintf("slice of unknown type in field %d: %T", , .Interface()))
}
case reflect.Ptr:
if == bigIntType {
var *big.Int
:= reflect.ValueOf(&)
.Elem().Set()
:= intLength()
:= len()
if cap()-len() < {
:= make([]byte, len(), 2*(len()+))
copy(, )
=
}
= [:+]
marshalInt([:], )
} else {
panic(fmt.Sprintf("pointer to unknown type in field %d: %T", , .Interface()))
}
}
}
return
}
var bigOne = big.NewInt(1)
func ( []byte) (, []byte, bool) {
if len() < 4 {
return
}
:= binary.BigEndian.Uint32()
= [4:]
if uint32(len()) < {
return
}
= [:]
= [:]
= true
return
}
var (
comma = []byte{','}
emptyNameList = []string{}
)
func ( []byte) ( []string, []byte, bool) {
, , := parseString()
if ! {
return
}
if len() == 0 {
= emptyNameList
return
}
:= bytes.Split(, comma)
= make([]string, len())
for , := range {
[] = string()
}
return
}
func ( []byte) ( *big.Int, []byte, bool) {
, , := parseString()
if ! {
return
}
= new(big.Int)
.SetBytes()
}
= true
return
}
func ( []byte) (uint32, []byte, bool) {
if len() < 4 {
return 0, nil, false
}
return binary.BigEndian.Uint32(), [4:], true
}
func ( []byte) (uint64, []byte, bool) {
if len() < 8 {
return 0, nil, false
}
return binary.BigEndian.Uint64(), [8:], true
}
func ( *big.Int) int {
:= 4 /* length bytes */
if .Sign() < 0 {
:= new(big.Int).Neg()
.Sub(, bigOne)
:= .BitLen()
++
}
+= ( + 7) / 8
} else {
:= .BitLen()
} else {
:= .Bytes()
[0] = 0
= [1:]
++
}
:= copy(, )
= [:]
+=
}
[0] = byte( >> 24)
[1] = byte( >> 16)
[2] = byte( >> 8)
[3] = byte()
return
}
func ( io.Writer, *big.Int) {
:= intLength()
:= make([]byte, )
marshalInt(, )
.Write()
}
func ( io.Writer, []byte) {
var [4]byte
[0] = byte(len() >> 24)
[1] = byte(len() >> 16)
[2] = byte(len() >> 8)
[3] = byte(len())
.Write([:])
.Write()
}
func ( int) int {
return 4 +
}
func ( []byte, []byte) []byte {
[0] = byte(len() >> 24)
[1] = byte(len() >> 16)
[2] = byte(len() >> 8)
[3] = byte(len())
= [4:]
copy(, )
return [len():]
}
var bigIntType = reflect.TypeOf((*big.Int)(nil))
func ( []byte) (interface{}, error) {
var interface{}
switch [0] {
case msgDisconnect:
= new(disconnectMsg)
case msgServiceRequest:
= new(serviceRequestMsg)
case msgServiceAccept:
= new(serviceAcceptMsg)
case msgKexInit:
= new(kexInitMsg)
case msgKexDHInit:
= new(kexDHInitMsg)
case msgKexDHReply:
= new(kexDHReplyMsg)
case msgUserAuthRequest:
= new(userAuthRequestMsg)
case msgUserAuthSuccess:
return new(userAuthSuccessMsg), nil
case msgUserAuthFailure:
= new(userAuthFailureMsg)
case msgUserAuthPubKeyOk:
= new(userAuthPubKeyOkMsg)
case msgGlobalRequest:
= new(globalRequestMsg)
case msgRequestSuccess:
= new(globalRequestSuccessMsg)
case msgRequestFailure:
= new(globalRequestFailureMsg)
case msgChannelOpen:
= new(channelOpenMsg)
case msgChannelData:
= new(channelDataMsg)
case msgChannelOpenConfirm:
= new(channelOpenConfirmMsg)
case msgChannelOpenFailure:
= new(channelOpenFailureMsg)
case msgChannelWindowAdjust:
= new(windowAdjustMsg)
case msgChannelEOF:
= new(channelEOFMsg)
case msgChannelClose:
= new(channelCloseMsg)
case msgChannelRequest:
= new(channelRequestMsg)
case msgChannelSuccess:
= new(channelRequestSuccessMsg)
case msgChannelFailure:
= new(channelRequestFailureMsg)
case msgUserAuthGSSAPIToken:
= new(userAuthGSSAPIToken)
case msgUserAuthGSSAPIMIC:
= new(userAuthGSSAPIMIC)
case msgUserAuthGSSAPIErrTok:
= new(userAuthGSSAPIErrTok)
case msgUserAuthGSSAPIError:
= new(userAuthGSSAPIError)
default:
return nil, unexpectedMessageError(0, [0])
}
if := Unmarshal(, ); != nil {
return nil,
}
return , nil
}
var packetTypeNames = map[byte]string{
msgDisconnect: "disconnectMsg",
msgServiceRequest: "serviceRequestMsg",
msgServiceAccept: "serviceAcceptMsg",
msgKexInit: "kexInitMsg",
msgKexDHInit: "kexDHInitMsg",
msgKexDHReply: "kexDHReplyMsg",
msgUserAuthRequest: "userAuthRequestMsg",
msgUserAuthSuccess: "userAuthSuccessMsg",
msgUserAuthFailure: "userAuthFailureMsg",
msgUserAuthPubKeyOk: "userAuthPubKeyOkMsg",
msgGlobalRequest: "globalRequestMsg",
msgRequestSuccess: "globalRequestSuccessMsg",
msgRequestFailure: "globalRequestFailureMsg",
msgChannelOpen: "channelOpenMsg",
msgChannelData: "channelDataMsg",
msgChannelOpenConfirm: "channelOpenConfirmMsg",
msgChannelOpenFailure: "channelOpenFailureMsg",
msgChannelWindowAdjust: "windowAdjustMsg",
msgChannelEOF: "channelEOFMsg",
msgChannelClose: "channelCloseMsg",
msgChannelRequest: "channelRequestMsg",
msgChannelSuccess: "channelRequestSuccessMsg",
msgChannelFailure: "channelRequestFailureMsg",
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |