From 1c341c6888c4a3771318fcff239dd096074bec02 Mon Sep 17 00:00:00 2001 From: hashlag Date: Tue, 1 Sep 2026 00:43:27 +0300 Subject: [PATCH] Replace Padder CRTP base with a concept. --- Chaos/Padding/Padder.hpp | 32 ++++------------------- Chaos/Padding/PadderIso7816.hpp | 4 ++- Chaos/Padding/PadderPkcs7.hpp | 4 ++- ChaosTests/Padding/PadderIso7816Tests.cpp | 12 ++++----- ChaosTests/Padding/PadderPkcs7Tests.cpp | 12 ++++----- 5 files changed, 23 insertions(+), 41 deletions(-) diff --git a/Chaos/Padding/Padder.hpp b/Chaos/Padding/Padder.hpp index 5ae50e0..1807d5e 100644 --- a/Chaos/Padding/Padder.hpp +++ b/Chaos/Padding/Padder.hpp @@ -1,38 +1,16 @@ #ifndef CHAOS_PADDING_PADDER_HPP #define CHAOS_PADDING_PADDER_HPP +#include + namespace Chaos::Padding { template -class Padder +concept Padder = requires(uint8_t * begin, uint8_t * end) { -public: - template - void Pad(OutputIt begin, OutputIt end) const - { - Impl().Pad(begin, end); - } - - template - auto ComputeUnpad(InputIt begin, InputIt end) const noexcept - { - return Impl().ComputeUnpad(begin, end); - } - -protected: - Padder() = default; - -private: - const T & Impl() const - { - return static_cast(*this); - } - - T & Impl() - { - return static_cast(*this); - } + T::Pad(begin, end); + { T::ComputeUnpad(begin, end) } noexcept; }; } // namespace Chaos::Padding diff --git a/Chaos/Padding/PadderIso7816.hpp b/Chaos/Padding/PadderIso7816.hpp index c5af640..ee21f27 100644 --- a/Chaos/Padding/PadderIso7816.hpp +++ b/Chaos/Padding/PadderIso7816.hpp @@ -12,7 +12,7 @@ namespace Chaos::Padding { -class PadderIso7816 : public Padder +class PadderIso7816 { public: template @@ -82,6 +82,8 @@ private: using Branchless = Service::Branchless; }; +static_assert(Padder); + } // namespace Chaos::Padding #endif // CHAOS_PADDING_PADDERISO7816_HPP diff --git a/Chaos/Padding/PadderPkcs7.hpp b/Chaos/Padding/PadderPkcs7.hpp index 325a01f..61c4a60 100644 --- a/Chaos/Padding/PadderPkcs7.hpp +++ b/Chaos/Padding/PadderPkcs7.hpp @@ -13,7 +13,7 @@ namespace Chaos::Padding { -class PadderPkcs7 : public Padder +class PadderPkcs7 { public: template @@ -75,6 +75,8 @@ private: using Branchless = Service::Branchless; }; +static_assert(Padder); + } // namespace Chaos::Padding #endif // CHAOS_PADDING_PADDERPKCS7_HPP diff --git a/ChaosTests/Padding/PadderIso7816Tests.cpp b/ChaosTests/Padding/PadderIso7816Tests.cpp index 0118032..e917063 100644 --- a/ChaosTests/Padding/PadderIso7816Tests.cpp +++ b/ChaosTests/Padding/PadderIso7816Tests.cpp @@ -109,8 +109,8 @@ TEST(PadIso7816Tests, PadOutIteratorUsageTest) } } -template -void PadThroughBase(const Padder & padder, OutputIt begin, OutputIt end) +template +void PadGeneric(const PadderImpl & padder, OutputIt begin, OutputIt end) { padder.Pad(begin, end); } @@ -127,7 +127,7 @@ TEST(PadIso7816Tests, PadThroughBaseTest) }; const PadderIso7816 padder; - PadThroughBase(padder, fact.begin(), fact.end()); + PadGeneric(padder, fact.begin(), fact.end()); ASSERT_EQ(expected, fact); } @@ -324,8 +324,8 @@ TEST(PadIso7816Tests, UnpadErrorTest) } } -template -auto ComputeUnpadThroughBase(const Padder & padder, OutputIt begin, OutputIt end) +template +auto ComputeUnpadGeneric(const PadderImpl & padder, OutputIt begin, OutputIt end) { return padder.ComputeUnpad(begin, end); } @@ -336,7 +336,7 @@ TEST(PadIso7816Tests, ComputeUnpadThroughBaseTest) std::array data = { 0x80, 0x00, 0x00, 0x00, 0x00 }; const PadderIso7816 padder; - auto result = ComputeUnpadThroughBase(padder, data.begin(), data.end()); + auto result = ComputeUnpadGeneric(padder, data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(5, result.PadSize_); diff --git a/ChaosTests/Padding/PadderPkcs7Tests.cpp b/ChaosTests/Padding/PadderPkcs7Tests.cpp index 112918b..57240ac 100644 --- a/ChaosTests/Padding/PadderPkcs7Tests.cpp +++ b/ChaosTests/Padding/PadderPkcs7Tests.cpp @@ -137,8 +137,8 @@ TEST(PadPkcs7Tests, PadOutIteratorUsageTest) } } -template -void PadThroughBase(const Padder & padder, OutputIt begin, OutputIt end) +template +void PadGeneric(const PadderImpl & padder, OutputIt begin, OutputIt end) { padder.Pad(begin, end); } @@ -153,7 +153,7 @@ TEST(PadPkcs7Tests, PadThroughBaseTest) }; const PadderPkcs7 padder; - PadThroughBase(padder, fact.begin(), fact.end()); + PadGeneric(padder, fact.begin(), fact.end()); ASSERT_EQ(expected, fact); } @@ -347,8 +347,8 @@ TEST(PadPkcs7Tests, UnpadErrorTest) } } -template -auto ComputeUnpadThroughBase(const Padder & padder, OutputIt begin, OutputIt end) +template +auto ComputeUnpadGeneric(const PadderImpl & padder, OutputIt begin, OutputIt end) { return padder.ComputeUnpad(begin, end); } @@ -359,7 +359,7 @@ TEST(PadPkcs7Tests, ComputeUnpadThroughBaseTest) std::array data = { 0x05, 0x05, 0x05, 0x05, 0x05 }; const PadderPkcs7 padder; - auto result = ComputeUnpadThroughBase(padder, data.begin(), data.end()); + auto result = ComputeUnpadGeneric(padder, data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(5, result.PadSize_);