aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/aesxx
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-06-18 18:22:01 +0200
committerEgor Tensin <egor@tensin.name>2026-06-18 19:21:44 +0200
commit2342ade23c3e8a8855cfb55f9b15818978bfb333 (patch)
treeb13bb6ad104288bcfaeedef1d02e37e427024a3d /aesxx
parentRevert "cmake: treat warnings as errors" (diff)
downloadaes-tools-2342ade23c3e8a8855cfb55f9b15818978bfb333.tar.gz
aes-tools-2342ade23c3e8a8855cfb55f9b15818978bfb333.zip
switch to if constexpr (..) to remove clutter
Diffstat (limited to 'aesxx')
-rw-r--r--aesxx/include/aesxx/api.hpp66
-rw-r--r--aesxx/include/aesxx/mode.hpp21
-rw-r--r--aesxx/utils/block_dumper.hpp30
-rw-r--r--aesxx/utils/decrypt_block.cpp2
-rw-r--r--aesxx/utils/encrypt_block.cpp2
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<algorithm>::RoundKeys& decryption_keys
);
-template <
- Algorithm algorithm,
- Mode mode,
- typename std::enable_if<ModeRequiresInitVector<mode>::value>::type* = nullptr>
+template <Algorithm algorithm, Mode mode>
void encrypt_block(
const typename Types<algorithm>::Block& plaintext,
const typename Types<algorithm>::RoundKeys& round_keys,
typename Types<algorithm>::Block& iv,
typename Types<algorithm>::Block& ciphertext
-);
-
-template <
- Algorithm algorithm,
- Mode mode,
- typename std::enable_if<!ModeRequiresInitVector<mode>::value>::type* = nullptr>
-void encrypt_block(
- const typename Types<algorithm>::Block& plaintext,
- const typename Types<algorithm>::RoundKeys& round_keys,
- typename Types<algorithm>::Block& ciphertext
-);
-
-template <
- Algorithm algorithm,
- Mode mode,
- typename std::enable_if<!ModeRequiresInitVector<mode>::value>::type* = nullptr>
-void encrypt_block(
- const typename Types<algorithm>::Block& plaintext,
- const typename Types<algorithm>::RoundKeys& round_keys,
- typename Types<algorithm>::Block&,
- typename Types<algorithm>::Block& ciphertext
) {
- encrypt_block<algorithm, mode>(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<ModeRequiresInitVector<mode>::value>::type* = nullptr>
+template <Algorithm algorithm, Mode mode>
void decrypt_block(
const typename Types<algorithm>::Block& ciphertext,
const typename Types<algorithm>::RoundKeys& round_keys,
typename Types<algorithm>::Block& iv,
typename Types<algorithm>::Block& plaintext
-);
-
-template <
- Algorithm algorithm,
- Mode mode,
- typename std::enable_if<!ModeRequiresInitVector<mode>::value>::type* = nullptr>
-void decrypt_block(
- const typename Types<algorithm>::Block& ciphertext,
- const typename Types<algorithm>::RoundKeys& round_keys,
- typename Types<algorithm>::Block& plaintext
-);
-
-template <
- Algorithm algorithm,
- Mode mode,
- typename std::enable_if<!ModeRequiresInitVector<mode>::value>::type* = nullptr>
-void decrypt_block(
- const typename Types<algorithm>::Block& ciphertext,
- const typename Types<algorithm>::RoundKeys& round_keys,
- typename Types<algorithm>::Block&,
- typename Types<algorithm>::Block& plaintext
) {
- decrypt_block<algorithm, mode>(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 <Algorithm algorithm, Mode mode>
@@ -147,7 +107,7 @@ struct DecryptWrapper {
typename Types<algorithm>::RoundKeys encryption_keys;
expand_key<algorithm>(key, encryption_keys);
- if (ModeUsesEncryptionKeysOnly<mode>::value) {
+ if constexpr (mode_uses_encryption_keys_only(mode)) {
decryption_keys = encryption_keys;
} else {
derive_decryption_keys<algorithm>(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 <Mode mode>
-struct ModeRequiresInitVector : public std::true_type {};
-
-template <>
-struct ModeRequiresInitVector<AES_ECB> : public std::false_type {};
-
-template <Mode mode>
-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<AES_ECB> : public std::false_type {};
-
-template <>
-struct ModeUsesEncryptionKeysOnly<AES_CBC> : 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<AES_##prefix, AES_ECB>( \
const typename Types<AES_##prefix>::Block& plaintext, \
const typename Types<AES_##prefix>::RoundKeys& encryption_keys, \
+ typename Types<AES_##prefix>::Block&, \
typename Types<AES_##prefix>::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<AES_##prefix, AES_ECB>( \
const typename Types<AES_##prefix>::Block& ciphertext, \
const typename Types<AES_##prefix>::RoundKeys& decryption_keys, \
+ typename Types<AES_##prefix>::Block&, \
typename Types<AES_##prefix>::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<algorithm, mode>& wrapper) {
dump_decryption_keys<algorithm>(wrapper.decryption_keys);
}
-template <
- aes::Algorithm algorithm,
- aes::Mode mode,
- typename std::enable_if<aes::ModeRequiresInitVector<mode>::value>::type* = nullptr>
+template <aes::Algorithm algorithm, aes::Mode mode>
void dump_next_iv(const aes::EncryptWrapper<algorithm, mode>& wrapper) {
- dump_block<algorithm>("Next initialization vector", wrapper.iv);
+ if constexpr (aes::mode_requires_init_vector(mode)) {
+ dump_block<algorithm>("Next initialization vector", wrapper.iv);
+ }
}
-template <
- aes::Algorithm algorithm,
- aes::Mode mode,
- typename std::enable_if<!aes::ModeRequiresInitVector<mode>::value>::type* = nullptr>
-void dump_next_iv(const aes::EncryptWrapper<algorithm, mode>&) {}
-
-template <
- aes::Algorithm algorithm,
- aes::Mode mode,
- typename std::enable_if<aes::ModeRequiresInitVector<mode>::value>::type* = nullptr>
+template <aes::Algorithm algorithm, aes::Mode mode>
void dump_next_iv(const aes::DecryptWrapper<algorithm, mode>& wrapper) {
- dump_block<algorithm>("Next initialization vector", wrapper.iv);
+ if constexpr (aes::mode_requires_init_vector(mode)) {
+ dump_block<algorithm>("Next initialization vector", wrapper.iv);
+ }
}
-
-template <
- aes::Algorithm algorithm,
- aes::Mode mode,
- typename std::enable_if<!aes::ModeRequiresInitVector<mode>::value>::type* = nullptr>
-void dump_next_iv(const aes::DecryptWrapper<algorithm, mode>&) {}
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 <aes::Algorithm algorithm, aes::Mode mode>
void decrypt_with_mode(const Input& input, bool verbose = false) {
typename aes::Types<algorithm>::Block iv;
- if (aes::ModeRequiresInitVector<mode>()) {
+ if constexpr (aes::mode_requires_init_vector(mode)) {
aes::from_string<algorithm>(iv, input.iv);
if (verbose)
dump_iv<algorithm>(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 <aes::Algorithm algorithm, aes::Mode mode>
void encrypt_with_mode(const Input& input, bool verbose = false) {
typename aes::Types<algorithm>::Block iv;
- if (aes::ModeRequiresInitVector<mode>::value) {
+ if constexpr (aes::mode_requires_init_vector(mode)) {
aes::from_string<algorithm>(iv, input.iv);
if (verbose)
dump_iv<algorithm>(iv);