| // Copyright 2021 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. | |
| //go:build ppc64le | |
| package cipher_test | |
| import ( | |
| "bytes" | |
| "crypto/aes" | |
| "crypto/cipher" | |
| "crypto/rand" | |
| "testing" | |
| "time" | |
| ) | |
| var cbcAESFuzzTests = []struct { | |
| name string | |
| key []byte | |
| }{ | |
| { | |
| "CBC-AES128", | |
| commonKey128, | |
| }, | |
| { | |
| "CBC-AES192", | |
| commonKey192, | |
| }, | |
| { | |
| "CBC-AES256", | |
| commonKey256, | |
| }, | |
| } | |
| var timeout *time.Timer | |
| const datalen = 1024 | |
| func TestFuzz(t *testing.T) { | |
| for _, ft := range cbcAESFuzzTests { | |
| c, _ := aes.NewCipher(ft.key) | |
| cbcAsm := cipher.NewCBCEncrypter(c, commonIV) | |
| cbcGeneric := cipher.NewCBCEncrypter(wrap(c), commonIV) | |
| if testing.Short() { | |
| timeout = time.NewTimer(10 * time.Millisecond) | |
| } else { | |
| timeout = time.NewTimer(2 * time.Second) | |
| } | |
| indata := make([]byte, datalen) | |
| outgeneric := make([]byte, datalen) | |
| outdata := make([]byte, datalen) | |
| fuzzencrypt: | |
| for { | |
| select { | |
| case <-timeout.C: | |
| break fuzzencrypt | |
| default: | |
| } | |
| rand.Read(indata[:]) | |
| cbcGeneric.CryptBlocks(indata, outgeneric) | |
| cbcAsm.CryptBlocks(indata, outdata) | |
| if !bytes.Equal(outdata, outgeneric) { | |
| t.Fatalf("AES-CBC encryption does not match reference result: %x and %x, please report this error to security@golang.org", outdata, outgeneric) | |
| } | |
| } | |
| cbcAsm = cipher.NewCBCDecrypter(c, commonIV) | |
| cbcGeneric = cipher.NewCBCDecrypter(wrap(c), commonIV) | |
| if testing.Short() { | |
| timeout = time.NewTimer(10 * time.Millisecond) | |
| } else { | |
| timeout = time.NewTimer(2 * time.Second) | |
| } | |
| fuzzdecrypt: | |
| for { | |
| select { | |
| case <-timeout.C: | |
| break fuzzdecrypt | |
| default: | |
| } | |
| rand.Read(indata[:]) | |
| cbcGeneric.CryptBlocks(indata, outgeneric) | |
| cbcAsm.CryptBlocks(indata, outdata) | |
| if !bytes.Equal(outdata, outgeneric) { | |
| t.Fatalf("AES-CBC decryption does not match reference result: %x and %x, please report this error to security@golang.org", outdata, outgeneric) | |
| } | |
| } | |
| } | |
| } |