Cloak/internal/multiplex/obfs_test.go

244 lines
5.2 KiB
Go
Raw Normal View History

2019-08-02 19:50:08 +00:00
package multiplex
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"golang.org/x/crypto/chacha20poly1305"
2019-08-02 19:50:08 +00:00
"math/rand"
"reflect"
"testing"
"testing/quick"
)
func TestGenerateObfs(t *testing.T) {
2020-04-07 20:19:40 +00:00
var sessionKey [32]byte
rand.Read(sessionKey[:])
2019-08-02 19:50:08 +00:00
2020-04-10 15:14:32 +00:00
run := func(obfuscator Obfuscator, ct *testing.T) {
2019-08-04 09:38:49 +00:00
obfsBuf := make([]byte, 512)
f := &Frame{}
_testFrame, _ := quick.Value(reflect.TypeOf(f), rand.New(rand.NewSource(42)))
testFrame := _testFrame.Interface().(*Frame)
2019-08-04 09:38:49 +00:00
i, err := obfuscator.Obfs(testFrame, obfsBuf)
if err != nil {
2019-08-04 09:38:49 +00:00
ct.Error("failed to obfs ", err)
2019-08-08 14:08:16 +00:00
return
}
2019-08-02 19:50:08 +00:00
2019-08-04 09:38:49 +00:00
resultFrame, err := obfuscator.Deobfs(obfsBuf[:i])
if err != nil {
2019-08-04 09:38:49 +00:00
ct.Error("failed to deobfs ", err)
2019-08-08 14:08:16 +00:00
return
}
if !bytes.Equal(testFrame.Payload, resultFrame.Payload) || testFrame.StreamID != resultFrame.StreamID {
2019-08-04 09:38:49 +00:00
ct.Error("expecting", testFrame,
"got", resultFrame)
2019-08-08 14:08:16 +00:00
return
}
2019-08-02 19:50:08 +00:00
}
t.Run("plain", func(t *testing.T) {
2020-04-08 20:47:31 +00:00
obfuscator, err := MakeObfuscator(E_METHOD_PLAIN, sessionKey)
2019-09-01 19:23:45 +00:00
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
} else {
run(obfuscator, t)
}
})
t.Run("plain no record layer", func(t *testing.T) {
2020-04-08 20:47:31 +00:00
obfuscator, err := MakeObfuscator(E_METHOD_PLAIN, sessionKey)
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
2019-08-06 23:19:30 +00:00
} else {
run(obfuscator, t)
}
})
t.Run("aes-gcm", func(t *testing.T) {
2020-04-08 20:47:31 +00:00
obfuscator, err := MakeObfuscator(E_METHOD_AES_GCM, sessionKey)
2019-09-01 19:23:45 +00:00
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
} else {
run(obfuscator, t)
}
})
t.Run("aes-gcm no record layer", func(t *testing.T) {
2020-04-08 20:47:31 +00:00
obfuscator, err := MakeObfuscator(E_METHOD_AES_GCM, sessionKey)
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
2019-08-06 23:19:30 +00:00
} else {
run(obfuscator, t)
}
})
t.Run("chacha20-poly1305", func(t *testing.T) {
2020-04-08 20:47:31 +00:00
obfuscator, err := MakeObfuscator(E_METHOD_CHACHA20_POLY1305, sessionKey)
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
2019-08-06 23:19:30 +00:00
} else {
run(obfuscator, t)
}
})
t.Run("unknown encryption method", func(t *testing.T) {
2020-04-08 20:47:31 +00:00
_, err := MakeObfuscator(0xff, sessionKey)
2019-08-06 23:19:30 +00:00
if err == nil {
t.Errorf("unknown encryption mehtod error expected")
}
})
}
func BenchmarkObfs(b *testing.B) {
testPayload := make([]byte, 1024)
rand.Read(testPayload)
testFrame := &Frame{
1,
0,
0,
testPayload,
2019-08-02 19:50:08 +00:00
}
2019-08-07 16:06:31 +00:00
obfsBuf := make([]byte, 2048)
2019-08-04 09:38:49 +00:00
var key [32]byte
rand.Read(key[:])
b.Run("AES256GCM", func(b *testing.B) {
c, _ := aes.NewCipher(key[:])
payloadCipher, _ := cipher.NewGCM(c)
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, payloadCipher)
b.ResetTimer()
for i := 0; i < b.N; i++ {
2019-08-07 16:06:31 +00:00
n, err := obfs(testFrame, obfsBuf)
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
b.Run("AES128GCM", func(b *testing.B) {
c, _ := aes.NewCipher(key[:16])
payloadCipher, _ := cipher.NewGCM(c)
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, payloadCipher)
b.ResetTimer()
for i := 0; i < b.N; i++ {
2019-08-07 16:06:31 +00:00
n, err := obfs(testFrame, obfsBuf)
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
b.Run("plain", func(b *testing.B) {
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, nil)
b.ResetTimer()
for i := 0; i < b.N; i++ {
2019-08-07 16:06:31 +00:00
n, err := obfs(testFrame, obfsBuf)
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
b.Run("chacha20Poly1305", func(b *testing.B) {
payloadCipher, _ := chacha20poly1305.New(key[:16])
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, payloadCipher)
b.ResetTimer()
for i := 0; i < b.N; i++ {
2019-08-07 16:06:31 +00:00
n, err := obfs(testFrame, obfsBuf)
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
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)
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, payloadCipher)
2019-08-07 16:06:31 +00:00
n, _ := obfs(testFrame, obfsBuf)
2020-04-08 20:47:31 +00:00
deobfs := MakeDeobfs(key, payloadCipher)
2019-08-07 16:06:31 +00:00
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := deobfs(obfsBuf[:n])
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
b.Run("AES128GCM", func(b *testing.B) {
c, _ := aes.NewCipher(key[:16])
payloadCipher, _ := cipher.NewGCM(c)
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, payloadCipher)
2019-08-07 16:06:31 +00:00
n, _ := obfs(testFrame, obfsBuf)
2020-04-08 20:47:31 +00:00
deobfs := MakeDeobfs(key, payloadCipher)
2019-08-07 16:06:31 +00:00
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := deobfs(obfsBuf[:n])
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
b.Run("plain", func(b *testing.B) {
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, nil)
2019-08-07 16:06:31 +00:00
n, _ := obfs(testFrame, obfsBuf)
2020-04-08 20:47:31 +00:00
deobfs := MakeDeobfs(key, nil)
2019-08-07 16:06:31 +00:00
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := deobfs(obfsBuf[:n])
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
b.Run("chacha20Poly1305", func(b *testing.B) {
payloadCipher, _ := chacha20poly1305.New(key[:16])
2020-04-08 20:47:31 +00:00
obfs := MakeObfs(key, payloadCipher)
2019-08-07 16:06:31 +00:00
n, _ := obfs(testFrame, obfsBuf)
2020-04-08 20:47:31 +00:00
deobfs := MakeDeobfs(key, payloadCipher)
2019-08-07 16:06:31 +00:00
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := deobfs(obfsBuf[:n])
if err != nil {
b.Error(err)
2019-08-08 14:08:16 +00:00
return
2019-08-07 16:06:31 +00:00
}
b.SetBytes(int64(n))
}
})
2019-08-02 19:50:08 +00:00
}