#include #include #include #include #include #include #include "Padding/PadderIso7816.hpp" #include "Padding/Padder.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); } } TEST(PadIso7816Tests, UnpadTest) { { std::array data = { 0x80 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(1, result.PadSize_); } { std::array data = { 0xaa, 0xbb, 0x80, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(2, result.PadSize_); } { std::array data = { 0xaa, 0xbb, 0xcc, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; auto result = PadderIso7816::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, 0x80 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(1, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(7, result.PadSize_); } { std::array data = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(10, result.PadSize_); } { std::array data = { 0x80, 0x80, 0x00, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(3, result.PadSize_); } { std::array data; data.fill(0x41); *std::prev(data.end()) = 0x80; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(1, result.PadSize_); } { std::array data; data.fill(0x41); *std::prev(data.end(), 100) = 0x80; std::fill(data.end() - 99, data.end(), 0); auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(100, result.PadSize_); } { std::array data; data.fill(0); *data.begin() = 0x80; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(255, result.PadSize_); } { std::array data; data.fill(0x9a); *std::prev(data.end(), 255) = 0x80; std::fill(data.end() - 254, data.end(), 0); auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(255, result.PadSize_); } } TEST(PadIso7816Tests, UnpadErrorTest) { { std::array data = { }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0xa2, 0x80, 0xff }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0xa1, 0x00, 0x00, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0x80, 0x00, 0xa2, 0x00, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xa0, 0x80, 0x03, 0x00, 0x00 }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0xff }; auto result = PadderIso7816::ComputeUnpad(data.begin(), data.end()); ASSERT_FALSE(result.IsOkay_); ASSERT_EQ(0, result.PadSize_); } { std::array data = { 0x00, 0x00 }; auto result = PadderIso7816::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(PadIso7816Tests, ComputeUnpadThroughBaseTest) { { std::array data = { 0x80, 0x00, 0x00, 0x00, 0x00 }; const PadderIso7816 padder; auto result = ComputeUnpadThroughBase(padder, data.begin(), data.end()); ASSERT_TRUE(result.IsOkay_); ASSERT_EQ(5, result.PadSize_); } }