github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/crypto/cipher/xor_test.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package cipher_test 6 7 import ( 8 "bytes" 9 "crypto/cipher" 10 "crypto/rand" 11 "fmt" 12 "io" 13 "testing" 14 ) 15 16 func TestXOR(t *testing.T) { 17 for j := 1; j <= 1024; j++ { 18 for alignP := 0; alignP < 2; alignP++ { 19 for alignQ := 0; alignQ < 2; alignQ++ { 20 for alignD := 0; alignD < 2; alignD++ { 21 p := make([]byte, j)[alignP:] 22 q := make([]byte, j)[alignQ:] 23 d1 := make([]byte, j+alignD)[alignD:] 24 d2 := make([]byte, j+alignD)[alignD:] 25 if _, err := io.ReadFull(rand.Reader, p); err != nil { 26 t.Fatal(err) 27 } 28 if _, err := io.ReadFull(rand.Reader, q); err != nil { 29 t.Fatal(err) 30 } 31 cipher.XorBytes(d1, p, q) 32 n := min(p, q) 33 for i := 0; i < n; i++ { 34 d2[i] = p[i] ^ q[i] 35 } 36 if !bytes.Equal(d1, d2) { 37 t.Logf("p: %#v", p) 38 t.Logf("q: %#v", q) 39 t.Logf("expect: %#v", d2) 40 t.Logf("result: %#v", d1) 41 t.Fatal("not equal") 42 } 43 } 44 } 45 } 46 } 47 } 48 49 func min(a, b []byte) int { 50 n := len(a) 51 if len(b) < n { 52 n = len(b) 53 } 54 return n 55 } 56 57 func BenchmarkXORBytes(b *testing.B) { 58 dst := make([]byte, 1<<15) 59 data0 := make([]byte, 1<<15) 60 data1 := make([]byte, 1<<15) 61 sizes := []int64{1 << 3, 1 << 7, 1 << 11, 1 << 15} 62 for _, size := range sizes { 63 b.Run(fmt.Sprintf("%dBytes", size), func(b *testing.B) { 64 s0 := data0[:size] 65 s1 := data1[:size] 66 b.SetBytes(int64(size)) 67 for i := 0; i < b.N; i++ { 68 cipher.XorBytes(dst, s0, s1) 69 } 70 }) 71 } 72 }