diff options
author | lloyd <[email protected]> | 2010-10-13 13:09:56 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-10-13 13:09:56 +0000 |
commit | 55550067fd69850c767cc9800433e1eabfeb5da2 (patch) | |
tree | 80ccea320ba00be2f7942d88657937462a6b1f03 /src/block/aes | |
parent | 85a504e310666f270a3a67edf4cdac06c34c61b9 (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/aes')
-rw-r--r-- | src/block/aes/aes.cpp | 10 | ||||
-rw-r--r-- | src/block/aes/aes.h | 8 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/block/aes/aes.cpp b/src/block/aes/aes.cpp index 88439cf98..1530af965 100644 --- a/src/block/aes/aes.cpp +++ b/src/block/aes/aes.cpp @@ -521,8 +521,8 @@ void AES::encrypt_n(const byte in[], byte out[], size_t blocks) const out[14] = SE[get_byte(2, B1)] ^ ME[14]; out[15] = SE[get_byte(3, B2)] ^ ME[15]; - in += block_size(); - out += block_size(); + in += BLOCK_SIZE; + out += BLOCK_SIZE; } } @@ -611,8 +611,8 @@ void AES::decrypt_n(const byte in[], byte out[], size_t blocks) const out[14] = SD[get_byte(2, B1)] ^ MD[14]; out[15] = SD[get_byte(3, B0)] ^ MD[15]; - in += block_size(); - out += block_size(); + in += BLOCK_SIZE; + out += BLOCK_SIZE; } } @@ -681,7 +681,7 @@ u32bit AES::S(u32bit input) /* * AES Constructor */ -AES::AES(u32bit key_size) : BlockCipher(16, key_size), +AES::AES(u32bit key_size) : BlockCipher_Fixed_Block_Size(key_size), EK(56), ME(16), DK(56), MD(16) { if(key_size != 16 && key_size != 24 && key_size != 32) diff --git a/src/block/aes/aes.h b/src/block/aes/aes.h index d62413f5b..6fa0ccaff 100644 --- a/src/block/aes/aes.h +++ b/src/block/aes/aes.h @@ -15,17 +15,19 @@ namespace Botan { /** * Rijndael aka AES */ -class BOTAN_DLL AES : public BlockCipher +class BOTAN_DLL AES : public BlockCipher_Fixed_Block_Size<16> { public: + std::string name() const { return "AES"; } + void encrypt_n(const byte in[], byte out[], size_t blocks) const; void decrypt_n(const byte in[], byte out[], size_t blocks) const; void clear(); - std::string name() const { return "AES"; } BlockCipher* clone() const { return new AES; } - AES() : BlockCipher(16, 16, 32, 8), EK(56), ME(16), DK(56), MD(16) + AES() : BlockCipher_Fixed_Block_Size(16, 32, 8), + EK(56), ME(16), DK(56), MD(16) { ROUNDS = 14; } /** |