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) ||