crypto_hash.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* Any copyright is dedicated to the Public Domain.
  2. * http://creativecommons.org/publicdomain/zero/1.0/ */
  3. // Written in 2014 by Nils Maier
  4. #ifndef CRYPTO_HASH_H
  5. #define CRYPTO_HASH_H
  6. #include <cstdint>
  7. #include <cstring>
  8. #include <memory>
  9. #include <set>
  10. #include <string>
  11. #include <limits>
  12. namespace crypto {
  13. namespace hash {
  14. enum Algorithms {
  15. algoNone = 0x0,
  16. algoMD5 = 0x1,
  17. algoSHA1 = 0x2,
  18. algoSHA224 = 0x3,
  19. algoSHA256 = 0x4,
  20. algoSHA384 = 0x5,
  21. algoSHA512 = 0x6,
  22. };
  23. class Algorithm {
  24. public:
  25. Algorithm() {}
  26. virtual ~Algorithm() {}
  27. virtual void update(const void* data, uint64_t len) = 0;
  28. inline void update(const std::string& data)
  29. {
  30. return update(data.data(), data.length());
  31. }
  32. virtual std::string finalize() = 0;
  33. virtual void reset() = 0;
  34. virtual uint_fast16_t length() const = 0;
  35. virtual uint_fast16_t blocksize() const = 0;
  36. private:
  37. Algorithm(const Algorithm&) = delete;
  38. Algorithm& operator=(const Algorithm&) = delete;
  39. };
  40. const std::set<std::string>& all();
  41. Algorithms lookup(const std::string& name);
  42. std::unique_ptr<Algorithm> create(Algorithms algo);
  43. inline std::unique_ptr<Algorithm> create(const std::string& name)
  44. {
  45. return create(lookup(name));
  46. }
  47. inline uint_fast16_t length(Algorithms algo) { return create(algo)->length(); }
  48. inline uint_fast16_t length(const std::string& name)
  49. {
  50. return create(name)->length();
  51. }
  52. inline std::string compute(Algorithms algo, const void* data, uint_fast64_t len)
  53. {
  54. auto ctx = create(algo);
  55. ctx->update(data, len);
  56. return ctx->finalize();
  57. }
  58. inline std::string compute(Algorithms algo, const std::string& data)
  59. {
  60. return compute(algo, data.data(), data.length());
  61. }
  62. inline std::string compute(const std::string& name, const void* data,
  63. uint_fast64_t len)
  64. {
  65. return compute(lookup(name), data, len);
  66. }
  67. inline std::string compute(const std::string& name, const std::string& data)
  68. {
  69. return compute(lookup(name), data.data(), data.length());
  70. }
  71. } // namespace hash
  72. } // namespace crypto
  73. #endif // CRYPTO_HASH_H