Cloak/internal/multiplex/obfs_test.go
2019-08-03 22:05:06 +01:00

110 lines
2.3 KiB
Go

package multiplex
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"golang.org/x/crypto/chacha20poly1305"
"math/rand"
"reflect"
"testing"
"testing/quick"
)
func TestOobfs(t *testing.T) {
sessionKey := make([]byte, 32)
rand.Read(sessionKey)
run := func(obfuscator *Obfuscator) {
f := &Frame{}
_testFrame, _ := quick.Value(reflect.TypeOf(f), rand.New(rand.NewSource(42)))
testFrame := _testFrame.Interface().(*Frame)
obfsed, err := obfuscator.Obfs(testFrame)
if err != nil {
t.Error("failed to obfs ", err)
}
resultFrame, err := obfuscator.Deobfs(obfsed)
if err != nil {
t.Error("failed to deobfs ", err)
}
if !bytes.Equal(testFrame.Payload, resultFrame.Payload) || testFrame.StreamID != resultFrame.StreamID {
t.Error("expecting", testFrame,
"got", resultFrame)
}
}
t.Run("plain", func(t *testing.T) {
obfuscator, err := GenerateObfs(0x01, sessionKey)
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
}
run(obfuscator)
})
t.Run("aes-gcm", func(t *testing.T) {
obfuscator, err := GenerateObfs(0x01, sessionKey)
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
}
run(obfuscator)
})
t.Run("chacha20-poly1305", func(t *testing.T) {
obfuscator, err := GenerateObfs(0x01, sessionKey)
if err != nil {
t.Errorf("failed to generate obfuscator %v", err)
}
run(obfuscator)
})
}
func BenchmarkObfs(b *testing.B) {
testPayload := make([]byte, 1024)
rand.Read(testPayload)
testFrame := &Frame{
1,
0,
0,
testPayload,
}
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)
b.ResetTimer()
for i := 0; i < b.N; i++ {
obfs(testFrame)
}
})
b.Run("AES128GCM", func(b *testing.B) {
c, _ := aes.NewCipher(key[:16])
payloadCipher, _ := cipher.NewGCM(c)
obfs := MakeObfs(key, payloadCipher)
b.ResetTimer()
for i := 0; i < b.N; i++ {
obfs(testFrame)
}
})
b.Run("plain", func(b *testing.B) {
obfs := MakeObfs(key, nil)
b.ResetTimer()
for i := 0; i < b.N; i++ {
obfs(testFrame)
}
})
b.Run("chacha20Poly1305", func(b *testing.B) {
payloadCipher, _ := chacha20poly1305.New(key[:16])
obfs := MakeObfs(key, payloadCipher)
b.ResetTimer()
for i := 0; i < b.N; i++ {
obfs(testFrame)
}
})
}