aboutsummaryrefslogtreecommitdiff
path: root/tor
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2019-11-28 18:05:08 +0000
committerChristine Dodrill <me@christine.website>2019-11-28 18:24:54 +0000
commit2dfde39f006f8e6fa69d68dd72dd10d67e9b1cfd (patch)
tree2b3e8962433ba347d1b3e527ea9ab405ba73c0d4 /tor
parente49a08c2ae2e179f8d28ae7cf84d27d2e3d9f045 (diff)
downloadx-2dfde39f006f8e6fa69d68dd72dd10d67e9b1cfd.tar.xz
x-2dfde39f006f8e6fa69d68dd72dd10d67e9b1cfd.zip
cmd/la-baujmi: fix tests
Diffstat (limited to 'tor')
-rw-r--r--tor/tor.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/tor/tor.go b/tor/tor.go
new file mode 100644
index 0000000..a7ad373
--- /dev/null
+++ b/tor/tor.go
@@ -0,0 +1,88 @@
+// Package tor manages and automates starting a child tor process for exposing TCP services into onionland.
+package tor
+
+import (
+ "crypto/rsa"
+ "fmt"
+ "log"
+ "strconv"
+ "time"
+
+ "github.com/Yawning/bulb"
+ "github.com/phayes/freeport"
+ "github.com/sycamoreone/orc/tor"
+)
+
+// Config is a wrapper struct for tor configuration.
+type Config struct {
+ DataDir string
+ HashedControlPassword string
+ ClearPassword string
+ Timeout time.Duration
+}
+
+// StartTor starts a new instance of tor or doesn't with the reason why.
+func StartTor(cfg Config) (*Tor, error) {
+ tc := tor.NewConfig()
+ tc.Set("DataDirectory", cfg.DataDir)
+ tc.Set("HashedControlPassword", cfg.HashedControlPassword)
+ tc.Set("SocksPort", "0")
+
+ port, err := freeport.GetFreePort()
+ if err != nil {
+ return nil, err
+ }
+
+ tc.Set("ControlPort", fmt.Sprint(port))
+
+ tc.Timeout = cfg.Timeout
+
+ tcmd, err := tor.NewCmd(tc)
+ if err != nil {
+ return nil, err
+ }
+
+ err = tcmd.Start()
+ if err != nil {
+ return nil, err
+ }
+
+ log.Println("tor started, sleeping for a few seconds for it to settle...")
+ time.Sleep(5 * time.Second)
+
+ bc, err := bulb.Dial("tcp", "127.0.0.1:"+strconv.Itoa(port))
+ if err != nil {
+ return nil, err
+ }
+
+ err = bc.Authenticate(cfg.ClearPassword)
+ if err != nil {
+ return nil, err
+ }
+
+ t := &Tor{
+ tc: tc,
+ tcmd: tcmd,
+ bc: bc,
+ }
+
+ return t, nil
+}
+
+// Tor is a higher level wrapper to a child tor process
+type Tor struct {
+ tc *tor.Config
+ tcmd *tor.Cmd
+ bc *bulb.Conn
+}
+
+// AddOnion adds an onion service to this machine with the given private key
+// (can be nil for an auto-generated key), virtual onion port and TCP destunation.
+func (t *Tor) AddOnion(pKey *rsa.PrivateKey, virtPort uint16, destination string) (*bulb.OnionInfo, error) {
+ return t.bc.AddOnion([]bulb.OnionPortSpec{
+ {
+ VirtPort: virtPort,
+ Target: destination,
+ },
+ }, pKey, true)
+}