aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-11-15 20:08:22 -0500
committerJack Lloyd <[email protected]>2016-11-15 20:08:22 -0500
commitdb3a868cb8c477dbd909bed53879f2124a443306 (patch)
tree78bed218f47d93f28685075a8f8540d40d00360f /src/tests
parentca972385dd259f1a80d37b153a504fc14b370795 (diff)
Add negative tests for cipher mode padding
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/data/pad.vec95
-rw-r--r--src/tests/test_pad.cpp64
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);