diff --git a/Chaos/Padding/PadderIso7816.hpp b/Chaos/Padding/PadderIso7816.hpp new file mode 100644 index 0000000..113b838 --- /dev/null +++ b/Chaos/Padding/PadderIso7816.hpp @@ -0,0 +1,33 @@ +#ifndef CHAOS_PADDING_PADDERISO7816_HPP +#define CHAOS_PADDING_PADDERISO7816_HPP + +#include + +#include "Padding/Padder.hpp" + +namespace Chaos::Padding +{ + +class PadderIso7816 : public Padder +{ +public: + template + static void Pad(OutputIt begin, OutputIt end) + { + OutputIt it = begin; + + if (it != end) + { + *it++ = static_cast(0x80); + + for (; it != end; ++it) + { + *it = 0; + } + } + } +}; + +} // namespace Chaos::Padding + +#endif // CHAOS_PADDING_PADDERISO7816_HPP diff --git a/ChaosTests/CMakeLists.txt b/ChaosTests/CMakeLists.txt index 796ce51..2345b8d 100644 --- a/ChaosTests/CMakeLists.txt +++ b/ChaosTests/CMakeLists.txt @@ -19,6 +19,7 @@ set(ChaosTests_SOURCE Hash/Md4HasherTests.cpp Cipher/Arc4CryptTests.cpp Cipher/DesCryptTests.cpp Padding/PadderPkcs7Tests.cpp + Padding/PadderIso7816Tests.cpp Service/SeArrayTests.cpp Service/ChaosExceptionTests.cpp) diff --git a/ChaosTests/Padding/PadderIso7816Tests.cpp b/ChaosTests/Padding/PadderIso7816Tests.cpp new file mode 100644 index 0000000..e29b0c0 --- /dev/null +++ b/ChaosTests/Padding/PadderIso7816Tests.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include + +#include "Padding/PadderIso7816.hpp" + +using namespace Chaos::Padding; + +TEST(PadIso7816Tests, PadTest) +{ + { + std::array fact = {}; + std::array expected = { 0x80 }; + + PadderIso7816::Pad(fact.begin(), fact.end()); + ASSERT_EQ(expected, fact); + } + + { + std::array fact = {}; + std::array expected = + { + 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 + }; + + PadderIso7816::Pad(fact.begin(), fact.end()); + ASSERT_EQ(expected, fact); + } + + { + std::array fact = {}; + std::array expected = + { + 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + PadderIso7816::Pad(fact.begin(), fact.end()); + ASSERT_EQ(expected, fact); + } + + for (int i = 0; i < 256; ++i) + { + std::vector fact(i, 0xff); + + PadderIso7816::Pad(fact.begin(), fact.end()); + + for (int j = 0; j < i; ++j) + { + ASSERT_EQ(j == 0 ? 0x80 : 0x00, fact[j]); + } + } +} + +TEST(PadIso7816Tests, PadOutIteratorUsageTest) +{ + { + std::array fact; + fact.fill(0xff); + + std::array expected = + { + 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff + }; + + PadderIso7816::Pad(fact.begin() + 3, fact.end() - 3); + ASSERT_EQ(expected, fact); + } + + { + std::array fact; + fact.fill(0xff); + + std::array expected = + { + 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff + }; + + PadderIso7816::Pad(fact.begin() + 3, fact.end() - 3); + ASSERT_EQ(expected, fact); + } + + { + std::array fact = + { + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb + }; + std::array expected = + { + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb + }; + + PadderIso7816::Pad(fact.begin() + 5, fact.begin() + 5); + ASSERT_EQ(expected, fact); + } +} + +template +void PadThroughBase(const Padder & padder, OutputIt begin, OutputIt end) +{ + padder.Pad(begin, end); +} + +TEST(PadIso7816Tests, PadThroughBaseTest) +{ + { + std::array fact; + fact.fill(0xff); + + std::array expected = + { + 0x80, 0x00, 0x00, 0x00, 0x00 + }; + + const PadderIso7816 padder; + PadThroughBase(padder, fact.begin(), fact.end()); + + ASSERT_EQ(expected, fact); + } +}