summaryrefslogtreecommitdiff
path: root/panama.h
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2004-07-22 00:51:57 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2004-07-22 00:51:57 +0000
commita2828f6ae67c3d7294118a8144b1b2ec431237c4 (patch)
treefaff40f3429fb7fb70249c83afd5378f92ebdb31 /panama.h
parente87d537834e72b242b4c16b99f0a40586940104b (diff)
downloadcryptopp-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.h58
1 files changed, 44 insertions, 14 deletions
diff --git a/panama.h b/panama.h
index 6bbe9b1..25b6419 100644
--- a/panama.h
+++ b/panama.h
@@ -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 &params = 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>,