// 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) } }) } }