From fb8c549e9d3d7143cd6edb7555e06e9fecf5982d Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Sun, 18 Aug 2019 16:52:00 +1000 Subject: [PATCH] Add mse/cmd/mse --- go.mod | 1 + go.sum | 4 ++ mse/cmd/mse/main.go | 90 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 mse/cmd/mse/main.go diff --git a/go.mod b/go.mod index 92ab43e4..ba973b75 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/anacrolix/torrent require ( bazil.org/fuse v0.0.0-20180421153158-65cc252bf669 github.com/RoaringBitmap/roaring v0.4.18 // indirect + github.com/alexflint/go-arg v1.1.0 github.com/anacrolix/dht/v2 v2.0.1 github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa github.com/anacrolix/go-libutp v1.0.2 diff --git a/go.sum b/go.sum index 0a38c3cf..6cff345d 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,10 @@ github.com/RoaringBitmap/roaring v0.4.7 h1:eGUudvFzvF7Kxh7JjYvXfI1f7l22/2duFby7r github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= github.com/RoaringBitmap/roaring v0.4.18 h1:nh8Ngxctxt5QAoMLuR7MHJe4jEqpn+EnsdgDWPryQWo= github.com/RoaringBitmap/roaring v0.4.18/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= +github.com/alexflint/go-arg v1.1.0 h1:92ADei0d3TP0mGBdJ/FNcF54X6uFY7BQfhqkrQt3CCE= +github.com/alexflint/go-arg v1.1.0/go.mod h1:3Rj4baqzWaGGmZA2+bVTV8zQOZEjBQAPBnL5xLT+ftY= +github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= +github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/anacrolix/dht v0.0.0-20180412060941-24cbf25b72a4 h1:0yHJvFiGQhJ1gSHJOR8xzmnx45orEt7uiIB6guf0+zc= github.com/anacrolix/dht v0.0.0-20180412060941-24cbf25b72a4/go.mod h1:hQfX2BrtuQsLQMYQwsypFAab/GvHg8qxwVi4OJdR1WI= github.com/anacrolix/dht/v2 v2.0.1 h1:gOHJ+OKqJ4Eb48OYStZm4AlWr1/nSA2TWlzb/+t36SA= diff --git a/mse/cmd/mse/main.go b/mse/cmd/mse/main.go new file mode 100644 index 00000000..c4311ca3 --- /dev/null +++ b/mse/cmd/mse/main.go @@ -0,0 +1,90 @@ +package main + +import ( + "io" + "log" + "net" + "os" + "sync" + + "github.com/alexflint/go-arg" + "golang.org/x/xerrors" + + "github.com/anacrolix/torrent/mse" +) + +func main() { + err := mainErr() + if err != nil { + log.Fatalf("fatal error: %v", err) + } +} + +func mainErr() error { + var args = struct { + CryptoMethod mse.CryptoMethod + Dial *struct { + Network string `arg:"positional"` + Address string `arg:"positional"` + SecretKey string `arg:"positional"` + InitialPayload []byte + } `arg:"subcommand""` + Listen *struct { + Network string `arg:"positional"` + Address string `arg:"positional"` + SecretKeys []string `arg:"positional"` + } `arg:"subcommand""` + }{ + CryptoMethod: mse.AllSupportedCrypto, + } + arg.MustParse(&args) + if args.Dial != nil { + cn, err := net.Dial(args.Dial.Network, args.Dial.Address) + if err != nil { + return xerrors.Errorf("dialing: %w", err) + } + defer cn.Close() + rw, _, err := mse.InitiateHandshake(cn, []byte(args.Dial.SecretKey), args.Dial.InitialPayload, args.CryptoMethod) + if err != nil { + return xerrors.Errorf("initiating handshake: %w", err) + } + doStreaming(rw) + } + if args.Listen != nil { + l, err := net.Listen(args.Listen.Network, args.Listen.Address) + if err != nil { + return xerrors.Errorf("listening: %w", err) + } + defer l.Close() + cn, err := l.Accept() + l.Close() + if err != nil { + return xerrors.Errorf("accepting: %w", err) + } + defer cn.Close() + rw, _, err := mse.ReceiveHandshake(cn, func(f func([]byte) bool) { + for _, sk := range args.Listen.SecretKeys { + f([]byte(sk)) + } + }, mse.DefaultCryptoSelector) + if err != nil { + log.Fatalf("error receiving: %v", err) + } + doStreaming(rw) + } + return nil +} + +func doStreaming(rw io.ReadWriter) { + var wg sync.WaitGroup + wg.Add(2) + go func() { + defer wg.Done() + log.Println(io.Copy(rw, os.Stdin)) + }() + go func() { + defer wg.Done() + log.Println(io.Copy(os.Stdout, rw)) + }() + wg.Wait() +}