aboutsummaryrefslogtreecommitdiffstats
path: root/src/block/cascade
diff options
context:
space:
mode:
authorlloyd <[email protected]>2010-10-13 13:09:56 +0000
committerlloyd <[email protected]>2010-10-13 13:09:56 +0000
commit55550067fd69850c767cc9800433e1eabfeb5da2 (patch)
tree80ccea320ba00be2f7942d88657937462a6b1f03 /src/block/cascade
parent85a504e310666f270a3a67edf4cdac06c34c61b9 (diff)
Add a new subclass for BlockCipher BlockCipher_Fixed_Block_Size, which
sets the block size statically and also creates an enum with the size. Use the enum instead of calling block_size() where possible, since that uses two virtual function calls per block which is quite unfortunate. The real advantages here as compared to the previous version which kept the block size as a per-object u32bit: - The compiler can inline the constant as an immediate operand (previously it would load the value via an indirection on this) - Removes 32 bits per object overhead (except in cases with actually variable block sizes, which are very few and rarely used)
Diffstat (limited to 'src/block/cascade')
-rw-r--r--src/block/cascade/cascade.cpp5
-rw-r--r--src/block/cascade/cascade.h3
2 files changed, 6 insertions, 2 deletions
diff --git a/src/block/cascade/cascade.cpp b/src/block/cascade/cascade.cpp
index 225b7fd6e..2701c20e7 100644
--- a/src/block/cascade/cascade.cpp
+++ b/src/block/cascade/cascade.cpp
@@ -81,10 +81,11 @@ size_t block_size_for_cascade(size_t bs, size_t bs2)
}
Cascade_Cipher::Cascade_Cipher(BlockCipher* c1, BlockCipher* c2) :
- BlockCipher(block_size_for_cascade(c1->block_size(), c2->block_size()),
- c1->MAXIMUM_KEYLENGTH + c2->MAXIMUM_KEYLENGTH),
+ BlockCipher(c1->MAXIMUM_KEYLENGTH + c2->MAXIMUM_KEYLENGTH),
cipher1(c1), cipher2(c2)
{
+ block = block_size_for_cascade(c1->block_size(), c2->block_size());
+
if(block_size() % c1->block_size() || block_size() % c2->block_size())
throw Internal_Error("Failure in " + name() + " constructor");
}
diff --git a/src/block/cascade/cascade.h b/src/block/cascade/cascade.h
index 5e1989cb6..31ee3b336 100644
--- a/src/block/cascade/cascade.h
+++ b/src/block/cascade/cascade.h
@@ -21,6 +21,8 @@ class BOTAN_DLL Cascade_Cipher : public BlockCipher
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
void decrypt_n(const byte in[], byte out[], size_t blocks) const;
+ size_t block_size() const { return block; }
+
void clear();
std::string name() const;
BlockCipher* clone() const;
@@ -36,6 +38,7 @@ class BOTAN_DLL Cascade_Cipher : public BlockCipher
private:
void key_schedule(const byte[], size_t);
+ size_t block;
BlockCipher* cipher1;
BlockCipher* cipher2;
};