diff options
| author | Egor Tensin <egor@tensin.name> | 2026-06-18 18:22:01 +0200 |
|---|---|---|
| committer | Egor Tensin <egor@tensin.name> | 2026-06-18 19:21:44 +0200 |
| commit | 2342ade23c3e8a8855cfb55f9b15818978bfb333 (patch) | |
| tree | b13bb6ad104288bcfaeedef1d02e37e427024a3d /aesxx/include | |
| parent | Revert "cmake: treat warnings as errors" (diff) | |
| download | aes-tools-2342ade23c3e8a8855cfb55f9b15818978bfb333.tar.gz aes-tools-2342ade23c3e8a8855cfb55f9b15818978bfb333.zip | |
switch to if constexpr (..) to remove clutter
Diffstat (limited to 'aesxx/include')
| -rw-r--r-- | aesxx/include/aesxx/api.hpp | 66 | ||||
| -rw-r--r-- | aesxx/include/aesxx/mode.hpp | 21 |
2 files changed, 17 insertions, 70 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); \ |
