summaryrefslogtreecommitdiffstats
path: root/src/crypto/cipher/fuzz_test.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-16 19:19:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-16 19:19:13 +0000
commitccd992355df7192993c666236047820244914598 (patch)
treef00fea65147227b7743083c6148396f74cd66935 /src/crypto/cipher/fuzz_test.go
parentInitial commit. (diff)
downloadgolang-1.21-ccd992355df7192993c666236047820244914598.tar.xz
golang-1.21-ccd992355df7192993c666236047820244914598.zip
Adding upstream version 1.21.8.upstream/1.21.8
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/crypto/cipher/fuzz_test.go')
-rw-r--r--src/crypto/cipher/fuzz_test.go103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/crypto/cipher/fuzz_test.go b/src/crypto/cipher/fuzz_test.go
new file mode 100644
index 0000000..ffceeef
--- /dev/null
+++ b/src/crypto/cipher/fuzz_test.go
@@ -0,0 +1,103 @@
+// 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.NewCBCGenericEncrypter(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.NewCBCGenericDecrypter(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)
+ }
+ }
+ }
+}