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