diff options
author | Jack Lloyd <[email protected]> | 2016-11-15 20:08:22 -0500 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2016-11-15 20:08:22 -0500 |
commit | db3a868cb8c477dbd909bed53879f2124a443306 (patch) | |
tree | 78bed218f47d93f28685075a8f8540d40d00360f /src/tests | |
parent | ca972385dd259f1a80d37b153a504fc14b370795 (diff) |
Add negative tests for cipher mode padding
Diffstat (limited to 'src/tests')
-rw-r--r-- | src/tests/data/pad.vec | 95 | ||||
-rw-r--r-- | src/tests/test_pad.cpp | 64 |
2 files changed, 107 insertions, 52 deletions
diff --git a/src/tests/data/pad.vec b/src/tests/data/pad.vec index edd0892fc..ee24d3497 100644 --- a/src/tests/data/pad.vec +++ b/src/tests/data/pad.vec @@ -1,104 +1,147 @@ [NoPadding] -In = FFFFFF +In = FFFFFF Out = FFFFFF Blocksize = 16 -In = FFFFFFFF +In = FFFFFFFF Out = FFFFFFFF Blocksize = 32 -In = FFFFFFFFFFFF +In = FFFFFFFFFFFF Out = FFFFFFFFFFFF Blocksize = 64 -In = FFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF Blocksize = 8 -In = FFFFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF Blocksize = 8 [PKCS7] -In = FFFFFF +In = FFFFFF Out = FFFFFF0D0D0D0D0D0D0D0D0D0D0D0D0D Blocksize = 16 -In = FFFFFFFF +In = FFFFFFFF Out = FFFFFFFF1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C Blocksize = 32 -In = FFFFFFFFFFFF +In = FFFFFFFFFFFF Out = FFFFFFFFFFFF3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A Blocksize = 64 -In = FFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF0808080808080808 Blocksize = 8 -In = FFFFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF07070707070707 Blocksize = 8 +[PKCS7_Invalid] +In = FFFFFFFFFFFFFFFFFF07070706070707 +Blocksize = 8 + +In = FFFFFFFFFFFFFFFFFFFF070707070707 +Blocksize = 8 + [OneAndZeros] -In = FFFFFF +In = FFFFFF Out = FFFFFF80000000000000000000000000 Blocksize = 16 -In = FFFFFFFF +In = FFFFFFFF Out = FFFFFFFF80000000000000000000000000000000000000000000000000000000 Blocksize = 32 -In = FFFFFFFFFFFF +In = FFFFFFFFFFFF Out = FFFFFFFFFFFF80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Blocksize = 64 -In = FFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF8000000000000000 Blocksize = 8 -In = FFFFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF80000000000000 Blocksize = 8 +[OneAndZeros_Invalid] +In = FF80000000000008 +Blocksize = 8 + +In = FF70000000000008 +Blocksize = 8 + +In = FF70000000000081 +Blocksize = 8 + [X9.23] -In = FFFFFF +In = FFFFFF Out = FFFFFF0000000000000000000000000D Blocksize = 16 -In = FFFFFFFF +In = FFFFFFFF Out = FFFFFFFF0000000000000000000000000000000000000000000000000000001C Blocksize = 32 -In = FFFFFFFFFFFF +In = FFFFFFFFFFFF Out = FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003A Blocksize = 64 -In = FFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF0000000000000008 Blocksize = 8 -In = FFFFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF00000000000007 Blocksize = 8 +[X9.23_Invalid] +In = FFFFFFFFFFFFFFFFFF000000FFFFF00007 +Blocksize = 8 + +In = FFFFFFFFFFFFFFFFFF0000000FF00007 +Blocksize = 8 + +In = FFFFFF8000000000000000000000000D +Blocksize = 16 + [ESP] -In = FFFFFF +In = FFFFFF Out = FFFFFF0102030405060708090A0B0C0D Blocksize = 16 -In = FFFFFFFF +In = FFFFFFFF Out = FFFFFFFF0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Blocksize = 32 -In = FFFFFFFFFFFF +In = FFFFFFFFFFFF Out = FFFFFFFFFFFF0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A Blocksize = 64 -In = FFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF0102030405060708 Blocksize = 8 -In = FFFFFFFFFFFFFFFFFF +In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF01020304050607 -Blocksize = 8
\ No newline at end of file +Blocksize = 8 + +[ESP_Invalid] +In = FF010202 +Blocksize = 4 + +In = FF010204 +Blocksize = 4 + +In = FFFFFF0102030405060708090A0B0C0F +Blocksize = 16 + +In = FFFFFF0102030404060708090A0B0C0D +Blocksize = 16 + +In = FFFFFFFF0002030405060708090A0B0C +Blocksize = 16 diff --git a/src/tests/test_pad.cpp b/src/tests/test_pad.cpp index 0eb14beb8..bf9e64c0d 100644 --- a/src/tests/test_pad.cpp +++ b/src/tests/test_pad.cpp @@ -18,15 +18,25 @@ class Cipher_Mode_Padding_Tests : public Text_Based_Test { public: Cipher_Mode_Padding_Tests() : - Text_Based_Test("pad.vec", {"In", "Out", "Blocksize"}) + Text_Based_Test("", "pad.vec", {"In", "Blocksize"},{"Out"}) {} - Test::Result run_one_test(const std::string& algo, const VarMap& vars) override + Test::Result run_one_test(const std::string& header, const VarMap& vars) override { const std::vector<uint8_t> input = get_req_bin(vars, "In"); - const std::vector<uint8_t> expected = get_req_bin(vars, "Out"); + const std::vector<uint8_t> expected = get_opt_bin(vars, "Out"); const size_t block_size = get_req_sz(vars, "Blocksize"); + std::string algo = header; + + auto underscore = algo.find('_'); + if(underscore != std::string::npos) + { + if(algo.substr(underscore+1,std::string::npos) != "Invalid") + throw Test_Error("Unexpected padding header " + header); + algo = algo.substr(0, underscore); + } + Test::Result result(algo); std::unique_ptr<Botan::BlockCipherModePaddingMethod> pad(Botan::get_bc_pad(algo)); @@ -37,34 +47,36 @@ class Cipher_Mode_Padding_Tests : public Text_Based_Test return result; } - Botan::secure_vector<uint8_t> buf(input.begin(), input.end()); - pad->add_padding(buf, input.size() % block_size, block_size); - result.test_eq("pad", buf, expected); + if(expected.empty()) + { + // This is an unpad an invalid input and ensure we reject + try + { + pad->unpad(input.data(), block_size); + result.test_failure("Did not reject invalid padding", Botan::hex_encode(input)); + } + catch(Botan::Decoding_Error&) + { + result.test_success("Rejected invalid padding"); + } + } + else + { + // This is a pad plaintext and unpad valid padding round trip test + Botan::secure_vector<uint8_t> buf(input.begin(), input.end()); + pad->add_padding(buf, input.size() % block_size, block_size); + result.test_eq("pad", buf, expected); - buf.assign(expected.begin(), expected.end()); + buf.assign(expected.begin(), expected.end()); - const size_t last_block = ( buf.size() < block_size ) ? 0 : buf.size() - block_size; - const size_t pad_bytes = block_size - pad->unpad(&buf[last_block], block_size); - buf.resize(buf.size() - pad_bytes); // remove padding - result.test_eq("unpad", buf, input); + const size_t last_block = ( buf.size() < block_size ) ? 0 : buf.size() - block_size; + const size_t pad_bytes = block_size - pad->unpad(&buf[last_block], block_size); + buf.resize(buf.size() - pad_bytes); // remove padding + result.test_eq("unpad", buf, input); + } return result; } - - std::vector<Test::Result> run_final_tests() - { - Test::Result result("ESP negative tests"); - - std::vector<uint8_t> invalid1 { 0xFF, 0x01, 0x02, 0x02 }; - result.test_throws("ESP invalid last pad", [&invalid1]() - { Botan::ESP_Padding().unpad(invalid1.data(), invalid1.size()); } ); - - std::vector<uint8_t> invalid2 { 0xFF, 0x01, 0x02, 0x04 }; - result.test_throws("ESP invalid pad", [&invalid2]() - { Botan::ESP_Padding().unpad(invalid2.data(), invalid2.size()); } ); - - return {result}; - } }; BOTAN_REGISTER_TEST("bc_pad", Cipher_Mode_Padding_Tests); |