trunhash.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // trunhash.h - originally written and placed in the public domain by Wei Dai
  2. /// \file trunhash.h
  3. /// \brief Classes for truncated hashes
  4. #ifndef CRYPTOPP_TRUNHASH_H
  5. #define CRYPTOPP_TRUNHASH_H
  6. #include "cryptlib.h"
  7. NAMESPACE_BEGIN(CryptoPP)
  8. /// \brief Null hash
  9. /// \details A null hash that conforms to HashTransformation interface
  10. class NullHash : public HashTransformation
  11. {
  12. public:
  13. void Update(const byte *input, size_t length)
  14. {CRYPTOPP_UNUSED(input);CRYPTOPP_UNUSED(length);}
  15. unsigned int DigestSize() const
  16. {return 0;}
  17. void TruncatedFinal(byte *digest, size_t digestSize)
  18. {CRYPTOPP_UNUSED(digest);CRYPTOPP_UNUSED(digestSize);}
  19. bool TruncatedVerify(const byte *digest, size_t digestLength)
  20. {CRYPTOPP_UNUSED(digest);CRYPTOPP_UNUSED(digestLength);return true;}
  21. };
  22. /// \brief Construct new HashModule with smaller digest size from an existing one
  23. /// \tparam T HashTransformation derived class
  24. template <class T>
  25. class TruncatedHashTemplate : public HashTransformation
  26. {
  27. public:
  28. /// \brief Construct a TruncatedHashTemplate
  29. TruncatedHashTemplate(T hm, unsigned int digestSize)
  30. : m_hm(hm), m_digestSize(digestSize) {}
  31. /// \brief Construct a TruncatedHashTemplate
  32. TruncatedHashTemplate(const byte *key, size_t keyLength, unsigned int digestSize)
  33. : m_hm(key, keyLength), m_digestSize(digestSize) {}
  34. /// \brief Construct a TruncatedHashTemplate
  35. TruncatedHashTemplate(size_t digestSize)
  36. : m_digestSize(digestSize) {}
  37. void Restart()
  38. {m_hm.Restart();}
  39. void Update(const byte *input, size_t length)
  40. {m_hm.Update(input, length);}
  41. unsigned int DigestSize() const {return m_digestSize;}
  42. void TruncatedFinal(byte *digest, size_t digestSize)
  43. {m_hm.TruncatedFinal(digest, digestSize);}
  44. bool TruncatedVerify(const byte *digest, size_t digestLength)
  45. {return m_hm.TruncatedVerify(digest, digestLength);}
  46. private:
  47. T m_hm;
  48. unsigned int m_digestSize;
  49. };
  50. typedef TruncatedHashTemplate<HashTransformation &> TruncatedHashModule;
  51. NAMESPACE_END
  52. #endif