summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-06-11 13:51:08 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-06-11 13:51:08 +0200
commit0ce8688bc98afc80c1418e34dc5ca7aeb1ec089b (patch)
tree6054e723c2a12059f81d12d1098e62f3a8b1d03f
parent613ce582489906443c127dfc29b514522a21e32d (diff)
Just dump
-rw-r--r--main.go126
1 files 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))
}
}