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  }