mirror of
https://github.com/xtaci/kcp-go.git
synced 2024-04-21 12:32:15 +00:00
427 lines
8.7 KiB
Go
427 lines
8.7 KiB
Go
package kcp
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"crypto/sha1"
|
|
"io"
|
|
"testing"
|
|
|
|
"golang.org/x/crypto/pbkdf2"
|
|
)
|
|
|
|
const cryptKey = "testkey"
|
|
const cryptSalt = "kcptest"
|
|
|
|
func TestAES(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 32, sha1.New)
|
|
bc, err := NewAESBlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkAES128(b *testing.B) {
|
|
pass := make([]byte, 16)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewAESBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func BenchmarkAES192(b *testing.B) {
|
|
pass := make([]byte, 24)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewAESBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func BenchmarkAES256(b *testing.B) {
|
|
pass := make([]byte, 32)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewAESBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestTEA(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 16, sha1.New)
|
|
bc, err := NewTEABlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
|
|
}
|
|
|
|
func BenchmarkTEA(b *testing.B) {
|
|
pass := make([]byte, 16)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewTEABlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestXOR(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 32, sha1.New)
|
|
bc, err := NewSimpleXORBlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkXOR(b *testing.B) {
|
|
pass := make([]byte, 32)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewSimpleXORBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestBlowfish(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 32, sha1.New)
|
|
bc, err := NewBlowfishBlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkBlowfish(b *testing.B) {
|
|
pass := make([]byte, 32)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewBlowfishBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestNone(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 32, sha1.New)
|
|
bc, err := NewNoneBlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkNone(b *testing.B) {
|
|
pass := make([]byte, 32)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewNoneBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestCast5(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 16, sha1.New)
|
|
bc, err := NewCast5BlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkCast5(b *testing.B) {
|
|
pass := make([]byte, 16)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewCast5BlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func Test3DES(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 24, sha1.New)
|
|
bc, err := NewTripleDESBlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func Benchmark3DES(b *testing.B) {
|
|
pass := make([]byte, 24)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewTripleDESBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestTwofish(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 32, sha1.New)
|
|
bc, err := NewTwofishBlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkTwofish(b *testing.B) {
|
|
pass := make([]byte, 32)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewTwofishBlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestXTEA(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 16, sha1.New)
|
|
bc, err := NewXTEABlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
|
|
}
|
|
|
|
func BenchmarkXTEA(b *testing.B) {
|
|
pass := make([]byte, 16)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewXTEABlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|
|
|
|
func TestSalsa20(t *testing.T) {
|
|
pass := pbkdf2.Key(key, []byte(portSink), 4096, 32, sha1.New)
|
|
bc, err := NewSalsa20BlockCrypt(pass)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
if !bytes.Equal(data, dec) {
|
|
t.Fail()
|
|
}
|
|
}
|
|
|
|
func BenchmarkSalsa20(b *testing.B) {
|
|
pass := make([]byte, 32)
|
|
io.ReadFull(rand.Reader, pass)
|
|
bc, err := NewSalsa20BlockCrypt(pass)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
data := make([]byte, mtuLimit)
|
|
io.ReadFull(rand.Reader, data)
|
|
dec := make([]byte, mtuLimit)
|
|
enc := make([]byte, mtuLimit)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
bc.Encrypt(enc, data)
|
|
bc.Decrypt(dec, enc)
|
|
}
|
|
b.SetBytes(int64(len(enc) * 2))
|
|
}
|