| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */// Written in 2014 by Nils Maier#ifndef CRYPTO_HASH_H#define CRYPTO_HASH_H#include <cstdint>#include <cstring>#include <memory>#include <set>#include <string>#include <limits>namespace crypto {namespace hash {enum Algorithms {  algoNone = 0x0,  algoMD5 = 0x1,  algoSHA1 = 0x2,  algoSHA224 = 0x3,  algoSHA256 = 0x4,  algoSHA384 = 0x5,  algoSHA512 = 0x6,};class Algorithm {public:  Algorithm() = default;  virtual ~Algorithm() = default;  virtual void update(const void* data, uint64_t len) = 0;  inline void update(const std::string& data)  {    return update(data.data(), data.length());  }  virtual std::string finalize() = 0;  virtual void reset() = 0;  virtual uint_fast16_t length() const = 0;  virtual uint_fast16_t blocksize() const = 0;private:  Algorithm(const Algorithm&) = delete;  Algorithm& operator=(const Algorithm&) = delete;};const std::set<std::string>& all();Algorithms lookup(const std::string& name);std::unique_ptr<Algorithm> create(Algorithms algo);inline std::unique_ptr<Algorithm> create(const std::string& name){  return create(lookup(name));}inline uint_fast16_t length(Algorithms algo) { return create(algo)->length(); }inline uint_fast16_t length(const std::string& name){  return create(name)->length();}inline std::string compute(Algorithms algo, const void* data, uint_fast64_t len){  auto ctx = create(algo);  ctx->update(data, len);  return ctx->finalize();}inline std::string compute(Algorithms algo, const std::string& data){  return compute(algo, data.data(), data.length());}inline std::string compute(const std::string& name, const void* data,                           uint_fast64_t len){  return compute(lookup(name), data, len);}inline std::string compute(const std::string& name, const std::string& data){  return compute(lookup(name), data.data(), data.length());}} // namespace hash} // namespace crypto#endif // CRYPTO_HASH_H
 |