diff options
author | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2004-07-22 00:51:57 +0000 |
---|---|---|
committer | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2004-07-22 00:51:57 +0000 |
commit | a2828f6ae67c3d7294118a8144b1b2ec431237c4 (patch) | |
tree | faff40f3429fb7fb70249c83afd5378f92ebdb31 /panama.h | |
parent | e87d537834e72b242b4c16b99f0a40586940104b (diff) | |
download | cryptopp-a2828f6ae67c3d7294118a8144b1b2ec431237c4.tar.gz |
fix documentation, fix PanamaMAC, fix algorithm names
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@186 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'panama.h')
-rw-r--r-- | panama.h | 58 |
1 files changed, 44 insertions, 14 deletions
@@ -33,7 +33,7 @@ public: PanamaHash() {Panama<B>::Reset();} unsigned int DigestSize() const {return DIGESTSIZE;} void TruncatedFinal(byte *hash, unsigned int size); - static const char * StaticAlgorithmName() {return "Panama";} + static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN_ORDER ? "Panama-BE" : "Panama-LE";} protected: void Init() {Panama<B>::Reset();} @@ -41,47 +41,77 @@ protected: unsigned int HashMultipleBlocks(const word32 *input, unsigned int length); }; -//! . -template <class B = LittleEndian> -class CRYPTOPP_NO_VTABLE PanamaMAC_Base : public PanamaHash<B>, public VariableKeyLength<32, 0, UINT_MAX>, public MessageAuthenticationCode +//! MAC construction using a hermetic hash function +template <class T_Hash, class T_Info = T_Hash> +class HermeticHashFunctionMAC : public AlgorithmImpl<SimpleKeyingInterfaceImpl<TwoBases<MessageAuthenticationCode, VariableKeyLength<32, 0, UINT_MAX> > >, T_Info> { public: - void UncheckedSetKey(const byte *userKey, unsigned int keylength) + void SetKey(const byte *key, unsigned int length, const NameValuePairs ¶ms = g_nullNameValuePairs) { - m_key.Assign(userKey, keylength); + m_key.Assign(key, length); Restart(); } - static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN_ORDER ? "Panama-BE" : "Panama-LE";} + void Restart() + { + m_hash.Restart(); + m_keyed = false; + } + + void Update(const byte *input, unsigned int length) + { + if (!m_keyed) + KeyHash(); + m_hash.Update(input, length); + } + + void TruncatedFinal(byte *digest, unsigned int digestSize) + { + if (!m_keyed) + KeyHash(); + m_hash.TruncatedFinal(digest, digestSize); + m_keyed = false; + } + + unsigned int DigestSize() const + {return m_hash.DigestSize();} + unsigned int BlockSize() const + {return m_hash.BlockSize();} + unsigned int OptimalBlockSize() const + {return m_hash.OptimalBlockSize();} + unsigned int OptimalDataAlignment() const + {return m_hash.OptimalDataAlignment();} protected: - void Init() + void KeyHash() { - PanamaHash<B>::Init(); - Update(m_key, m_key.size()); + m_hash.Update(m_key, m_key.size()); + m_keyed = true; } + T_Hash m_hash; + bool m_keyed; SecByteBlock m_key; }; /// Panama MAC template <class B = LittleEndian> -class PanamaMAC : public MessageAuthenticationCodeImpl<PanamaMAC_Base<B> > +class PanamaMAC : public HermeticHashFunctionMAC<PanamaHash<B> > { public: PanamaMAC() {} - PanamaMAC(const byte *key, unsigned int length=PanamaMAC_Base<B>::DEFAULT_KEYLENGTH) + PanamaMAC(const byte *key, unsigned int length) {this->SetKey(key, length);} }; -//! . +//! algorithm info template <class B> struct PanamaCipherInfo : public VariableKeyLength<32, 32, 64, 32, SimpleKeyingInterface::NOT_RESYNCHRONIZABLE> { static const char * StaticAlgorithmName() {return B::ToEnum() == BIG_ENDIAN_ORDER ? "Panama-BE" : "Panama-LE";} }; -//! . +//! _ template <class B> class PanamaCipherPolicy : public AdditiveCipherConcretePolicy<word32, 8>, public PanamaCipherInfo<B>, |