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