summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/server/module/aes.go86
-rwxr-xr-xtest/auth.sh4
2 files changed, 88 insertions, 2 deletions
diff --git a/pkg/server/module/aes.go b/pkg/server/module/aes.go
new file mode 100644
index 0000000..68dcc7c
--- /dev/null
+++ b/pkg/server/module/aes.go
@@ -0,0 +1,86 @@
+package module
+
+import (
+ "crypto/aes"
+ "crypto/cipher"
+ "crypto/md5"
+ "crypto/rand"
+ "io"
+ "tunnel/pkg/server/env"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/queue"
+)
+
+type aesInfo struct {
+ key []byte
+}
+
+type aesModule struct{}
+
+func (a *aesInfo) Send(rq, wq queue.Q) error {
+ block, err := aes.NewCipher(a.key)
+ if err != nil {
+ return err
+ }
+
+ iv := make([]byte, aes.BlockSize)
+
+ if _, err := rand.Read(iv); err != nil {
+ return err
+ }
+
+ writer := &cipher.StreamWriter{
+ S: cipher.NewOFB(block, iv),
+ W: wq.Writer(),
+ }
+
+ wq <- iv
+
+ return queue.IoCopy(rq.Reader(), writer)
+}
+
+func (a *aesInfo) Recv(rq, wq queue.Q) error {
+ block, err := aes.NewCipher(a.key)
+ if err != nil {
+ return err
+ }
+
+ r := rq.Reader()
+
+ iv := make([]byte, aes.BlockSize)
+
+ if _, err := io.ReadFull(r, iv); err != nil {
+ if err == io.EOF {
+ return nil
+ }
+ return err
+ }
+
+ reader := &cipher.StreamReader{
+ S: cipher.NewOFB(block, iv),
+ R: r,
+ }
+
+ return queue.IoCopy(reader, wq.Writer())
+}
+
+func newAes(env env.Env) *aesInfo {
+ s := getAuthSecret(env)
+ h := md5.Sum([]byte(s))
+
+ a := &aesInfo{key: make([]byte, 16)}
+ copy(a.key, h[:])
+
+ return a
+}
+
+func (m aesModule) Open(env env.Env) (Pipe, Pipe) {
+ a := newAes(env)
+ return a.Send, a.Recv
+}
+
+func init() {
+ register("aes", func(opts.Opts, env.Env) (module, error) {
+ return aesModule{}, nil
+ })
+}
diff --git a/test/auth.sh b/test/auth.sh
index 4f822c3..311b8ff 100755
--- a/test/auth.sh
+++ b/test/auth.sh
@@ -3,8 +3,8 @@
ROOT=$(dirname $0)/..
PATH=$PATH:$ROOT/cmd/tunnel
-tunnel add name T 2000,listen auth 3000
-tunnel add name X 3000,listen - auth 4000
+tunnel add name T 2000,listen auth aes 3000
+tunnel add name X 3000,listen -aes -auth 4000
tunnel var set tunnel.T.secret secret
tunnel var set tunnel.X.secret secret
nc -l 4000 &