diff options
author | weidai <weidai11@users.noreply.github.com> | 2002-10-04 17:31:41 +0000 |
---|---|---|
committer | weidai <weidai11@users.noreply.github.com> | 2002-10-04 17:31:41 +0000 |
commit | a3b6ece7ab341b5b14135baeccea7d5e4c086771 (patch) | |
tree | 8b045309c238226c32a563b1df6b9c30a2f0e0b3 /tea.cpp | |
download | cryptopp-git-a3b6ece7ab341b5b14135baeccea7d5e4c086771.tar.gz |
Initial revision
Diffstat (limited to 'tea.cpp')
-rw-r--r-- | tea.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tea.cpp b/tea.cpp new file mode 100644 index 00000000..3b5d181c --- /dev/null +++ b/tea.cpp @@ -0,0 +1,54 @@ +// tea.cpp - modified by Wei Dai from code in the original paper + +#include "pch.h" +#include "tea.h" +#include "misc.h" + +NAMESPACE_BEGIN(CryptoPP) + +const word32 TEA::Base::DELTA = 0x9e3779b9; + +void TEA::Base::UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length) +{ + AssertValidKeyLength(length); + + GetUserKey(BIG_ENDIAN_ORDER, k.begin(), 4, userKey, KEYLENGTH); +} + +typedef BlockGetAndPut<word32, BigEndian> Block; + +void TEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const +{ + word32 y, z; + Block::Get(inBlock)(y)(z); + + word32 sum = 0; + for (int i=0; i<ROUNDS; i++) + { + sum += DELTA; + y += (z << 4) + k[0] ^ z + sum ^ (z >> 5) + k[1]; + z += (y << 4) + k[2] ^ y + sum ^ (y >> 5) + k[3]; + } + + Block::Put(xorBlock, outBlock)(y)(z); +} + +typedef BlockGetAndPut<word32, BigEndian> Block; + +void TEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const +{ + word32 y, z; + Block::Get(inBlock)(y)(z); + + word32 sum = DELTA << LOG_ROUNDS; + for (int i=0; i<ROUNDS; i++) + { + z -= (y << 4) + k[2] ^ y + sum ^ (y >> 5) + k[3]; + y -= (z << 4) + k[0] ^ z + sum ^ (z >> 5) + k[1]; + sum -= DELTA; + } + + Block::Put(xorBlock, outBlock)(y)(z); +} + +NAMESPACE_END |