11#if defined(HA_EVPP_AUTO_COMMIT)
12#define ha_evpp_auto_commit() commit()
14#define ha_evpp_auto_commit()
85template <
typename Encoding = encodings::hex_encoding>
88 const char *end = NULL,
89 std::shared_ptr<Encoding> encoding = std::make_shared<Encoding>())
91 string s = encoding->encode(
digest, size);
93 if (end) os <<
string(end);
96template <
typename Encoding = encodings::hex_encoding>
98 const char *end = NULL,
99 const std::shared_ptr<Encoding> &encoding =
100 std::make_shared<Encoding>())
105template <
typename Encoding = encodings::hex_encoding>
107 const char *end = NULL,
108 const std::shared_ptr<Encoding> &encoding =
109 std::make_shared<Encoding>())
112 string s = encoding->encode(
digest, size);
113 fprintf(stream,
"%s", s.c_str());
114 if (end) fprintf(stream,
"%s", end);
118template <
typename Encoding = encodings::hex_encoding>
120 const char *end = NULL,
121 const std::shared_ptr<Encoding> &encoding =
122 std::make_shared<Encoding>())
129 const char *end = NULL)
149 if (lhs.size() != rhs.size())
return false;
150 size_t len = std::min (
151 lhs.size(), rhs.size());
152 return ha_cmphash(lhs.data(), rhs.data(), len) == 0;
159 if (lsize != rsize)
return false;
161 std::min (lsize, rsize);
168 size_t len = std::min (
169 lhs.size(), rhs.size());
184 explicit Hasher(ha_evp_hashty type = HA_EVPTY_UNDEFINED,
185 size_t digestlen = 0)
188 if (!hasher_)
throw std::runtime_error(
"Failed to create EVP hasher");
189 setup(type, digestlen);
236 digestlen = digestlen_;
248 ha_evp_update(hasher_.get(),
static_cast<const uint8_t *
>(data),
255 return update(data.data(), data.size());
260 return update(str, strlen(str));
265 return update(str.data(), str.size());
276 digest.resize(digestlen_);
283 std::vector<uint8_t>
digest(digestlen_);
288 auto hash(
const uint8_t *data,
size_t length, uint8_t *
digest)
295 auto hash(
const std::vector<uint8_t> &data, std::vector<uint8_t> &
digest)
298 digest.resize(digestlen_);
299 hash(data.data(), data.size(),
digest.data());
303 auto hash(
const std::string &str, std::vector<uint8_t> &
digest)
306 std::vector<uint8_t> data(str.begin(), str.end());
316 auto ptr() {
return this; }
321 ha_evp_hashty hashty_;
327#ifdef HA_EVPP_COMPATIBILITY
346 throw std::runtime_error(
"Failed to (re)create EVP hasher");
379 explicit evp(ha_evp_hashty hashty,
size_t digestlen = 0)
381 digestlen_(digestlen),
384 if (!hasher_)
throw std::runtime_error(
"Failed to create EVP hasher");
391 evp *set_hashty(ha_evp_hashty hashty)
400 evp *set_digestlen(
size_t digestlen)
402 digestlen_ = digestlen;
436 evp *update(
const std::vector<uint8_t> &data)
438 update(data.data(), data.size());
455 evp *
final(std::vector<uint8_t> &
digest)
457 digest.resize(digestlen_);
474 evp *hash(
const std::vector<uint8_t> &data, std::vector<uint8_t> &digest)
476 digest.resize(digestlen_);
482 ha_evp_hashty hashty_;
487 evp(
const evp &) =
delete;
488 evp &operator=(
const evp &) =
delete;
494#ifdef HA_EVPP_COMPATIBILITY
Hasher(ha_evp_hashty type=HA_EVPTY_UNDEFINED, size_t digestlen=0)
auto hash(const std::string &str, std::vector< uint8_t > &digest) -> Hasher &
Hasher & operator=(const Hasher &)=delete
auto update(const std::string &str) -> Hasher &
Hasher(Hasher &&) noexcept=default
auto update(const std::vector< uint8_t > &data) -> Hasher &
auto getDigestLength(size_t &digestlen) -> Hasher &
auto update(const void *data, size_t length) -> Hasher &
auto hash(const std::vector< uint8_t > &data, std::vector< uint8_t > &digest) -> Hasher &
auto update(const char *str) -> Hasher &
auto commit() -> Hasher &
auto getDigestLength() const
auto hash(const uint8_t *data, size_t length, uint8_t *digest) -> Hasher &
auto getType(ha_evp_hashty &hashty) -> Hasher &
auto setType(ha_evp_hashty type) -> Hasher &
Hasher(const Hasher &)=delete
auto setup(ha_evp_hashty hashty, size_t length=0) -> Hasher &
auto setDigestLength(size_t length) -> Hasher &
Header file for the EVP Hasher abstraction.
HA_PUBFUN void ha_evp_init(struct ha_evp_hasher *hasher)
Initializes the EVP hash. ( like ha_init(hash, ctx) )
HA_PUBFUN struct ha_evp_hasher * ha_evp_hasher_new(void)
Creates a new EVP hasher. ( malloc(g_ha_evp_hasher_size) )
HA_PUBFUN void ha_evp_hasher_cleanup(struct ha_evp_hasher *hasher)
Cleans up the internal state of the EVP hasher.
HA_PUBFUN void ha_evp_hasher_delete(struct ha_evp_hasher *ptr)
Frees the memory of an EVP hasher.
HA_PUBFUN void ha_evp_hasher_init(struct ha_evp_hasher *hasher, enum ha_evp_hashty hashty, size_t digestlen)
Initializes the EVP hasher for a specific algorithm and digest length.
HA_PUBFUN void ha_evp_hash(struct ha_evp_hasher *hasher, ha_inbuf_t buf, size_t len, ha_digest_t digest)
Computes the EVP hash in a single (hash) operation. ( like ha_hash(hash, buf, len,...
HA_PUBFUN signed long ha_evp_hashty_get_digestlen(enum ha_evp_hashty hashty)
Get fixed hash size.
HA_PUBFUN void ha_evp_update(struct ha_evp_hasher *hasher, ha_inbuf_t buf, size_t len)
Updates the EVP hash with input data. ( like ha_update(hash, ctx, buf, len) )
HA_PUBFUN void ha_evp_hasher_reinit(struct ha_evp_hasher *hasher, enum ha_evp_hashty hashty, size_t digestlen)
Reinitializes the EVP hasher with a new algorithm and digest length.
HA_PUBFUN void ha_evp_final(struct ha_evp_hasher *hasher, ha_digest_t digest)
Finalizes the EVP hash and produces the output digest. ( like ha_final(hash, ctx, digest,...
struct ha_evp_hasher ha_evp_hasher_t
Opaque structure for the EVP hasher state.
#define ha_evpp_auto_commit()
Header file for I/O operations related to hashing.
HA_PUBFUN size_t ha_hash2str(char *dst, ha_cdigest_t src, size_t len)
Converts a hash digest to a hexadecimal string representation.
HA_PUBFUN int ha_cmphash(ha_cdigest_t lhs, ha_cdigest_t rhs, size_t digestlen)
Compares two hash digests byte by byte.
#define ha_hash2str_bound(len)
HA_PUBFUN size_t ha_str2hash(ha_digest_t dst, const char *src, size_t len)
Converts a hexadecimal string representation to a hash digest.
HA_PUBFUN int ha_cmphashstr(ha_cdigest_t lhs, const char *rhs, size_t digestlen)
Compares a hash digest with a hexadecimal string representation.
HA_PUBFUN size_t ha_fputhash(FILE *stream, ha_cdigest_t digest, size_t digestlen, const char *end)
Writes the hash digest to the specified file stream.
#define ha_str2hash_bound(len)
std::vector< byte > digest
HA_HDR_PUBFUN void put(std::ostream &os, raw_cdigest digest, size_t size, const char *end=NULL, std::shared_ptr< Encoding > encoding=std::make_shared< Encoding >())
HA_HDR_PUBFUN bool compare(const digest &lhs, const digest &rhs)
virtual digest decode(const std::string &str)=0
virtual void decode(const std::string &str, raw_digest digest, size_t size)=0
virtual std::string encode(digest &digest)=0
virtual void decode(digest &digest, const std::string &s)=0
virtual std::string encode(raw_cdigest digest, size_t size)=0
HA_INL_FUN void decode(const std::string &s, raw_digest digest, size_t size) override
HA_INL_FUN std::string encode(raw_cdigest digest, size_t size) override
HA_INL_FUN std::string encode(digest &digest) override
HA_INL_FUN void decode(digest &digest, const std::string &s) override
HA_INL_FUN digest decode(const std::string &s) override
__ha_out_buf_type ha_outbuf_t
__ha_in_buf_type ha_inbuf_t