aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/cipher
diff options
context:
space:
mode:
authorqmuntal <quimmuntal@gmail.com>2023-09-01 09:26:56 +0200
committerQuim Muntal <quimmuntal@gmail.com>2023-10-23 19:41:39 +0000
commite46e8610aba89ed91896ab6ccc5349636e0b4df2 (patch)
treee19b0c1c0b532229c3403970f512ab9024c085b5 /src/crypto/cipher
parentc65f74d339169a5597c64a0076c17905c85b37d8 (diff)
downloadgo-e46e8610aba89ed91896ab6ccc5349636e0b4df2.tar.xz
crypto/internal/boring: use noescape and nocallback cgo directives
The new noescape and nocallback directives can be used instead of the C wrapper functions that are there just to avoid some parameters being escaped to the heap. This CL also helps demonstrate the use of the new directives in real code. I've added some benchmarks to demonstrate that this CL doesn't introduce new heap allocations when using boringcrypto: ``` goos: linux goarch: amd64 pkg: crypto/aes cpu: AMD EPYC 7763 64-Core Processor BenchmarkGCMSeal-32 8378692 143.3 ns/op 111.65 MB/s 0 B/op 0 allocs/op BenchmarkGCMOpen-32 8383038 142.7 ns/op 112.11 MB/s 0 B/op 0 allocs/op ``` Change-Id: Ifd775484eb9a105afc5c3d4e75a6c6655cbadc53 Reviewed-on: https://go-review.googlesource.com/c/go/+/525035 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Quim Muntal <quimmuntal@gmail.com> Reviewed-by: Roland Shoemaker <roland@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/crypto/cipher')
-rw-r--r--src/crypto/cipher/gcm_test.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/crypto/cipher/gcm_test.go b/src/crypto/cipher/gcm_test.go
index 3556146ea6..7b9d1852d7 100644
--- a/src/crypto/cipher/gcm_test.go
+++ b/src/crypto/cipher/gcm_test.go
@@ -654,3 +654,39 @@ func TestGCMAsm(t *testing.T) {
}
}
}
+
+func BenchmarkGCMSeal(b *testing.B) {
+ key, _ := hex.DecodeString("ab72c77b97cb5fe9a382d9fe81ffdbed")
+ nonce, _ := hex.DecodeString("54cc7dc2c37ec006bcc6d1db")
+ plaintext, _ := hex.DecodeString("f1cc3818e421876bb6b8bbd6c9")
+
+ aes, _ := aes.NewCipher(key)
+ aesgcm, _ := cipher.NewGCM(aes)
+
+ ciphertext := make([]byte, 32)
+ b.SetBytes(int64(len(plaintext)))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ _ = aesgcm.Seal(ciphertext[:0], nonce, plaintext, nil)
+ }
+}
+
+func BenchmarkGCMOpen(b *testing.B) {
+ key, _ := hex.DecodeString("ab72c77b97cb5fe9a382d9fe81ffdbed")
+ nonce, _ := hex.DecodeString("54cc7dc2c37ec006bcc6d1db")
+ plaintext, _ := hex.DecodeString("f1cc3818e421876bb6b8bbd6c9")
+
+ aes, _ := aes.NewCipher(key)
+ aesgcm, _ := cipher.NewGCM(aes)
+
+ ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
+
+ b.SetBytes(int64(len(ciphertext)))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ _, err := aesgcm.Open(plaintext[:0], nonce, ciphertext, nil)
+ if err != nil {
+ b.Fatal(err)
+ }
+ }
+}