From 0ce8688bc98afc80c1418e34dc5ca7aeb1ec089b Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 11 Jun 2017 13:51:08 +0200 Subject: Just dump --- main.go | 126 +++++++++++++++++++--------------------------------------------- 1 file changed, 37 insertions(+), 89 deletions(-) diff --git a/main.go b/main.go index 27b7f46..076564c 100644 --- a/main.go +++ b/main.go @@ -1,16 +1,12 @@ package main import ( - "bytes" - "crypto/rsa" - "crypto/x509" "encoding/hex" - "errors" "fmt" + "io" "log" "net" "sync" - "time" ) const ( @@ -36,89 +32,28 @@ func (d Direction) String() string { } type Data struct { - Key *rsa.PublicKey - Rnd []byte - Data []byte + Round int + Dir Direction + Data []byte + Size int } -func (d Data) String() string { - s := fmt.Sprintf("N: %v\n", d.Key) - s += fmt.Sprintf("R: %x\n", d.Rnd) - s += fmt.Sprintf("D: %x\n", d.Data) - return s -} - -var data = make(map[Direction]Data) - -func (dir Direction) sniffCert(b []byte) error { - if i := bytes.Index(b, []byte{0x30, 0x82, 0x04, 0x2f}); i >= 0 { - if len(b) < i+1075 { - return errors.New("too short") - } - cert := b[i : i+1075] - crt, err := x509.ParseCertificate(cert) - if err != nil { - return err - } - d := data[dir] - d.Key = crt.PublicKey.(*rsa.PublicKey) - data[dir] = d - } - return nil -} - -func (dir Direction) sniffRnd(b []byte) error { - rnd := b[0x0b:0x2b] - fmt.Println(dir, "rnd", len(rnd), "bytes") - d := data[dir] - d.Rnd = rnd - data[dir] = d - return nil -} - -func (dir Direction) sniffData(b []byte) error { - if i := bytes.Index(b, []byte{0x17, 0x03, 0x03, 0x00}); i >= 0 { - l := int(b[4]) - d := data[dir] - d.Data = b[i+5 : i+5+l] - data[dir] = d - } - return nil -} - -func (dir Direction) sniff(src, dst net.Conn, wg *sync.WaitGroup) { - defer wg.Done() - buf := make([]byte, 4096) // 1452 - now := time.Now() +func dump(dir Direction, src, dst net.Conn, data chan Data) error { + buf := make([]byte, 4096) for k := 1; ; k++ { n, err := src.Read(buf) - spent := time.Since(now) if err != nil { - dst.Close() - return - } - pkg := buf[:n] - - if k == 1 { - dir.sniffRnd(pkg) + if err == io.EOF { + return nil + } + return fmt.Errorf("READ %v", err) } - mean := spent / time.Duration(n) - - fmt.Println(k, dir, - n, "bytes", - spent, "mean", - mean, "per byte") - fmt.Println(hex.Dump(pkg)) - - dir.sniffCert(pkg) - dir.sniffData(pkg) + data <- Data{Round: k, Dir: dir, Data: buf[:n], Size: n} - _, err = dst.Write(pkg) - now = time.Now() + _, err = dst.Write(buf[:n]) if err != nil { - log.Println(dir, err) - return + return fmt.Errorf("WRITE %v", err) } } } @@ -138,17 +73,30 @@ func main() { } defer cnt.Close() + data := make(chan Data) + wg.Add(2) - go ServerClient.sniff(srv, cnt, &wg) - go ClientServer.sniff(cnt, srv, &wg) - wg.Wait() + go func() { + wg.Wait() + close(data) + }() + + go func(dir Direction) { + if err := dump(dir, srv, cnt, data); err != nil { + fmt.Println("ERROR", dir, err) + } + wg.Done() + }(ServerClient) - if d, ok := data[ClientServer]; ok { - fmt.Println(ClientServer) - fmt.Println(d) - } - if d, ok := data[ServerClient]; ok { - fmt.Println(ServerClient) - fmt.Println(d) + go func(dir Direction) { + if err := dump(dir, cnt, srv, data); err != nil { + fmt.Println("ERROR", dir, err) + } + wg.Done() + }(ClientServer) + + for d := range data { + fmt.Println(d.Round, d.Dir, d.Size, "bytes") + fmt.Println(hex.Dump(d.Data)) } } -- cgit v1.2.3