aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/modes/mode_pad
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-01-10 03:41:59 +0000
committerlloyd <[email protected]>2014-01-10 03:41:59 +0000
commit6894dca64c04936d07048c0e8cbf7e25858548c3 (patch)
tree5d572bfde9fe667dab14e3f04b5285a85d8acd95 /src/lib/modes/mode_pad
parent9efa3be92442afb3d0b69890a36c7f122df18eda (diff)
Move lib into src
Diffstat (limited to 'src/lib/modes/mode_pad')
-rw-r--r--src/lib/modes/mode_pad/info.txt1
-rw-r--r--src/lib/modes/mode_pad/mode_pad.cpp103
-rw-r--r--src/lib/modes/mode_pad/mode_pad.h124
3 files changed, 228 insertions, 0 deletions
diff --git a/src/lib/modes/mode_pad/info.txt b/src/lib/modes/mode_pad/info.txt
new file mode 100644
index 000000000..e9df6334b
--- /dev/null
+++ b/src/lib/modes/mode_pad/info.txt
@@ -0,0 +1 @@
+define CIPHER_MODE_PADDING 20131128
diff --git a/src/lib/modes/mode_pad/mode_pad.cpp b/src/lib/modes/mode_pad/mode_pad.cpp
new file mode 100644
index 000000000..918964c74
--- /dev/null
+++ b/src/lib/modes/mode_pad/mode_pad.cpp
@@ -0,0 +1,103 @@
+/*
+* CBC Padding Methods
+* (C) 1999-2007,2013 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/mode_pad.h>
+#include <botan/exceptn.h>
+
+namespace Botan {
+
+/*
+* Pad with PKCS #7 Method
+*/
+void PKCS7_Padding::add_padding(secure_vector<byte>& buffer,
+ size_t last_byte_pos,
+ size_t block_size) const
+ {
+ const byte pad_value = block_size - last_byte_pos;
+
+ for(size_t i = 0; i != pad_value; ++i)
+ buffer.push_back(pad_value);
+ }
+
+/*
+* Unpad with PKCS #7 Method
+*/
+size_t PKCS7_Padding::unpad(const byte block[], size_t size) const
+ {
+ size_t position = block[size-1];
+
+ if(position > size)
+ throw Decoding_Error("Bad padding in " + name());
+
+ for(size_t j = size-position; j != size-1; ++j)
+ if(block[j] != position)
+ throw Decoding_Error("Bad padding in " + name());
+
+ return (size-position);
+ }
+
+/*
+* Pad with ANSI X9.23 Method
+*/
+void ANSI_X923_Padding::add_padding(secure_vector<byte>& buffer,
+ size_t last_byte_pos,
+ size_t block_size) const
+ {
+ const byte pad_value = block_size - last_byte_pos;
+
+ for(size_t i = last_byte_pos; i < block_size; ++i)
+ buffer.push_back(0);
+ buffer.push_back(pad_value);
+ }
+
+/*
+* Unpad with ANSI X9.23 Method
+*/
+size_t ANSI_X923_Padding::unpad(const byte block[], size_t size) const
+ {
+ size_t position = block[size-1];
+ if(position > size)
+ throw Decoding_Error(name());
+ for(size_t j = size-position; j != size-1; ++j)
+ if(block[j] != 0)
+ throw Decoding_Error(name());
+ return (size-position);
+ }
+
+/*
+* Pad with One and Zeros Method
+*/
+void OneAndZeros_Padding::add_padding(secure_vector<byte>& buffer,
+ size_t last_byte_pos,
+ size_t block_size) const
+ {
+ buffer.push_back(0x80);
+
+ for(size_t i = last_byte_pos + 1; i % block_size; ++i)
+ buffer.push_back(0x00);
+ }
+
+/*
+* Unpad with One and Zeros Method
+*/
+size_t OneAndZeros_Padding::unpad(const byte block[], size_t size) const
+ {
+ while(size)
+ {
+ if(block[size-1] == 0x80)
+ 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
new file mode 100644
index 000000000..e7c38a196
--- /dev/null
+++ b/src/lib/modes/mode_pad/mode_pad.h
@@ -0,0 +1,124 @@
+/*
+* ECB/CBC Padding Methods
+* (C) 1999-2008,2013 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_MODE_PADDING_H__
+#define BOTAN_MODE_PADDING_H__
+
+#include <botan/secmem.h>
+#include <string>
+
+namespace Botan {
+
+/**
+* Block Cipher Mode Padding Method
+* This class is pretty limited, it cannot deal well with
+* randomized padding methods, or any padding method that
+* wants to add more than one block. For instance, it should
+* be possible to define cipher text stealing mode as simply
+* a padding mode for CBC, which happens to consume the last
+* two block (and requires use of the block cipher).
+*/
+class BOTAN_DLL BlockCipherModePaddingMethod
+ {
+ public:
+ virtual void add_padding(secure_vector<byte>& buffer,
+ size_t final_block_bytes,
+ size_t block_size) const = 0;
+
+ /**
+ * @param block the last block
+ * @param size the of the block
+ */
+ virtual size_t unpad(const byte block[],
+ size_t size) const = 0;
+
+ /**
+ * @param block_size of the cipher
+ * @return valid block size for this padding mode
+ */
+ virtual bool valid_blocksize(size_t block_size) const = 0;
+
+ /**
+ * @return name of the mode
+ */
+ virtual std::string name() const = 0;
+
+ /**
+ * virtual destructor
+ */
+ virtual ~BlockCipherModePaddingMethod() {}
+ };
+
+/**
+* PKCS#7 Padding
+*/
+class BOTAN_DLL PKCS7_Padding : 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;
+
+ bool valid_blocksize(size_t bs) const { return (bs > 0 && bs < 256); }
+
+ std::string name() const { return "PKCS7"; }
+ };
+
+/**
+* ANSI X9.23 Padding
+*/
+class BOTAN_DLL ANSI_X923_Padding : 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;
+
+ bool valid_blocksize(size_t bs) const { return (bs > 0 && bs < 256); }
+
+ std::string name() const { return "X9.23"; }
+ };
+
+/**
+* One And Zeros Padding
+*/
+class BOTAN_DLL OneAndZeros_Padding : 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;
+
+ bool valid_blocksize(size_t bs) const { return (bs > 0); }
+
+ std::string name() const { return "OneAndZeros"; }
+ };
+
+/**
+* Null Padding
+*/
+class BOTAN_DLL Null_Padding : public BlockCipherModePaddingMethod
+ {
+ public:
+ void add_padding(secure_vector<byte>&, size_t, size_t) const override {}
+
+ size_t unpad(const byte[], size_t size) const { return size; }
+
+ bool valid_blocksize(size_t) const { return true; }
+
+ std::string name() const { return "NoPadding"; }
+ };
+
+}
+
+#endif