mirror of https://gogs.blitter.com/RLabs/xs
log of cipher/plaintext disabled (flags unexposed to re-enable); pprof tooling
This commit is contained in:
parent
5511fc83cd
commit
c24529a1d4
|
@ -40,7 +40,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"blitter.com/go/herradurakex"
|
hkex "blitter.com/go/herradurakex"
|
||||||
"blitter.com/go/hkexsh/logger"
|
"blitter.com/go/hkexsh/logger"
|
||||||
kyber "git.schwanenlied.me/yawning/kyber.git"
|
kyber "git.schwanenlied.me/yawning/kyber.git"
|
||||||
newhope "git.schwanenlied.me/yawning/newhope.git"
|
newhope "git.schwanenlied.me/yawning/newhope.git"
|
||||||
|
@ -70,10 +70,14 @@ type (
|
||||||
|
|
||||||
// Conn is a connection wrapping net.Conn with KEX & session state
|
// Conn is a connection wrapping net.Conn with KEX & session state
|
||||||
Conn struct {
|
Conn struct {
|
||||||
kex KEXAlg // KEX/KEM propsal (client -> server)
|
kex KEXAlg // KEX/KEM propsal (client -> server)
|
||||||
m *sync.Mutex // (internal)
|
m *sync.Mutex // (internal)
|
||||||
c *net.Conn // which also implements io.Reader, io.Writer, ...
|
c *net.Conn // which also implements io.Reader, io.Writer, ...
|
||||||
immClose bool
|
immClose bool
|
||||||
|
|
||||||
|
logCipherText bool // somewhat expensive, for debugging
|
||||||
|
logPlainText bool // INSECURE and somewhat expensive, for debugging
|
||||||
|
|
||||||
cipheropts uint32 // post-KEx cipher/hmac options
|
cipheropts uint32 // post-KEx cipher/hmac options
|
||||||
opts uint32 // post-KEx protocol options (caller-defined)
|
opts uint32 // post-KEx protocol options (caller-defined)
|
||||||
WinCh chan WinSize
|
WinCh chan WinSize
|
||||||
|
@ -998,7 +1002,9 @@ func (hc Conn) Read(b []byte) (n int, err error) {
|
||||||
return 0, errors.New(etxt)
|
return 0, errors.New(etxt)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf(" <:ctext:\r\n%s\r\n", hex.Dump(payloadBytes[:n]))
|
if hc.logCipherText {
|
||||||
|
log.Printf(" <:ctext:\r\n%s\r\n", hex.Dump(payloadBytes[:n]))
|
||||||
|
}
|
||||||
|
|
||||||
db := bytes.NewBuffer(payloadBytes[:n]) //copying payloadBytes to db
|
db := bytes.NewBuffer(payloadBytes[:n]) //copying payloadBytes to db
|
||||||
// The StreamReader acts like a pipe, decrypting
|
// The StreamReader acts like a pipe, decrypting
|
||||||
|
@ -1008,7 +1014,9 @@ func (hc Conn) Read(b []byte) (n int, err error) {
|
||||||
// The caller isn't necessarily reading the full payload so we need
|
// The caller isn't necessarily reading the full payload so we need
|
||||||
// to decrypt to an intermediate buffer, draining it on demand of caller
|
// to decrypt to an intermediate buffer, draining it on demand of caller
|
||||||
decryptN, err := rs.Read(payloadBytes)
|
decryptN, err := rs.Read(payloadBytes)
|
||||||
log.Printf(" <-ptext:\r\n%s\r\n", hex.Dump(payloadBytes[:n]))
|
if hc.logPlainText {
|
||||||
|
log.Printf(" <-ptext:\r\n%s\r\n", hex.Dump(payloadBytes[:n]))
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("hkexnet.Read():", err)
|
log.Println("hkexnet.Read():", err)
|
||||||
//panic(err)
|
//panic(err)
|
||||||
|
@ -1203,7 +1211,9 @@ func (hc *Conn) WritePacket(b []byte, ctrlStatOp byte) (n int, err error) {
|
||||||
hc.m.Lock()
|
hc.m.Lock()
|
||||||
payloadLen = uint32(len(b))
|
payloadLen = uint32(len(b))
|
||||||
//!fmt.Printf(" --== payloadLen:%d\n", payloadLen)
|
//!fmt.Printf(" --== payloadLen:%d\n", payloadLen)
|
||||||
log.Printf(" :>ptext:\r\n%s\r\n", hex.Dump(b[0:payloadLen]))
|
if hc.logPlainText {
|
||||||
|
log.Printf(" :>ptext:\r\n%s\r\n", hex.Dump(b[0:payloadLen]))
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate hmac on payload
|
// Calculate hmac on payload
|
||||||
hc.wm.Write(b[0:payloadLen])
|
hc.wm.Write(b[0:payloadLen])
|
||||||
|
@ -1219,7 +1229,9 @@ func (hc *Conn) WritePacket(b []byte, ctrlStatOp byte) (n int, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
log.Printf(" ->ctext:\r\n%s\r\n", hex.Dump(wb.Bytes()))
|
if hc.logCipherText {
|
||||||
|
log.Printf(" ->ctext:\r\n%s\r\n", hex.Dump(wb.Bytes()))
|
||||||
|
}
|
||||||
|
|
||||||
err = binary.Write(*hc.c, binary.BigEndian, &ctrlStatOp)
|
err = binary.Write(*hc.c, binary.BigEndian, &ctrlStatOp)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
|
@ -23,11 +23,15 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"runtime/pprof"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"net/http"
|
||||||
|
_ "net/http/pprof"
|
||||||
|
|
||||||
hkexsh "blitter.com/go/hkexsh"
|
hkexsh "blitter.com/go/hkexsh"
|
||||||
"blitter.com/go/hkexsh/hkexnet"
|
"blitter.com/go/hkexsh/hkexnet"
|
||||||
"blitter.com/go/hkexsh/logger"
|
"blitter.com/go/hkexsh/logger"
|
||||||
|
@ -40,6 +44,9 @@ var (
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
// Log defaults to regular syslog output (no -d)
|
// Log defaults to regular syslog output (no -d)
|
||||||
Log *logger.Writer
|
Log *logger.Writer
|
||||||
|
|
||||||
|
cpuprofile string
|
||||||
|
memprofile string
|
||||||
)
|
)
|
||||||
|
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
|
@ -412,7 +419,7 @@ func doShellMode(isInteractive bool, conn *hkexnet.Conn, oldState *hkexsh.State,
|
||||||
// gracefully here
|
// gracefully here
|
||||||
if !strings.HasSuffix(inerr.Error(), "use of closed network connection") {
|
if !strings.HasSuffix(inerr.Error(), "use of closed network connection") {
|
||||||
log.Println(inerr)
|
log.Println(inerr)
|
||||||
os.Exit(1)
|
exitWithStatus(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +429,7 @@ func doShellMode(isInteractive bool, conn *hkexnet.Conn, oldState *hkexsh.State,
|
||||||
if isInteractive {
|
if isInteractive {
|
||||||
log.Println("[* Got EOF *]")
|
log.Println("[* Got EOF *]")
|
||||||
_ = hkexsh.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
_ = hkexsh.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
||||||
os.Exit(int(rec.Status()))
|
exitWithStatus(int(rec.Status()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
go shellRemoteToStdin()
|
go shellRemoteToStdin()
|
||||||
|
@ -451,7 +458,7 @@ func doShellMode(isInteractive bool, conn *hkexnet.Conn, oldState *hkexsh.State,
|
||||||
fmt.Println(outerr)
|
fmt.Println(outerr)
|
||||||
_ = hkexsh.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
_ = hkexsh.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
||||||
log.Println("[Hanging up]")
|
log.Println("[Hanging up]")
|
||||||
os.Exit(0)
|
exitWithStatus(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
go shellStdinToRemote()
|
go shellStdinToRemote()
|
||||||
|
@ -621,6 +628,9 @@ func main() {
|
||||||
flag.UintVar(&chaffFreqMax, "F", 5000, "`msecs-max` chaff pkt freq max (msecs)")
|
flag.UintVar(&chaffFreqMax, "F", 5000, "`msecs-max` chaff pkt freq max (msecs)")
|
||||||
flag.UintVar(&chaffBytesMax, "B", 64, "chaff pkt size max (bytes)")
|
flag.UintVar(&chaffBytesMax, "B", 64, "chaff pkt size max (bytes)")
|
||||||
|
|
||||||
|
flag.StringVar(&cpuprofile, "cpuprofile", "", "write cpu profile to `file`")
|
||||||
|
flag.StringVar(&memprofile, "memprofile", "", "write memory profile to `file`")
|
||||||
|
|
||||||
// Find out what program we are (shell or copier)
|
// Find out what program we are (shell or copier)
|
||||||
myPath := strings.Split(os.Args[0], string(os.PathSeparator))
|
myPath := strings.Split(os.Args[0], string(os.PathSeparator))
|
||||||
if myPath[len(myPath)-1] != "hkexcp" && myPath[len(myPath)-1] != "hkexcp.exe" {
|
if myPath[len(myPath)-1] != "hkexcp" && myPath[len(myPath)-1] != "hkexcp.exe" {
|
||||||
|
@ -636,6 +646,22 @@ func main() {
|
||||||
}
|
}
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
if cpuprofile != "" {
|
||||||
|
f, err := os.Create(cpuprofile)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("could not create CPU profile: ", err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
fmt.Println("StartCPUProfile()")
|
||||||
|
if err := pprof.StartCPUProfile(f); err != nil {
|
||||||
|
log.Fatal("could not start CPU profile: ", err)
|
||||||
|
} else {
|
||||||
|
defer pprof.StopCPUProfile()
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() { http.ListenAndServe("localhost:6060", nil) }()
|
||||||
|
}
|
||||||
|
|
||||||
remoteUser, remoteHost, tmpPath, pathIsDest, otherArgs :=
|
remoteUser, remoteHost, tmpPath, pathIsDest, otherArgs :=
|
||||||
parseNonSwitchArgs(flag.Args())
|
parseNonSwitchArgs(flag.Args())
|
||||||
//fmt.Println("otherArgs:", otherArgs)
|
//fmt.Println("otherArgs:", otherArgs)
|
||||||
|
@ -692,12 +718,12 @@ func main() {
|
||||||
//fmt.Println("server finally is:", server)
|
//fmt.Println("server finally is:", server)
|
||||||
if flag.NFlag() == 0 && server == "" {
|
if flag.NFlag() == 0 && server == "" {
|
||||||
flag.Usage()
|
flag.Usage()
|
||||||
os.Exit(0)
|
exitWithStatus(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if vopt {
|
if vopt {
|
||||||
fmt.Printf("version v%s\n", version)
|
fmt.Printf("version v%s\n", version)
|
||||||
os.Exit(0)
|
exitWithStatus(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cmdStr) != 0 && (len(copySrc) != 0 || len(copyDst) != 0) {
|
if len(cmdStr) != 0 && (len(copySrc) != 0 || len(copyDst) != 0) {
|
||||||
|
@ -781,7 +807,7 @@ func main() {
|
||||||
conn, err := hkexnet.Dial("tcp", server, cipherAlg, hmacAlg, kexAlg)
|
conn, err := hkexnet.Dial("tcp", server, cipherAlg, hmacAlg, kexAlg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
os.Exit(3)
|
exitWithStatus(3)
|
||||||
}
|
}
|
||||||
defer conn.Close() // nolint: errcheck
|
defer conn.Close() // nolint: errcheck
|
||||||
// From this point on, conn is a secure encrypted channel
|
// From this point on, conn is a secure encrypted channel
|
||||||
|
@ -861,7 +887,6 @@ func main() {
|
||||||
|
|
||||||
if shellMode {
|
if shellMode {
|
||||||
launchTuns(&conn, remoteHost, tunSpecStr)
|
launchTuns(&conn, remoteHost, tunSpecStr)
|
||||||
|
|
||||||
doShellMode(isInteractive, &conn, oldState, rec)
|
doShellMode(isInteractive, &conn, oldState, rec)
|
||||||
} else { // copyMode
|
} else { // copyMode
|
||||||
s, _ := doCopyMode(&conn, pathIsDest, fileArgs, rec) // nolint: errcheck,gosec
|
s, _ := doCopyMode(&conn, pathIsDest, fileArgs, rec) // nolint: errcheck,gosec
|
||||||
|
@ -877,5 +902,27 @@ func main() {
|
||||||
if oldState != nil {
|
if oldState != nil {
|
||||||
_ = hkexsh.Restore(int(os.Stdin.Fd()), oldState) // nolint: gosec
|
_ = hkexsh.Restore(int(os.Stdin.Fd()), oldState) // nolint: gosec
|
||||||
}
|
}
|
||||||
os.Exit(int(rec.Status()))
|
|
||||||
|
exitWithStatus(int(rec.Status()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// exitWithStatus wraps os.Exit() plus does any required pprof housekeeping
|
||||||
|
func exitWithStatus(status int) {
|
||||||
|
if cpuprofile != "" {
|
||||||
|
pprof.StopCPUProfile()
|
||||||
|
}
|
||||||
|
|
||||||
|
if memprofile != "" {
|
||||||
|
f, err := os.Create(memprofile)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("could not create memory profile: ", err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
runtime.GC() // get up-to-date statistics
|
||||||
|
if err := pprof.WriteHeapProfile(f); err != nil {
|
||||||
|
log.Fatal("could not write memory profile: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
os.Exit(status)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue