diff options
-rw-r--r-- | src/lib/modes/mode_pad/mode_pad.cpp | 43 | ||||
-rw-r--r-- | src/lib/modes/mode_pad/mode_pad.h | 20 | ||||
-rw-r--r-- | src/tests/data/pad.vec | 21 |
3 files changed, 83 insertions, 1 deletions
diff --git a/src/lib/modes/mode_pad/mode_pad.cpp b/src/lib/modes/mode_pad/mode_pad.cpp index 7b4546c86..6550edef2 100644 --- a/src/lib/modes/mode_pad/mode_pad.cpp +++ b/src/lib/modes/mode_pad/mode_pad.cpp @@ -1,6 +1,7 @@ /* * CBC Padding Methods * (C) 1999-2007,2013 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -27,6 +28,9 @@ BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec) if(algo_spec == "X9.23") return new ANSI_X923_Padding; + if(algo_spec == "ESP") + return new ESP_Padding; + return nullptr; } @@ -121,5 +125,44 @@ size_t OneAndZeros_Padding::unpad(const byte block[], size_t size) const return (size-1); } +/* +* Pad with ESP Padding Method +*/ +void ESP_Padding::add_padding(secure_vector<byte>& buffer, + size_t last_byte_pos, + size_t block_size) const + { + byte pad_value = 0x01; + + for(size_t i = last_byte_pos; i < block_size; ++i) + { + buffer.push_back(pad_value++); + } + } + +/* +* Unpad with ESP Padding Method +*/ +size_t ESP_Padding::unpad(const byte block[], size_t size) const + { + while(size) + { + if(block[size-1] == 0x01) + { + break; + } + if(block[size-1] == 0x00) + { + throw Decoding_Error(name()); + } + size--; + } + if(!size) + { + throw Decoding_Error(name()); + } + return (size-1); + } + } diff --git a/src/lib/modes/mode_pad/mode_pad.h b/src/lib/modes/mode_pad/mode_pad.h index d52fbd7b6..af528a926 100644 --- a/src/lib/modes/mode_pad/mode_pad.h +++ b/src/lib/modes/mode_pad/mode_pad.h @@ -1,6 +1,7 @@ /* * ECB/CBC Padding Methods * (C) 1999-2008,2013 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -96,7 +97,7 @@ class BOTAN_DLL ANSI_X923_Padding final : public BlockCipherModePaddingMethod }; /** -* One And Zeros Padding +* One And Zeros Padding (ISO/IEC 7816-4) */ class BOTAN_DLL OneAndZeros_Padding final : public BlockCipherModePaddingMethod { @@ -113,6 +114,23 @@ class BOTAN_DLL OneAndZeros_Padding final : public BlockCipherModePaddingMethod }; /** +* ESP Padding (RFC 4304) +*/ +class BOTAN_DLL ESP_Padding final : public BlockCipherModePaddingMethod + { + public: + void add_padding(secure_vector<byte>& buffer, + size_t final_block_bytes, + size_t block_size) const override; + + size_t unpad(const byte[], size_t) const override; + + bool valid_blocksize(size_t bs) const override { return (bs > 0); } + + std::string name() const override { return "ESP"; } + }; + +/** * Null Padding */ class BOTAN_DLL Null_Padding final : public BlockCipherModePaddingMethod diff --git a/src/tests/data/pad.vec b/src/tests/data/pad.vec index 3c47959c9..edd0892fc 100644 --- a/src/tests/data/pad.vec +++ b/src/tests/data/pad.vec @@ -80,4 +80,25 @@ Blocksize = 8 In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF00000000000007 +Blocksize = 8 + +[ESP] +In = FFFFFF +Out = FFFFFF0102030405060708090A0B0C0D +Blocksize = 16 + +In = FFFFFFFF +Out = FFFFFFFF0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +Blocksize = 32 + +In = FFFFFFFFFFFF +Out = FFFFFFFFFFFF0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A +Blocksize = 64 + +In = FFFFFFFFFFFFFFFF +Out = FFFFFFFFFFFFFFFF0102030405060708 +Blocksize = 8 + +In = FFFFFFFFFFFFFFFFFF +Out = FFFFFFFFFFFFFFFFFF01020304050607 Blocksize = 8
\ No newline at end of file |