1#ifndef CRYPTOPP_TRUNHASH_H 2#define CRYPTOPP_TRUNHASH_H 3 4#include "cryptlib.h" 5 6NAMESPACE_BEGIN(CryptoPP) 7 8class NullHash : public HashTransformation 9{ 10public: 11 void Update(const byte *input, size_t length) {} 12 unsigned int DigestSize() const {return 0;} 13 void TruncatedFinal(byte *digest, size_t digestSize) {} 14 bool TruncatedVerify(const byte *digest, size_t digestLength) {return true;} 15}; 16 17//! construct new HashModule with smaller DigestSize() from existing one 18template <class T> 19class TruncatedHashTemplate : public HashTransformation 20{ 21public: 22 TruncatedHashTemplate(T hm, unsigned int digestSize) 23 : m_hm(hm), m_digestSize(digestSize) {} 24 TruncatedHashTemplate(const byte *key, size_t keyLength, unsigned int digestSize) 25 : m_hm(key, keyLength), m_digestSize(digestSize) {} 26 TruncatedHashTemplate(size_t digestSize) 27 : m_digestSize(digestSize) {} 28 29 void Restart() 30 {m_hm.Restart();} 31 void Update(const byte *input, size_t length) 32 {m_hm.Update(input, length);} 33 unsigned int DigestSize() const {return m_digestSize;} 34 void TruncatedFinal(byte *digest, size_t digestSize) 35 {m_hm.TruncatedFinal(digest, digestSize);} 36 bool TruncatedVerify(const byte *digest, size_t digestLength) 37 {return m_hm.TruncatedVerify(digest, digestLength);} 38 39private: 40 T m_hm; 41 unsigned int m_digestSize; 42}; 43 44typedef TruncatedHashTemplate<HashTransformation &> TruncatedHashModule; 45 46NAMESPACE_END 47 48#endif 49