From 2342ade23c3e8a8855cfb55f9b15818978bfb333 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Thu, 18 Jun 2026 18:22:01 +0200 Subject: switch to if constexpr (..) to remove clutter --- aesxx/include/aesxx/api.hpp | 66 +++++++++---------------------------------- aesxx/include/aesxx/mode.hpp | 21 +++----------- aesxx/utils/block_dumper.hpp | 30 ++++++-------------- aesxx/utils/decrypt_block.cpp | 2 +- aesxx/utils/encrypt_block.cpp | 2 +- 5 files changed, 27 insertions(+), 94 deletions(-) diff --git a/aesxx/include/aesxx/api.hpp b/aesxx/include/aesxx/api.hpp index 1797a85..70891c9 100644 --- a/aesxx/include/aesxx/api.hpp +++ b/aesxx/include/aesxx/api.hpp @@ -48,72 +48,32 @@ void derive_decryption_keys( typename Types::RoundKeys& decryption_keys ); -template < - Algorithm algorithm, - Mode mode, - typename std::enable_if::value>::type* = nullptr> +template void encrypt_block( const typename Types::Block& plaintext, const typename Types::RoundKeys& round_keys, typename Types::Block& iv, typename Types::Block& ciphertext -); - -template < - Algorithm algorithm, - Mode mode, - typename std::enable_if::value>::type* = nullptr> -void encrypt_block( - const typename Types::Block& plaintext, - const typename Types::RoundKeys& round_keys, - typename Types::Block& ciphertext -); - -template < - Algorithm algorithm, - Mode mode, - typename std::enable_if::value>::type* = nullptr> -void encrypt_block( - const typename Types::Block& plaintext, - const typename Types::RoundKeys& round_keys, - typename Types::Block&, - typename Types::Block& ciphertext ) { - encrypt_block(plaintext, round_keys, ciphertext); + if constexpr (mode_requires_init_vector(mode)) { + encrypt_block(plaintext, round_keys, iv, ciphertext); + } else { + encrypt_block(plaintext, round_keys, ciphertext); + } } -template < - Algorithm algorithm, - Mode mode, - typename std::enable_if::value>::type* = nullptr> +template void decrypt_block( const typename Types::Block& ciphertext, const typename Types::RoundKeys& round_keys, typename Types::Block& iv, typename Types::Block& plaintext -); - -template < - Algorithm algorithm, - Mode mode, - typename std::enable_if::value>::type* = nullptr> -void decrypt_block( - const typename Types::Block& ciphertext, - const typename Types::RoundKeys& round_keys, - typename Types::Block& plaintext -); - -template < - Algorithm algorithm, - Mode mode, - typename std::enable_if::value>::type* = nullptr> -void decrypt_block( - const typename Types::Block& ciphertext, - const typename Types::RoundKeys& round_keys, - typename Types::Block&, - typename Types::Block& plaintext ) { - decrypt_block(ciphertext, round_keys, plaintext); + if constexpr (mode_requires_init_vector(mode)) { + encrypt_block(plaintext, round_keys, iv, ciphertext); + } else { + encrypt_block(plaintext, round_keys, ciphertext); + } } template @@ -147,7 +107,7 @@ struct DecryptWrapper { typename Types::RoundKeys encryption_keys; expand_key(key, encryption_keys); - if (ModeUsesEncryptionKeysOnly::value) { + if constexpr (mode_uses_encryption_keys_only(mode)) { decryption_keys = encryption_keys; } else { derive_decryption_keys(encryption_keys, decryption_keys); diff --git a/aesxx/include/aesxx/mode.hpp b/aesxx/include/aesxx/mode.hpp index e4391a4..9fbcaae 100644 --- a/aesxx/include/aesxx/mode.hpp +++ b/aesxx/include/aesxx/mode.hpp @@ -13,26 +13,11 @@ namespace aes { typedef AES_Mode Mode; -template -struct ModeRequiresInitVector : public std::true_type {}; - -template <> -struct ModeRequiresInitVector : public std::false_type {}; - -template -struct ModeUsesEncryptionKeysOnly : public std::true_type {}; - -inline bool mode_requires_init_vector(Mode mode) { +inline constexpr bool mode_requires_init_vector(Mode mode) { return mode != AES_ECB; } -template <> -struct ModeUsesEncryptionKeysOnly : public std::false_type {}; - -template <> -struct ModeUsesEncryptionKeysOnly : public std::false_type {}; - -inline bool mode_uses_encryption_keys_only(Mode mode) { +inline constexpr bool mode_uses_encryption_keys_only(Mode mode) { return mode != AES_ECB && mode != AES_CBC; } @@ -41,6 +26,7 @@ inline bool mode_uses_encryption_keys_only(Mode mode) { inline void encrypt_block( \ const typename Types::Block& plaintext, \ const typename Types::RoundKeys& encryption_keys, \ + typename Types::Block&, \ typename Types::Block& ciphertext \ ) { \ ciphertext = aes_##prefix##_encrypt_block_ECB(plaintext, &encryption_keys); \ @@ -51,6 +37,7 @@ inline bool mode_uses_encryption_keys_only(Mode mode) { inline void decrypt_block( \ const typename Types::Block& ciphertext, \ const typename Types::RoundKeys& decryption_keys, \ + typename Types::Block&, \ typename Types::Block& plaintext \ ) { \ plaintext = aes_##prefix##_decrypt_block_ECB(ciphertext, &decryption_keys); \ diff --git a/aesxx/utils/block_dumper.hpp b/aesxx/utils/block_dumper.hpp index f05d41c..8284b67 100644 --- a/aesxx/utils/block_dumper.hpp +++ b/aesxx/utils/block_dumper.hpp @@ -70,30 +70,16 @@ void dump_wrapper(const aes::DecryptWrapper& wrapper) { dump_decryption_keys(wrapper.decryption_keys); } -template < - aes::Algorithm algorithm, - aes::Mode mode, - typename std::enable_if::value>::type* = nullptr> +template void dump_next_iv(const aes::EncryptWrapper& wrapper) { - dump_block("Next initialization vector", wrapper.iv); + if constexpr (aes::mode_requires_init_vector(mode)) { + dump_block("Next initialization vector", wrapper.iv); + } } -template < - aes::Algorithm algorithm, - aes::Mode mode, - typename std::enable_if::value>::type* = nullptr> -void dump_next_iv(const aes::EncryptWrapper&) {} - -template < - aes::Algorithm algorithm, - aes::Mode mode, - typename std::enable_if::value>::type* = nullptr> +template void dump_next_iv(const aes::DecryptWrapper& wrapper) { - dump_block("Next initialization vector", wrapper.iv); + if constexpr (aes::mode_requires_init_vector(mode)) { + dump_block("Next initialization vector", wrapper.iv); + } } - -template < - aes::Algorithm algorithm, - aes::Mode mode, - typename std::enable_if::value>::type* = nullptr> -void dump_next_iv(const aes::DecryptWrapper&) {} diff --git a/aesxx/utils/decrypt_block.cpp b/aesxx/utils/decrypt_block.cpp index 317e6fd..f06221d 100644 --- a/aesxx/utils/decrypt_block.cpp +++ b/aesxx/utils/decrypt_block.cpp @@ -23,7 +23,7 @@ template void decrypt_with_mode(const Input& input, bool verbose = false) { typename aes::Types::Block iv; - if (aes::ModeRequiresInitVector()) { + if constexpr (aes::mode_requires_init_vector(mode)) { aes::from_string(iv, input.iv); if (verbose) dump_iv(iv); diff --git a/aesxx/utils/encrypt_block.cpp b/aesxx/utils/encrypt_block.cpp index 5fdefd0..6bde766 100644 --- a/aesxx/utils/encrypt_block.cpp +++ b/aesxx/utils/encrypt_block.cpp @@ -23,7 +23,7 @@ template void encrypt_with_mode(const Input& input, bool verbose = false) { typename aes::Types::Block iv; - if (aes::ModeRequiresInitVector::value) { + if constexpr (aes::mode_requires_init_vector(mode)) { aes::from_string(iv, input.iv); if (verbose) dump_iv(iv); -- cgit v1.3