00001 #ifndef CRYPTOPP_TRUNHASH_H
00002 #define CRYPTOPP_TRUNHASH_H
00003
00004 #include "cryptlib.h"
00005
00006 NAMESPACE_BEGIN(CryptoPP)
00007
00008 class NullHash : public HashTransformation
00009 {
00010 public:
00011 void Update(const byte *input, size_t length)
00012 {CRYPTOPP_UNUSED(input);CRYPTOPP_UNUSED(length);}
00013 unsigned int DigestSize() const
00014 {return 0;}
00015 void TruncatedFinal(byte *digest, size_t digestSize)
00016 {CRYPTOPP_UNUSED(digest);CRYPTOPP_UNUSED(digestSize);}
00017 bool TruncatedVerify(const byte *digest, size_t digestLength)
00018 {CRYPTOPP_UNUSED(digest);CRYPTOPP_UNUSED(digestLength);return true;}
00019 };
00020
00021
00022 template <class T>
00023 class TruncatedHashTemplate : public HashTransformation
00024 {
00025 public:
00026 TruncatedHashTemplate(T hm, unsigned int digestSize)
00027 : m_hm(hm), m_digestSize(digestSize) {}
00028 TruncatedHashTemplate(const byte *key, size_t keyLength, unsigned int digestSize)
00029 : m_hm(key, keyLength), m_digestSize(digestSize) {}
00030 TruncatedHashTemplate(size_t digestSize)
00031 : m_digestSize(digestSize) {}
00032
00033 void Restart()
00034 {m_hm.Restart();}
00035 void Update(const byte *input, size_t length)
00036 {m_hm.Update(input, length);}
00037 unsigned int DigestSize() const {return m_digestSize;}
00038 void TruncatedFinal(byte *digest, size_t digestSize)
00039 {m_hm.TruncatedFinal(digest, digestSize);}
00040 bool TruncatedVerify(const byte *digest, size_t digestLength)
00041 {return m_hm.TruncatedVerify(digest, digestLength);}
00042
00043 private:
00044 T m_hm;
00045 unsigned int m_digestSize;
00046 };
00047
00048 typedef TruncatedHashTemplate<HashTransformation &> TruncatedHashModule;
00049
00050 NAMESPACE_END
00051
00052 #endif