diff options
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>, |