github.com/geph-official/geph2@v0.22.6-0.20210211030601-f527cb59b0df/libs/kcp-go/crypt_test.go (about)

     1  package kcp
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/aes"
     6  	"crypto/md5"
     7  	"crypto/rand"
     8  	"crypto/sha1"
     9  	"hash/crc32"
    10  	"io"
    11  	"testing"
    12  )
    13  
    14  func TestSM4(t *testing.T) {
    15  	bc, err := NewSM4BlockCrypt(pass[:16])
    16  	if err != nil {
    17  		t.Fatal(err)
    18  	}
    19  	cryptTest(t, bc)
    20  }
    21  
    22  func TestAES(t *testing.T) {
    23  	bc, err := NewAESBlockCrypt(pass[:32])
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  	cryptTest(t, bc)
    28  }
    29  
    30  func TestTEA(t *testing.T) {
    31  	bc, err := NewTEABlockCrypt(pass[:16])
    32  	if err != nil {
    33  		t.Fatal(err)
    34  	}
    35  	cryptTest(t, bc)
    36  }
    37  
    38  func TestXOR(t *testing.T) {
    39  	bc, err := NewSimpleXORBlockCrypt(pass[:32])
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	cryptTest(t, bc)
    44  }
    45  
    46  func TestBlowfish(t *testing.T) {
    47  	bc, err := NewBlowfishBlockCrypt(pass[:32])
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	cryptTest(t, bc)
    52  }
    53  
    54  func TestNone(t *testing.T) {
    55  	bc, err := NewNoneBlockCrypt(pass[:32])
    56  	if err != nil {
    57  		t.Fatal(err)
    58  	}
    59  	cryptTest(t, bc)
    60  }
    61  
    62  func TestCast5(t *testing.T) {
    63  	bc, err := NewCast5BlockCrypt(pass[:16])
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  	cryptTest(t, bc)
    68  }
    69  
    70  func Test3DES(t *testing.T) {
    71  	bc, err := NewTripleDESBlockCrypt(pass[:24])
    72  	if err != nil {
    73  		t.Fatal(err)
    74  	}
    75  	cryptTest(t, bc)
    76  }
    77  
    78  func TestTwofish(t *testing.T) {
    79  	bc, err := NewTwofishBlockCrypt(pass[:32])
    80  	if err != nil {
    81  		t.Fatal(err)
    82  	}
    83  	cryptTest(t, bc)
    84  }
    85  
    86  func TestXTEA(t *testing.T) {
    87  	bc, err := NewXTEABlockCrypt(pass[:16])
    88  	if err != nil {
    89  		t.Fatal(err)
    90  	}
    91  	cryptTest(t, bc)
    92  }
    93  
    94  func TestSalsa20(t *testing.T) {
    95  	bc, err := NewSalsa20BlockCrypt(pass[:32])
    96  	if err != nil {
    97  		t.Fatal(err)
    98  	}
    99  	cryptTest(t, bc)
   100  }
   101  
   102  func cryptTest(t *testing.T, bc BlockCrypt) {
   103  	data := make([]byte, mtuLimit)
   104  	io.ReadFull(rand.Reader, data)
   105  	dec := make([]byte, mtuLimit)
   106  	enc := make([]byte, mtuLimit)
   107  	bc.Encrypt(enc, data)
   108  	bc.Decrypt(dec, enc)
   109  	if !bytes.Equal(data, dec) {
   110  		t.Fail()
   111  	}
   112  }
   113  
   114  func BenchmarkSM4(b *testing.B) {
   115  	bc, err := NewSM4BlockCrypt(pass[:16])
   116  	if err != nil {
   117  		b.Fatal(err)
   118  	}
   119  	benchCrypt(b, bc)
   120  }
   121  
   122  func BenchmarkAES128(b *testing.B) {
   123  	bc, err := NewAESBlockCrypt(pass[:16])
   124  	if err != nil {
   125  		b.Fatal(err)
   126  	}
   127  
   128  	benchCrypt(b, bc)
   129  }
   130  
   131  func BenchmarkAES192(b *testing.B) {
   132  	bc, err := NewAESBlockCrypt(pass[:24])
   133  	if err != nil {
   134  		b.Fatal(err)
   135  	}
   136  
   137  	benchCrypt(b, bc)
   138  }
   139  
   140  func BenchmarkAES256(b *testing.B) {
   141  	bc, err := NewAESBlockCrypt(pass[:32])
   142  	if err != nil {
   143  		b.Fatal(err)
   144  	}
   145  
   146  	benchCrypt(b, bc)
   147  }
   148  
   149  func BenchmarkTEA(b *testing.B) {
   150  	bc, err := NewTEABlockCrypt(pass[:16])
   151  	if err != nil {
   152  		b.Fatal(err)
   153  	}
   154  	benchCrypt(b, bc)
   155  }
   156  
   157  func BenchmarkXOR(b *testing.B) {
   158  	bc, err := NewSimpleXORBlockCrypt(pass[:32])
   159  	if err != nil {
   160  		b.Fatal(err)
   161  	}
   162  	benchCrypt(b, bc)
   163  }
   164  
   165  func BenchmarkBlowfish(b *testing.B) {
   166  	bc, err := NewBlowfishBlockCrypt(pass[:32])
   167  	if err != nil {
   168  		b.Fatal(err)
   169  	}
   170  	benchCrypt(b, bc)
   171  }
   172  
   173  func BenchmarkNone(b *testing.B) {
   174  	bc, err := NewNoneBlockCrypt(pass[:32])
   175  	if err != nil {
   176  		b.Fatal(err)
   177  	}
   178  	benchCrypt(b, bc)
   179  }
   180  
   181  func BenchmarkCast5(b *testing.B) {
   182  	bc, err := NewCast5BlockCrypt(pass[:16])
   183  	if err != nil {
   184  		b.Fatal(err)
   185  	}
   186  	benchCrypt(b, bc)
   187  }
   188  
   189  func Benchmark3DES(b *testing.B) {
   190  	bc, err := NewTripleDESBlockCrypt(pass[:24])
   191  	if err != nil {
   192  		b.Fatal(err)
   193  	}
   194  	benchCrypt(b, bc)
   195  }
   196  
   197  func BenchmarkTwofish(b *testing.B) {
   198  	bc, err := NewTwofishBlockCrypt(pass[:32])
   199  	if err != nil {
   200  		b.Fatal(err)
   201  	}
   202  	benchCrypt(b, bc)
   203  }
   204  
   205  func BenchmarkXTEA(b *testing.B) {
   206  	bc, err := NewXTEABlockCrypt(pass[:16])
   207  	if err != nil {
   208  		b.Fatal(err)
   209  	}
   210  	benchCrypt(b, bc)
   211  }
   212  
   213  func BenchmarkSalsa20(b *testing.B) {
   214  	bc, err := NewSalsa20BlockCrypt(pass[:32])
   215  	if err != nil {
   216  		b.Fatal(err)
   217  	}
   218  	benchCrypt(b, bc)
   219  }
   220  
   221  func benchCrypt(b *testing.B, bc BlockCrypt) {
   222  	data := make([]byte, mtuLimit)
   223  	io.ReadFull(rand.Reader, data)
   224  	dec := make([]byte, mtuLimit)
   225  	enc := make([]byte, mtuLimit)
   226  
   227  	b.ReportAllocs()
   228  	b.SetBytes(int64(len(enc) * 2))
   229  	b.ResetTimer()
   230  	for i := 0; i < b.N; i++ {
   231  		bc.Encrypt(enc, data)
   232  		bc.Decrypt(dec, enc)
   233  	}
   234  }
   235  
   236  func BenchmarkCRC32(b *testing.B) {
   237  	content := make([]byte, 1024)
   238  	b.SetBytes(int64(len(content)))
   239  	for i := 0; i < b.N; i++ {
   240  		crc32.ChecksumIEEE(content)
   241  	}
   242  }
   243  
   244  func BenchmarkCsprngSystem(b *testing.B) {
   245  	data := make([]byte, md5.Size)
   246  	b.SetBytes(int64(len(data)))
   247  
   248  	for i := 0; i < b.N; i++ {
   249  		io.ReadFull(rand.Reader, data)
   250  	}
   251  }
   252  
   253  func BenchmarkCsprngMD5(b *testing.B) {
   254  	var data [md5.Size]byte
   255  	b.SetBytes(md5.Size)
   256  
   257  	for i := 0; i < b.N; i++ {
   258  		data = md5.Sum(data[:])
   259  	}
   260  }
   261  func BenchmarkCsprngSHA1(b *testing.B) {
   262  	var data [sha1.Size]byte
   263  	b.SetBytes(sha1.Size)
   264  
   265  	for i := 0; i < b.N; i++ {
   266  		data = sha1.Sum(data[:])
   267  	}
   268  }
   269  
   270  func BenchmarkCsprngNonceMD5(b *testing.B) {
   271  	var ng nonceMD5
   272  	ng.Init()
   273  	b.SetBytes(md5.Size)
   274  	data := make([]byte, md5.Size)
   275  	for i := 0; i < b.N; i++ {
   276  		ng.Fill(data)
   277  	}
   278  }
   279  
   280  func BenchmarkCsprngNonceAES128(b *testing.B) {
   281  	var ng nonceAES128
   282  	ng.Init()
   283  
   284  	b.SetBytes(aes.BlockSize)
   285  	data := make([]byte, aes.BlockSize)
   286  	for i := 0; i < b.N; i++ {
   287  		ng.Fill(data)
   288  	}
   289  }