git / moonbite-core / src/libmw/include/mw/crypto/Hasher.h · raw
#pragma once#include <mw/common/Traits.h>#include <mw/models/crypto/Hash.h>#include <crypto/blake3/blake3.h>#include <hash.h>enum class EHashTag : char{ ADDRESS = 'A', BLIND = 'B', DERIVE = 'D', NONCE = 'N', OUT_KEY = 'O', SEND_KEY = 'S', TAG = 'T', NONCE_MASK = 'X', VALUE_MASK = 'Y'};class Hasher{public: Hasher() { blake3_hasher_init(&m_hasher); } Hasher(const EHashTag tag) { blake3_hasher_init(&m_hasher); char c_tag = static_cast<char>(tag); write(&c_tag, 1); } int GetType() const { return SER_GETHASH; } int GetVersion() const { return 0; } void write(const char* pch, size_t size) { blake3_hasher_update(&m_hasher, pch, size); } mw::Hash hash() { mw::Hash hashed; blake3_hasher_finalize(&m_hasher, hashed.data(), hashed.size()); return hashed; } template <class T> Hasher& Append(const T& t) { ::Serialize(*this, t); return *this; } template <typename T> Hasher& operator<<(const T& obj) { // Serialize to this stream ::Serialize(*this, obj); return (*this); }private: blake3_hasher m_hasher;};extern mw::Hash Hashed(const std::vector<uint8_t>& serialized);extern mw::Hash Hashed(const Traits::ISerializable& serializable);template<class T>mw::Hash Hashed(const EHashTag tag, const T& serializable){ return Hasher(tag).Append(serializable).hash();}