ssh: add debug print at the lowest level
This is a simple minded, fast print, suitable for debugging timing sensitive issues. Change-Id: I9ae3df5fe86f1883c1fa9265b6f7f9a98d33747e Reviewed-on: https://go-review.googlesource.com/36054 Run-TryBot: Han-Wen Nienhuys <hanwen@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
@@ -499,4 +499,7 @@ func TestDebug(t *testing.T) {
|
|||||||
if debugHandshake {
|
if debugHandshake {
|
||||||
t.Error("handshake debug switched on")
|
t.Error("handshake debug switched on")
|
||||||
}
|
}
|
||||||
|
if debugTransport {
|
||||||
|
t.Error("transport debug switched on")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-1
@@ -8,8 +8,13 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// debugTransport if set, will print packet types as they go over the
|
||||||
|
// wire. No message decoding is done, to minimize the impact on timing.
|
||||||
|
const debugTransport = false
|
||||||
|
|
||||||
const (
|
const (
|
||||||
gcmCipherID = "aes128-gcm@openssh.com"
|
gcmCipherID = "aes128-gcm@openssh.com"
|
||||||
aes128cbcID = "aes128-cbc"
|
aes128cbcID = "aes128-cbc"
|
||||||
@@ -40,7 +45,7 @@ type transport struct {
|
|||||||
bufReader *bufio.Reader
|
bufReader *bufio.Reader
|
||||||
bufWriter *bufio.Writer
|
bufWriter *bufio.Writer
|
||||||
rand io.Reader
|
rand io.Reader
|
||||||
|
isClient bool
|
||||||
io.Closer
|
io.Closer
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +91,22 @@ func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) err
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *transport) printPacket(p []byte, write bool) {
|
||||||
|
if len(p) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
who := "server"
|
||||||
|
if t.isClient {
|
||||||
|
who = "client"
|
||||||
|
}
|
||||||
|
what := "read"
|
||||||
|
if write {
|
||||||
|
what = "write"
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println(what, who, p[0])
|
||||||
|
}
|
||||||
|
|
||||||
// Read and decrypt next packet.
|
// Read and decrypt next packet.
|
||||||
func (t *transport) readPacket() (p []byte, err error) {
|
func (t *transport) readPacket() (p []byte, err error) {
|
||||||
for {
|
for {
|
||||||
@@ -97,6 +118,9 @@ func (t *transport) readPacket() (p []byte, err error) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if debugTransport {
|
||||||
|
t.printPacket(p, false)
|
||||||
|
}
|
||||||
|
|
||||||
return p, err
|
return p, err
|
||||||
}
|
}
|
||||||
@@ -141,6 +165,9 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *transport) writePacket(packet []byte) error {
|
func (t *transport) writePacket(packet []byte) error {
|
||||||
|
if debugTransport {
|
||||||
|
t.printPacket(packet, true)
|
||||||
|
}
|
||||||
return t.writer.writePacket(t.bufWriter, t.rand, packet)
|
return t.writer.writePacket(t.bufWriter, t.rand, packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,6 +208,8 @@ func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transp
|
|||||||
},
|
},
|
||||||
Closer: rwc,
|
Closer: rwc,
|
||||||
}
|
}
|
||||||
|
t.isClient = isClient
|
||||||
|
|
||||||
if isClient {
|
if isClient {
|
||||||
t.reader.dir = serverKeys
|
t.reader.dir = serverKeys
|
||||||
t.writer.dir = clientKeys
|
t.writer.dir = clientKeys
|
||||||
|
|||||||
Reference in New Issue
Block a user