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 }