crypt_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package kcp
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "hash/crc32"
  6. "io"
  7. "testing"
  8. )
  9. func TestSM4(t *testing.T) {
  10. bc, err := NewSM4BlockCrypt(pass[:16])
  11. if err != nil {
  12. t.Fatal(err)
  13. }
  14. cryptTest(t, bc)
  15. }
  16. func TestAES(t *testing.T) {
  17. bc, err := NewAESBlockCrypt(pass[:32])
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. cryptTest(t, bc)
  22. }
  23. func TestTEA(t *testing.T) {
  24. bc, err := NewTEABlockCrypt(pass[:16])
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. cryptTest(t, bc)
  29. }
  30. func TestXOR(t *testing.T) {
  31. bc, err := NewSimpleXORBlockCrypt(pass[:32])
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. cryptTest(t, bc)
  36. }
  37. func TestBlowfish(t *testing.T) {
  38. bc, err := NewBlowfishBlockCrypt(pass[:32])
  39. if err != nil {
  40. t.Fatal(err)
  41. }
  42. cryptTest(t, bc)
  43. }
  44. func TestNone(t *testing.T) {
  45. bc, err := NewNoneBlockCrypt(pass[:32])
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. cryptTest(t, bc)
  50. }
  51. func TestCast5(t *testing.T) {
  52. bc, err := NewCast5BlockCrypt(pass[:16])
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. cryptTest(t, bc)
  57. }
  58. func Test3DES(t *testing.T) {
  59. bc, err := NewTripleDESBlockCrypt(pass[:24])
  60. if err != nil {
  61. t.Fatal(err)
  62. }
  63. cryptTest(t, bc)
  64. }
  65. func TestTwofish(t *testing.T) {
  66. bc, err := NewTwofishBlockCrypt(pass[:32])
  67. if err != nil {
  68. t.Fatal(err)
  69. }
  70. cryptTest(t, bc)
  71. }
  72. func TestXTEA(t *testing.T) {
  73. bc, err := NewXTEABlockCrypt(pass[:16])
  74. if err != nil {
  75. t.Fatal(err)
  76. }
  77. cryptTest(t, bc)
  78. }
  79. func TestSalsa20(t *testing.T) {
  80. bc, err := NewSalsa20BlockCrypt(pass[:32])
  81. if err != nil {
  82. t.Fatal(err)
  83. }
  84. cryptTest(t, bc)
  85. }
  86. func cryptTest(t *testing.T, bc BlockCrypt) {
  87. data := make([]byte, mtuLimit)
  88. io.ReadFull(rand.Reader, data)
  89. dec := make([]byte, mtuLimit)
  90. enc := make([]byte, mtuLimit)
  91. bc.Encrypt(enc, data)
  92. bc.Decrypt(dec, enc)
  93. if !bytes.Equal(data, dec) {
  94. t.Fail()
  95. }
  96. }
  97. func BenchmarkSM4(b *testing.B) {
  98. bc, err := NewSM4BlockCrypt(pass[:16])
  99. if err != nil {
  100. b.Fatal(err)
  101. }
  102. benchCrypt(b, bc)
  103. }
  104. func BenchmarkAES128(b *testing.B) {
  105. bc, err := NewAESBlockCrypt(pass[:16])
  106. if err != nil {
  107. b.Fatal(err)
  108. }
  109. benchCrypt(b, bc)
  110. }
  111. func BenchmarkAES192(b *testing.B) {
  112. bc, err := NewAESBlockCrypt(pass[:24])
  113. if err != nil {
  114. b.Fatal(err)
  115. }
  116. benchCrypt(b, bc)
  117. }
  118. func BenchmarkAES256(b *testing.B) {
  119. bc, err := NewAESBlockCrypt(pass[:32])
  120. if err != nil {
  121. b.Fatal(err)
  122. }
  123. benchCrypt(b, bc)
  124. }
  125. func BenchmarkTEA(b *testing.B) {
  126. bc, err := NewTEABlockCrypt(pass[:16])
  127. if err != nil {
  128. b.Fatal(err)
  129. }
  130. benchCrypt(b, bc)
  131. }
  132. func BenchmarkXOR(b *testing.B) {
  133. bc, err := NewSimpleXORBlockCrypt(pass[:32])
  134. if err != nil {
  135. b.Fatal(err)
  136. }
  137. benchCrypt(b, bc)
  138. }
  139. func BenchmarkBlowfish(b *testing.B) {
  140. bc, err := NewBlowfishBlockCrypt(pass[:32])
  141. if err != nil {
  142. b.Fatal(err)
  143. }
  144. benchCrypt(b, bc)
  145. }
  146. func BenchmarkNone(b *testing.B) {
  147. bc, err := NewNoneBlockCrypt(pass[:32])
  148. if err != nil {
  149. b.Fatal(err)
  150. }
  151. benchCrypt(b, bc)
  152. }
  153. func BenchmarkCast5(b *testing.B) {
  154. bc, err := NewCast5BlockCrypt(pass[:16])
  155. if err != nil {
  156. b.Fatal(err)
  157. }
  158. benchCrypt(b, bc)
  159. }
  160. func Benchmark3DES(b *testing.B) {
  161. bc, err := NewTripleDESBlockCrypt(pass[:24])
  162. if err != nil {
  163. b.Fatal(err)
  164. }
  165. benchCrypt(b, bc)
  166. }
  167. func BenchmarkTwofish(b *testing.B) {
  168. bc, err := NewTwofishBlockCrypt(pass[:32])
  169. if err != nil {
  170. b.Fatal(err)
  171. }
  172. benchCrypt(b, bc)
  173. }
  174. func BenchmarkXTEA(b *testing.B) {
  175. bc, err := NewXTEABlockCrypt(pass[:16])
  176. if err != nil {
  177. b.Fatal(err)
  178. }
  179. benchCrypt(b, bc)
  180. }
  181. func BenchmarkSalsa20(b *testing.B) {
  182. bc, err := NewSalsa20BlockCrypt(pass[:32])
  183. if err != nil {
  184. b.Fatal(err)
  185. }
  186. benchCrypt(b, bc)
  187. }
  188. func benchCrypt(b *testing.B, bc BlockCrypt) {
  189. b.ReportAllocs()
  190. data := make([]byte, mtuLimit)
  191. io.ReadFull(rand.Reader, data)
  192. dec := make([]byte, mtuLimit)
  193. enc := make([]byte, mtuLimit)
  194. for i := 0; i < b.N; i++ {
  195. bc.Encrypt(enc, data)
  196. bc.Decrypt(dec, enc)
  197. }
  198. b.SetBytes(int64(len(enc) * 2))
  199. }
  200. func BenchmarkCRC32(b *testing.B) {
  201. content := make([]byte, 1024)
  202. b.SetBytes(int64(len(content)))
  203. for i := 0; i < b.N; i++ {
  204. crc32.ChecksumIEEE(content)
  205. }
  206. }