1
0
mirror of https://github.com/golang/go synced 2024-11-23 21:00:06 -07:00

crypto/cipher: 8K benchmarks for AES stream modes

Some parallelizable cipher modes may achieve peak performance for larger
block sizes. For this reason the AES-GCM mode already has an 8K
benchmark alongside the 1K version. This change introduces 8K benchmarks
for additional AES stream cipher modes.

Updates #20967

Change-Id: If97c6fbf31222602dcc200f8f418d95908ec1202
Reviewed-on: https://go-review.googlesource.com/136897
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Filippo Valsorda <filippo@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Michael McLoughlin 2018-09-23 20:29:33 -07:00 committed by Filippo Valsorda
parent 699da6bd13
commit 4a0dad211c

View File

@ -81,70 +81,49 @@ func BenchmarkAESGCMOpen8K(b *testing.B) {
benchmarkAESGCMOpen(b, make([]byte, 8*1024))
}
func benchmarkAESStream(b *testing.B, mode func(cipher.Block, []byte) cipher.Stream, buf []byte) {
b.SetBytes(int64(len(buf)))
var key [16]byte
var iv [16]byte
aes, _ := aes.NewCipher(key[:])
stream := mode(aes, iv[:])
b.ResetTimer()
for i := 0; i < b.N; i++ {
stream.XORKeyStream(buf, buf)
}
}
// If we test exactly 1K blocks, we would generate exact multiples of
// the cipher's block size, and the cipher stream fragments would
// always be wordsize aligned, whereas non-aligned is a more typical
// use-case.
const almost1K = 1024 - 5
const almost8K = 8*1024 - 5
func BenchmarkAESCFBEncrypt1K(b *testing.B) {
buf := make([]byte, almost1K)
b.SetBytes(int64(len(buf)))
var key [16]byte
var iv [16]byte
aes, _ := aes.NewCipher(key[:])
ctr := cipher.NewCFBEncrypter(aes, iv[:])
b.ResetTimer()
for i := 0; i < b.N; i++ {
ctr.XORKeyStream(buf, buf)
}
benchmarkAESStream(b, cipher.NewCFBEncrypter, make([]byte, almost1K))
}
func BenchmarkAESCFBDecrypt1K(b *testing.B) {
buf := make([]byte, almost1K)
b.SetBytes(int64(len(buf)))
benchmarkAESStream(b, cipher.NewCFBDecrypter, make([]byte, almost1K))
}
var key [16]byte
var iv [16]byte
aes, _ := aes.NewCipher(key[:])
ctr := cipher.NewCFBDecrypter(aes, iv[:])
b.ResetTimer()
for i := 0; i < b.N; i++ {
ctr.XORKeyStream(buf, buf)
}
func BenchmarkAESCFBDecrypt8K(b *testing.B) {
benchmarkAESStream(b, cipher.NewCFBDecrypter, make([]byte, almost8K))
}
func BenchmarkAESOFB1K(b *testing.B) {
buf := make([]byte, almost1K)
b.SetBytes(int64(len(buf)))
var key [16]byte
var iv [16]byte
aes, _ := aes.NewCipher(key[:])
ctr := cipher.NewOFB(aes, iv[:])
b.ResetTimer()
for i := 0; i < b.N; i++ {
ctr.XORKeyStream(buf, buf)
}
benchmarkAESStream(b, cipher.NewOFB, make([]byte, almost1K))
}
func BenchmarkAESCTR1K(b *testing.B) {
buf := make([]byte, almost1K)
b.SetBytes(int64(len(buf)))
benchmarkAESStream(b, cipher.NewCTR, make([]byte, almost1K))
}
var key [16]byte
var iv [16]byte
aes, _ := aes.NewCipher(key[:])
ctr := cipher.NewCTR(aes, iv[:])
b.ResetTimer()
for i := 0; i < b.N; i++ {
ctr.XORKeyStream(buf, buf)
}
func BenchmarkAESCTR8K(b *testing.B) {
benchmarkAESStream(b, cipher.NewCTR, make([]byte, almost8K))
}
func BenchmarkAESCBCEncrypt1K(b *testing.B) {