github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/binary/tea_test.go (about) 1 package binary 2 3 import ( 4 "bytes" 5 "crypto/rand" 6 "encoding/hex" 7 "testing" 8 9 "github.com/Mrs4s/MiraiGo/utils" 10 ) 11 12 var testTEA = NewTeaCipher([]byte("0123456789ABCDEF")) 13 14 const ( 15 KEY = iota 16 DAT 17 ENC 18 ) 19 20 var sampleData = func() [][3]string { 21 out := [][3]string{ 22 {"0123456789ABCDEF", "MiraiGO Here", "b7b2e52af7f5b1fbf37fc3d5546ac7569aecd01bbacf09bf"}, 23 {"0123456789ABCDEF", "LXY Testing~", "9d0ab85aa14f5434ee83cd2a6b28bf306263cdf88e01264c"}, 24 25 {"0123456789ABCDEF", "s", "528e8b5c48300b548e94262736ebb8b7"}, 26 {"0123456789ABCDEF", "long long long long long long long", "95715fab6efbd0fd4b76dbc80bd633ebe805849dbc242053b06557f87e748effd9f613f782749fb9fdfa3f45c0c26161"}, 27 28 {"LXY1226 Mrs4s", "LXY Testing~", "ab20caa63f3a6503a84f3cb28f9e26b6c18c051e995d1721"}, 29 } 30 for i := range out { 31 c, _ := hex.DecodeString(out[i][ENC]) 32 out[i][ENC] = utils.B2S(c) 33 } 34 return out 35 }() 36 37 func TestTEA(t *testing.T) { 38 // Self Testing 39 for _, sample := range sampleData { 40 tea := NewTeaCipher(utils.S2B(sample[KEY])) 41 dat := utils.B2S(tea.Decrypt(utils.S2B(sample[ENC]))) 42 if dat != sample[DAT] { 43 t.Fatalf("error decrypt %v %x", sample, dat) 44 } 45 enc := utils.B2S(tea.Encrypt(utils.S2B(sample[DAT]))) 46 dat = utils.B2S(tea.Decrypt(utils.S2B(enc))) 47 if dat != sample[DAT] { 48 t.Fatal("error self test", sample) 49 } 50 } 51 52 key := make([]byte, 16) 53 _, err := rand.Read(key) 54 if err != nil { 55 panic(err) 56 } 57 // Random data testing 58 for i := 1; i < 0xFF; i++ { 59 _, err := rand.Read(key) 60 if err != nil { 61 panic(err) 62 } 63 tea := NewTeaCipher(key) 64 65 dat := make([]byte, i) 66 _, err = rand.Read(dat) 67 if err != nil { 68 panic(err) 69 } 70 enc := tea.Encrypt(dat) 71 dec := tea.Decrypt(enc) 72 if !bytes.Equal(dat, dec) { 73 t.Fatalf("error in %d, %x %x %x", i, key, dat, enc) 74 } 75 } 76 } 77 78 func benchEncrypt(b *testing.B, data []byte) { 79 _, err := rand.Read(data) 80 if err != nil { 81 panic(err) 82 } 83 b.SetBytes(int64(len(data))) 84 b.ResetTimer() 85 for i := 0; i < b.N; i++ { 86 testTEA.Encrypt(data) 87 } 88 } 89 90 func benchDecrypt(b *testing.B, data []byte) { 91 _, err := rand.Read(data) 92 if err != nil { 93 panic(err) 94 } 95 data = testTEA.Encrypt(data) 96 b.SetBytes(int64(len(data))) 97 b.ResetTimer() 98 for i := 0; i < b.N; i++ { 99 testTEA.Decrypt(data) 100 } 101 } 102 103 func BenchmarkTEAen(b *testing.B) { 104 b.Run("16", func(b *testing.B) { 105 data := make([]byte, 16) 106 benchEncrypt(b, data) 107 }) 108 b.Run("256", func(b *testing.B) { 109 data := make([]byte, 256) 110 benchEncrypt(b, data) 111 }) 112 b.Run("4K", func(b *testing.B) { 113 data := make([]byte, 1024*4) 114 benchEncrypt(b, data) 115 }) 116 b.Run("32K", func(b *testing.B) { 117 data := make([]byte, 1024*32) 118 benchEncrypt(b, data) 119 }) 120 } 121 122 func BenchmarkTEAde(b *testing.B) { 123 b.Run("16", func(b *testing.B) { 124 data := make([]byte, 16) 125 benchDecrypt(b, data) 126 }) 127 b.Run("256", func(b *testing.B) { 128 data := make([]byte, 256) 129 benchDecrypt(b, data) 130 }) 131 b.Run("4K", func(b *testing.B) { 132 data := make([]byte, 4096) 133 benchDecrypt(b, data) 134 }) 135 b.Run("32K", func(b *testing.B) { 136 data := make([]byte, 1024*32) 137 benchDecrypt(b, data) 138 }) 139 } 140 141 func BenchmarkTEA_encode(b *testing.B) { 142 for i := 0; i < b.N; i++ { 143 testTEA.encode(114514) 144 } 145 } 146 147 func BenchmarkTEA_decode(b *testing.B) { 148 for i := 0; i < b.N; i++ { 149 testTEA.decode(114514) 150 } 151 }