Add benchmarks for AES block operations.
While not the most important operation, it is used in QUIC packet number
encryption.
Change-Id: I13a04e7a24d90c30804bb6020547d6060e1e7e87
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/37424
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/tool/speed.cc b/tool/speed.cc
index 3929cf6..160d90f 100644
--- a/tool/speed.cc
+++ b/tool/speed.cc
@@ -25,6 +25,7 @@
#include <string.h>
#include <openssl/aead.h>
+#include <openssl/aes.h>
#include <openssl/bn.h>
#include <openssl/curve25519.h>
#include <openssl/digest.h>
@@ -492,6 +493,75 @@
return true;
}
+static bool SpeedAESBlock(const std::string &name, unsigned bits,
+ const std::string &selected) {
+ if (!selected.empty() && name.find(selected) == std::string::npos) {
+ return true;
+ }
+
+ static const uint8_t kZero[32] = {0};
+
+ {
+ TimeResults results;
+ if (!TimeFunction(&results, [&]() -> bool {
+ AES_KEY key;
+ return AES_set_encrypt_key(kZero, bits, &key) == 0;
+ })) {
+ fprintf(stderr, "AES_set_encrypt_key failed.\n");
+ return false;
+ }
+ results.Print(name + " encrypt setup");
+ }
+
+ {
+ AES_KEY key;
+ if (AES_set_encrypt_key(kZero, bits, &key) != 0) {
+ return false;
+ }
+ uint8_t block[16] = {0};
+ TimeResults results;
+ if (!TimeFunction(&results, [&]() -> bool {
+ AES_encrypt(block, block, &key);
+ return true;
+ })) {
+ fprintf(stderr, "AES_encrypt failed.\n");
+ return false;
+ }
+ results.Print(name + " encrypt");
+ }
+
+ {
+ TimeResults results;
+ if (!TimeFunction(&results, [&]() -> bool {
+ AES_KEY key;
+ return AES_set_decrypt_key(kZero, bits, &key) == 0;
+ })) {
+ fprintf(stderr, "AES_set_decrypt_key failed.\n");
+ return false;
+ }
+ results.Print(name + " decrypt setup");
+ }
+
+ {
+ AES_KEY key;
+ if (AES_set_decrypt_key(kZero, bits, &key) != 0) {
+ return false;
+ }
+ uint8_t block[16] = {0};
+ TimeResults results;
+ if (!TimeFunction(&results, [&]() -> bool {
+ AES_decrypt(block, block, &key);
+ return true;
+ })) {
+ fprintf(stderr, "AES_decrypt failed.\n");
+ return false;
+ }
+ results.Print(name + " decrypt");
+ }
+
+ return true;
+}
+
static bool SpeedHashChunk(const EVP_MD *md, std::string name,
size_t chunk_len) {
bssl::ScopedEVP_MD_CTX ctx;
@@ -991,6 +1061,8 @@
selected) ||
!SpeedAEAD(EVP_aead_aes_128_ccm_bluetooth(), "AES-128-CCM-Bluetooth",
kTLSADLen, selected) ||
+ !SpeedAESBlock("AES-128", 128, selected) ||
+ !SpeedAESBlock("AES-256", 256, selected) ||
!SpeedHash(EVP_sha1(), "SHA-1", selected) ||
!SpeedHash(EVP_sha256(), "SHA-256", selected) ||
!SpeedHash(EVP_sha512(), "SHA-512", selected) ||