#include #include #include #include #include "Padding/PadderPkcs7.hpp" #include "Padding/Padder.hpp" #include "Service/ChaosException.hpp" using namespace Chaos::Padding; TEST(PadPkcs7Tests, PadTest) { { std::array fact = {}; std::array expected = { 0x01 }; PadderPkcs7::Pad(fact.begin(), fact.end()); ASSERT_EQ(expected, fact); } { std::array fact = {}; std::array expected = { 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 }; PadderPkcs7::Pad(fact.begin(), fact.end()); ASSERT_EQ(expected, fact); } { std::array fact = {}; std::array expected = { 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }; PadderPkcs7::Pad(fact.begin(), fact.end()); ASSERT_EQ(expected, fact); } for (int i = 0; i < 256; ++i) { std::vector fact(i, 0x00); PadderPkcs7::Pad(fact.begin(), fact.end()); ASSERT_EQ(std::vector(i, i), fact); } } TEST(PadPkcs7Tests, PadInvalidRangeTest) { { std::array out = {}; ASSERT_THROW(PadderPkcs7::Pad(out.begin(), out.end()), Chaos::Service::ChaosException); } { std::array out = {}; ASSERT_THROW(PadderPkcs7::Pad(out.begin(), out.end()), Chaos::Service::ChaosException); } { std::array out = {}; ASSERT_THROW(PadderPkcs7::Pad(out.end(), out.begin()), Chaos::Service::ChaosException); } } TEST(PadPkcs7Tests, PadOutIteratorUsageTest) { { std::array fact = {}; std::array expected = { 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00 }; PadderPkcs7::Pad(fact.begin() + 3, fact.end() - 3); ASSERT_EQ(expected, fact); } { std::array fact = {}; std::array expected = { 0x00, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00 }; PadderPkcs7::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 }; PadderPkcs7::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(PadPkcs7Tests, PadThroughBaseTest) { { std::array fact = {}; std::array expected = { 0x05, 0x05, 0x05, 0x05, 0x05 }; const PadderPkcs7 padder; PadThroughBase(padder, fact.begin(), fact.end()); ASSERT_EQ(expected, fact); } } TEST(PadPkcs7Tests, UnpadTest) { { std::array data = { 0x01 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(1, result.PadSize_); } { std::array data = { 0xaa, 0xbb, 0x02, 0x02 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(2, result.PadSize_); } { std::array data = { 0xaa, 0xbb, 0xcc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(7, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0x01 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(1, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(7, result.PadSize_); } { std::array data = { 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(10, result.PadSize_); } { std::array data = { 0x03, 0x03, 0x03, 0x03 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(3, result.PadSize_); } { std::array data; data.fill(0x41); *std::prev(data.end()) = 1; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(1, result.PadSize_); } { std::array data; data.fill(0x41); std::fill(data.end() - 100, data.end(), 100); auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(100, result.PadSize_); } { std::array data; data.fill(255); auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(255, result.PadSize_); } { std::array data; data.fill(0x9a); std::fill(data.end() - 255, data.end(), 255); auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(255, result.PadSize_); } } TEST(PadPkcs7Tests, UnpadErrorTest) { { std::array data = { }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0x00 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0xa3, 0xff }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0xa3, 0x06 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0xa3, 0x05 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0x03, 0x02, 0x03 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xff }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0x03, 0x03 }; auto result = PadderPkcs7::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } } template auto ComputeUnpadThroughBase(const Padder & padder, OutputIt begin, OutputIt end) { return padder.ComputeUnpad(begin, end); } TEST(PadPkcs7Tests, ComputeUnpadThroughBaseTest) { { std::array data = { 0x05, 0x05, 0x05, 0x05, 0x05 }; const PadderPkcs7 padder; auto result = ComputeUnpadThroughBase(padder, data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(5, result.PadSize_); } }