From 2cf8ef20b5cf10534496b42620a7b96b4ced94be Mon Sep 17 00:00:00 2001 From: Juerg Wullschleger Date: Fri, 8 Mar 2024 09:00:16 -0800 Subject: [PATCH] Add Benchmark tests for AEAD in Golang. It tests encrypting and decrypting 16k data with different AEAD primitives. Output on a Xeon CPU: BenchmarkEncryptDecrypt/AES128_GCM-8 23367 53415 ns/op BenchmarkEncryptDecrypt/AES256_GCM-8 21590 53626 ns/op BenchmarkEncryptDecrypt/CHACHA20_POLY1305-8 27309 43254 ns/op BenchmarkEncryptDecrypt/XCHACHA20_POLY1305-8 27746 47047 ns/op BenchmarkEncryptDecrypt/AES128_CTR_HMAC-8 6621 188172 ns/op BenchmarkEncryptDecrypt/AES256_CTR_HMAC-8 6144 180011 ns/op BenchmarkEncryptDecrypt/AES128_GCM_SIV-8 2434 484267 ns/op BenchmarkEncryptDecrypt/AES256_GCM_SIV-8 2368 494740 ns/op PiperOrigin-RevId: 613950607 Change-Id: I30ab2aa975cfe32b41b1cfd7035a29000f1c4512 --- aead/BUILD.bazel | 1 + aead/aead_benchmark_test.go | 88 +++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 aead/aead_benchmark_test.go diff --git a/aead/BUILD.bazel b/aead/BUILD.bazel index 72d6e06..c8502ad 100644 --- a/aead/BUILD.bazel +++ b/aead/BUILD.bazel @@ -51,6 +51,7 @@ go_library( go_test( name = "aead_test", srcs = [ + "aead_benchmark_test.go", "aead_factory_test.go", "aead_init_test.go", "aead_key_templates_test.go", diff --git a/aead/aead_benchmark_test.go b/aead/aead_benchmark_test.go new file mode 100644 index 0000000..d368a24 --- /dev/null +++ b/aead/aead_benchmark_test.go @@ -0,0 +1,88 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ////////////////////////////////////////////////////////////////////////////// + +package aead_test + +import ( + "testing" + + "github.com/tink-crypto/tink-go/v2/aead" + "github.com/tink-crypto/tink-go/v2/keyset" + "github.com/tink-crypto/tink-go/v2/subtle/random" + tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto" +) + +// Benchmarks for AEAD algorithms. + +const plaintextSize = 16 * 1024 +const associatedDataSize = 256 + +func BenchmarkEncryptDecrypt(b *testing.B) { + var testCases = []struct { + name string + template *tinkpb.KeyTemplate + }{ + { + name: "AES128_GCM", + template: aead.AES128GCMKeyTemplate(), + }, { + name: "AES256_GCM", + template: aead.AES256GCMKeyTemplate(), + }, { + name: "CHACHA20_POLY1305", + template: aead.ChaCha20Poly1305KeyTemplate(), + }, { + name: "XCHACHA20_POLY1305", + template: aead.XChaCha20Poly1305KeyTemplate(), + }, { + name: "AES128_CTR_HMAC", + template: aead.AES128CTRHMACSHA256KeyTemplate(), + }, { + name: "AES256_CTR_HMAC", + template: aead.AES256CTRHMACSHA256KeyTemplate(), + }, { + name: "AES128_GCM_SIV", + template: aead.AES128GCMSIVKeyTemplate(), + }, { + name: "AES256_GCM_SIV", + template: aead.AES256GCMSIVKeyTemplate(), + }, + } + for _, tc := range testCases { + b.Run(tc.name, func(b *testing.B) { + handle, err := keyset.NewHandle(tc.template) + if err != nil { + b.Fatal(err) + } + primitive, err := aead.New(handle) + if err != nil { + b.Fatal(err) + } + plaintext := random.GetRandomBytes(plaintextSize) + associatedData := random.GetRandomBytes(associatedDataSize) + b.ResetTimer() + for i := 0; i < b.N; i++ { + ciphertext, err := primitive.Encrypt(plaintext, associatedData) + if err != nil { + b.Fatal(err) + } + if _, err = primitive.Decrypt(ciphertext, associatedData); err != nil { + b.Error(err) + } + } + }) + } +}