Source File
transport.go
Belonging Package
golang.org/x/crypto/ssh
package ssh
import (
)
const debugTransport = false
const (
gcmCipherID = "aes128-gcm@openssh.com"
aes128cbcID = "aes128-cbc"
tripledescbcID = "3des-cbc"
)
Close() error
}
type connectionState struct {
packetCipher
seqNum uint32
dir direction
pendingKeyChange chan packetCipher
}
func ( *transport) ( *algorithms, *kexResult) error {
, := newPacketCipher(.reader.dir, .r, )
if != nil {
return
}
.reader.pendingKeyChange <-
, = newPacketCipher(.writer.dir, .w, )
if != nil {
return
}
.writer.pendingKeyChange <-
return nil
}
func ( *transport) ( []byte, bool) {
if len() == 0 {
return
}
:= "server"
if .isClient {
= "client"
}
:= "read"
if {
= "write"
}
log.Println(, , [0])
}
func ( *transport) () ( []byte, error) {
for {
, = .reader.readPacket(.bufReader)
if != nil {
break
}
if len() == 0 || ([0] != msgIgnore && [0] != msgDebug) {
break
}
}
if debugTransport {
.printPacket(, false)
}
return ,
}
func ( *connectionState) ( *bufio.Reader) ([]byte, error) {
, := .packetCipher.readCipherPacket(.seqNum, )
.seqNum++
if == nil && len() == 0 {
= errors.New("ssh: zero length packet")
}
if len() > 0 {
switch [0] {
case msgNewKeys:
select {
case := <-.pendingKeyChange:
.packetCipher =
default:
return nil, errors.New("ssh: got bogus newkeys message")
}
var disconnectMsg
if := Unmarshal(, &); != nil {
return nil,
}
return nil, &
}
}
:= make([]byte, len())
copy(, )
return ,
}
func ( *transport) ( []byte) error {
if debugTransport {
.printPacket(, true)
}
return .writer.writePacket(.bufWriter, .rand, )
}
func ( *connectionState) ( *bufio.Writer, io.Reader, []byte) error {
:= len() > 0 && [0] == msgNewKeys
:= .packetCipher.writeCipherPacket(.seqNum, , , )
if != nil {
return
}
if = .Flush(); != nil {
return
}
.seqNum++
if {
select {
case := <-.pendingKeyChange:
.packetCipher =
default:
panic("ssh: no key material for msgNewKeys")
}
}
return
}
func ( io.ReadWriteCloser, io.Reader, bool) *transport {
:= &transport{
bufReader: bufio.NewReader(),
bufWriter: bufio.NewWriter(),
rand: ,
reader: connectionState{
packetCipher: &streamPacketCipher{cipher: noneCipher{}},
pendingKeyChange: make(chan packetCipher, 1),
},
writer: connectionState{
packetCipher: &streamPacketCipher{cipher: noneCipher{}},
pendingKeyChange: make(chan packetCipher, 1),
},
Closer: ,
}
.isClient =
if {
.reader.dir = serverKeys
.writer.dir = clientKeys
} else {
.reader.dir = clientKeys
.writer.dir = serverKeys
}
return
}
type direction struct {
ivTag []byte
keyTag []byte
macKeyTag []byte
}
var (
serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}}
clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}}
)
func ( direction, directionAlgorithms, *kexResult) (packetCipher, error) {
:= cipherModes[.Cipher]
:= macModes[.MAC]
:= make([]byte, .ivSize)
:= make([]byte, .keySize)
:= make([]byte, .keySize)
generateKeyMaterial(, .ivTag, )
generateKeyMaterial(, .keyTag, )
generateKeyMaterial(, .macKeyTag, )
return cipherModes[.Cipher].create(, , , )
}
const maxVersionStringBytes = 255
if [0] == '\n' {
= [:0]
continue
}
= true
break
}
![]() |
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. |