|
|
@@ -8,8 +8,13 @@ import (
|
|
|
"bufio"
|
|
|
"errors"
|
|
|
"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 (
|
|
|
gcmCipherID = "aes128-gcm@openssh.com"
|
|
|
aes128cbcID = "aes128-cbc"
|
|
|
@@ -40,7 +45,7 @@ type transport struct {
|
|
|
bufReader *bufio.Reader
|
|
|
bufWriter *bufio.Writer
|
|
|
rand io.Reader
|
|
|
-
|
|
|
+ isClient bool
|
|
|
io.Closer
|
|
|
}
|
|
|
|
|
|
@@ -86,6 +91,22 @@ func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) err
|
|
|
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.
|
|
|
func (t *transport) readPacket() (p []byte, err error) {
|
|
|
for {
|
|
|
@@ -97,6 +118,9 @@ func (t *transport) readPacket() (p []byte, err error) {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
+ if debugTransport {
|
|
|
+ t.printPacket(p, false)
|
|
|
+ }
|
|
|
|
|
|
return p, err
|
|
|
}
|
|
|
@@ -141,6 +165,9 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {
|
|
|
}
|
|
|
|
|
|
func (t *transport) writePacket(packet []byte) error {
|
|
|
+ if debugTransport {
|
|
|
+ t.printPacket(packet, true)
|
|
|
+ }
|
|
|
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,
|
|
|
}
|
|
|
+ t.isClient = isClient
|
|
|
+
|
|
|
if isClient {
|
|
|
t.reader.dir = serverKeys
|
|
|
t.writer.dir = clientKeys
|