summaryrefslogtreecommitdiff
path: root/tea.h
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2003-07-30 00:28:54 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2003-07-30 00:28:54 +0000
commit4c8fdf71733c7ea14d5ee47306cc45e781d27b30 (patch)
treec85dbf46190ebeec51e7406e9e06fa79ea7dbc00 /tea.h
parent483c74aaab7c20d82a48621f1dd8b300292d3404 (diff)
downloadcryptopp-4c8fdf71733c7ea14d5ee47306cc45e781d27b30.tar.gz
add XTEA and BTEA
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@119 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'tea.h')
-rw-r--r--tea.h87
1 files changed, 82 insertions, 5 deletions
diff --git a/tea.h b/tea.h
index 7927743..898f7de 100644
--- a/tea.h
+++ b/tea.h
@@ -9,9 +9,8 @@
NAMESPACE_BEGIN(CryptoPP)
-struct TEA_Info : public FixedBlockSize<8>, public FixedKeyLength<16>, public FixedRounds<32>
+struct TEA_Info : public FixedBlockSize<8>, public FixedKeyLength<16>, public VariableRounds<32>
{
- enum {LOG_ROUNDS=5};
static const char *StaticAlgorithmName() {return "TEA";}
};
@@ -21,11 +20,11 @@ class TEA : public TEA_Info, public BlockCipherDocumentation
class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<TEA_Info>
{
public:
- void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
+ void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length, unsigned int rounds);
protected:
- static const word32 DELTA;
- FixedSizeSecBlock<word32, 4> k;
+ FixedSizeSecBlock<word32, 4> m_k;
+ word32 m_limit;
};
class CRYPTOPP_NO_VTABLE Enc : public Base
@@ -48,6 +47,84 @@ public:
typedef TEA::Encryption TEAEncryption;
typedef TEA::Decryption TEADecryption;
+struct XTEA_Info : public FixedBlockSize<8>, public FixedKeyLength<16>, public VariableRounds<32>
+{
+ static const char *StaticAlgorithmName() {return "XTEA";}
+};
+
+/// <a href="http://www.weidai.com/scan-mirror/cs.html#TEA">XTEA</a>
+class XTEA : public XTEA_Info, public BlockCipherDocumentation
+{
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<XTEA_Info>
+ {
+ public:
+ void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length, unsigned int rounds);
+
+ protected:
+ FixedSizeSecBlock<word32, 4> m_k;
+ word32 m_limit;
+ };
+
+ class CRYPTOPP_NO_VTABLE Enc : public Base
+ {
+ public:
+ void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+ };
+
+ class CRYPTOPP_NO_VTABLE Dec : public Base
+ {
+ public:
+ void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+ };
+
+public:
+ typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption;
+ typedef BlockCipherFinal<DECRYPTION, Dec> Decryption;
+};
+
+struct BTEA_Info : public FixedKeyLength<16>
+{
+ static const char *StaticAlgorithmName() {return "BTEA";}
+};
+
+/// <a href="http://www.weidai.com/scan-mirror/cs.html#TEA">corrected Block TEA</a> (as described in "xxtea").
+class BTEA : public BTEA_Info, public BlockCipherDocumentation
+{
+ class CRYPTOPP_NO_VTABLE Base : public AlgorithmImpl<SimpleKeyingInterfaceImpl<BlockCipher, BTEA_Info>, BTEA_Info>, public BTEA_Info
+ {
+ public:
+ template <class T>
+ static inline void CheckedSetKey(T *obj, CipherDir dir, const byte *key, unsigned int length, const NameValuePairs &param)
+ {
+ obj->ThrowIfInvalidKeyLength(length);
+ m_blockSize = param.GetIntValueWithDefault("BlockSize", 60*4);
+ GetUserKey(BIG_ENDIAN_ORDER, m_k.begin(), 4, userKey, KEYLENGTH);
+ }
+
+ unsigned int BlockSize() const {return m_blockSize;}
+
+ protected:
+ FixedSizeSecBlock<word32, 4> m_k;
+ unsigned int m_blockSize;
+ };
+
+ class CRYPTOPP_NO_VTABLE Enc : public Base
+ {
+ public:
+ void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+ };
+
+ class CRYPTOPP_NO_VTABLE Dec : public Base
+ {
+ public:
+ void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+ };
+
+public:
+ typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption;
+ typedef BlockCipherFinal<DECRYPTION, Dec> Decryption;
+};
+
NAMESPACE_END
#endif