| // Copyright 2013 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package cipher_test |
| |
| import ( |
| "bytes" |
| "crypto/cipher" |
| "crypto/rand" |
| "fmt" |
| "io" |
| "testing" |
| ) |
| |
| func TestXOR(t *testing.T) { |
| for j := 1; j <= 1024; j++ { |
| if testing.Short() && j > 16 { |
| break |
| } |
| for alignP := 0; alignP < 2; alignP++ { |
| for alignQ := 0; alignQ < 2; alignQ++ { |
| for alignD := 0; alignD < 2; alignD++ { |
| p := make([]byte, j)[alignP:] |
| q := make([]byte, j)[alignQ:] |
| d1 := make([]byte, j+alignD)[alignD:] |
| d2 := make([]byte, j+alignD)[alignD:] |
| if _, err := io.ReadFull(rand.Reader, p); err != nil { |
| t.Fatal(err) |
| } |
| if _, err := io.ReadFull(rand.Reader, q); err != nil { |
| t.Fatal(err) |
| } |
| cipher.XorBytes(d1, p, q) |
| n := min(p, q) |
| for i := 0; i < n; i++ { |
| d2[i] = p[i] ^ q[i] |
| } |
| if !bytes.Equal(d1, d2) { |
| t.Logf("p: %#v", p) |
| t.Logf("q: %#v", q) |
| t.Logf("expect: %#v", d2) |
| t.Logf("result: %#v", d1) |
| t.Fatal("not equal") |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| func min(a, b []byte) int { |
| n := len(a) |
| if len(b) < n { |
| n = len(b) |
| } |
| return n |
| } |
| |
| func BenchmarkXORBytes(b *testing.B) { |
| dst := make([]byte, 1<<15) |
| data0 := make([]byte, 1<<15) |
| data1 := make([]byte, 1<<15) |
| sizes := []int64{1 << 3, 1 << 7, 1 << 11, 1 << 15} |
| for _, size := range sizes { |
| b.Run(fmt.Sprintf("%dBytes", size), func(b *testing.B) { |
| s0 := data0[:size] |
| s1 := data1[:size] |
| b.SetBytes(int64(size)) |
| for i := 0; i < b.N; i++ { |
| cipher.XorBytes(dst, s0, s1) |
| } |
| }) |
| } |
| } |