diff --git a/internal/multiplex/obfs_test.go b/internal/multiplex/obfs_test.go index c685d5c..621ad69 100644 --- a/internal/multiplex/obfs_test.go +++ b/internal/multiplex/obfs_test.go @@ -83,7 +83,7 @@ func BenchmarkObfs(b *testing.B) { testPayload, } - obfsBuf := make([]byte, 512) + obfsBuf := make([]byte, 2048) var key [32]byte rand.Read(key[:]) @@ -94,7 +94,11 @@ func BenchmarkObfs(b *testing.B) { obfs := MakeObfs(key, payloadCipher) b.ResetTimer() for i := 0; i < b.N; i++ { - obfs(testFrame, obfsBuf) + n, err := obfs(testFrame, obfsBuf) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) } }) b.Run("AES128GCM", func(b *testing.B) { @@ -104,14 +108,22 @@ func BenchmarkObfs(b *testing.B) { obfs := MakeObfs(key, payloadCipher) b.ResetTimer() for i := 0; i < b.N; i++ { - obfs(testFrame, obfsBuf) + n, err := obfs(testFrame, obfsBuf) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) } }) b.Run("plain", func(b *testing.B) { obfs := MakeObfs(key, nil) b.ResetTimer() for i := 0; i < b.N; i++ { - obfs(testFrame, obfsBuf) + n, err := obfs(testFrame, obfsBuf) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) } }) b.Run("chacha20Poly1305", func(b *testing.B) { @@ -120,7 +132,91 @@ func BenchmarkObfs(b *testing.B) { obfs := MakeObfs(key, payloadCipher) b.ResetTimer() for i := 0; i < b.N; i++ { - obfs(testFrame, obfsBuf) + n, err := obfs(testFrame, obfsBuf) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) + } + }) +} + +func BenchmarkDeobfs(b *testing.B) { + testPayload := make([]byte, 1024) + rand.Read(testPayload) + testFrame := &Frame{ + 1, + 0, + 0, + testPayload, + } + + obfsBuf := make([]byte, 2048) + + var key [32]byte + rand.Read(key[:]) + b.Run("AES256GCM", func(b *testing.B) { + c, _ := aes.NewCipher(key[:]) + payloadCipher, _ := cipher.NewGCM(c) + + obfs := MakeObfs(key, payloadCipher) + n, _ := obfs(testFrame, obfsBuf) + deobfs := MakeDeobfs(key, payloadCipher) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := deobfs(obfsBuf[:n]) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) + } + }) + b.Run("AES128GCM", func(b *testing.B) { + c, _ := aes.NewCipher(key[:16]) + payloadCipher, _ := cipher.NewGCM(c) + + obfs := MakeObfs(key, payloadCipher) + n, _ := obfs(testFrame, obfsBuf) + deobfs := MakeDeobfs(key, payloadCipher) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := deobfs(obfsBuf[:n]) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) + } + }) + b.Run("plain", func(b *testing.B) { + obfs := MakeObfs(key, nil) + n, _ := obfs(testFrame, obfsBuf) + deobfs := MakeDeobfs(key, nil) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := deobfs(obfsBuf[:n]) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) + } + }) + b.Run("chacha20Poly1305", func(b *testing.B) { + payloadCipher, _ := chacha20poly1305.New(key[:16]) + + obfs := MakeObfs(key, payloadCipher) + n, _ := obfs(testFrame, obfsBuf) + deobfs := MakeDeobfs(key, payloadCipher) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := deobfs(obfsBuf[:n]) + if err != nil { + b.Error(err) + } + b.SetBytes(int64(n)) } }) } diff --git a/internal/multiplex/session_test.go b/internal/multiplex/session_test.go new file mode 100644 index 0000000..3a0216f --- /dev/null +++ b/internal/multiplex/session_test.go @@ -0,0 +1,72 @@ +package multiplex + +import ( + "github.com/cbeuw/Cloak/internal/util" + "math/rand" + "testing" +) + +func BenchmarkRecvDataFromRemote(b *testing.B) { + testPayload := make([]byte, 1024) + rand.Read(testPayload) + f := &Frame{ + 1, + 0, + 0, + testPayload, + } + obfsBuf := make([]byte, 17000) + + sessionKey := make([]byte, 32) + rand.Read(sessionKey) + + b.Run("plain", func(b *testing.B) { + obfuscator, _ := GenerateObfs(0x00, sessionKey) + sesh := MakeSession(0, UNLIMITED_VALVE, obfuscator, util.ReadTLS) + n, _ := sesh.Obfs(f, obfsBuf) + + originalHeader := make([]byte, 12) + copy(originalHeader, obfsBuf[5:17]) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + sesh.recvDataFromRemote(obfsBuf[:n]) + b.SetBytes(int64(n)) + copy(obfsBuf[5:17], originalHeader) + } + }) + + b.Run("aes-gcm", func(b *testing.B) { + obfuscator, _ := GenerateObfs(0x01, sessionKey) + sesh := MakeSession(0, UNLIMITED_VALVE, obfuscator, util.ReadTLS) + n, _ := sesh.Obfs(f, obfsBuf) + + // because deobfs decrypts the header in-place, which alters the input + originalHeader := make([]byte, 12) + copy(originalHeader, obfsBuf[5:17]) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + sesh.recvDataFromRemote(obfsBuf[:n]) + b.SetBytes(int64(n)) + copy(obfsBuf[5:17], originalHeader) + } + }) + + b.Run("chacha20-poly1305", func(b *testing.B) { + obfuscator, _ := GenerateObfs(0x02, sessionKey) + sesh := MakeSession(0, UNLIMITED_VALVE, obfuscator, util.ReadTLS) + n, _ := sesh.Obfs(f, obfsBuf) + + originalHeader := make([]byte, 12) + copy(originalHeader, obfsBuf[5:17]) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + sesh.recvDataFromRemote(obfsBuf[:n]) + b.SetBytes(int64(n)) + copy(obfsBuf[5:17], originalHeader) + } + }) + +} diff --git a/internal/multiplex/stream_test.go b/internal/multiplex/stream_test.go index f3e840b..730fe06 100644 --- a/internal/multiplex/stream_test.go +++ b/internal/multiplex/stream_test.go @@ -42,7 +42,7 @@ func (b *blackhole) SetReadDeadline(t time.Time) error { return nil } func (b *blackhole) SetWriteDeadline(t time.Time) error { return nil } func BenchmarkStream_Write(b *testing.B) { - const PAYLOAD_LEN = 1 << 20 * 100 + const PAYLOAD_LEN = 1000 hole := newBlackHole() sesh := setupSesh() sesh.AddConnection(hole)