git / moonbite-core / src/libmw/include/mw/models/crypto/SignedMessage.h · raw

#pragma once#include <mw/common/Traits.h>#include <mw/crypto/Hasher.h>#include <mw/models/crypto/Hash.h>#include <mw/models/crypto/PublicKey.h>#include <mw/models/crypto/Signature.h>#include <boost/functional/hash.hpp>/// <summary>/// Contains a hashed message, a signature of that message, and the public key it was signed for./// </summary>class SignedMessage : public Traits::ISerializable, public Traits::IHashable{public:    SignedMessage() = default;    SignedMessage(const SignedMessage&) = default;    SignedMessage(SignedMessage&&) = default;    SignedMessage(mw::Hash msgHash, PublicKey publicKey, Signature signature)        : m_messageHash(std::move(msgHash)), m_publicKey(std::move(publicKey)), m_signature(std::move(signature))    {        m_hash = Hashed(*this);    }    //    // Operators    //    SignedMessage& operator=(const SignedMessage& other) = default;    SignedMessage& operator=(SignedMessage&& other) noexcept = default;    bool operator==(const SignedMessage& rhs) const noexcept {        return m_messageHash == rhs.m_messageHash            && m_publicKey == rhs.m_publicKey            && m_signature == rhs.m_signature;    }    bool operator!=(const SignedMessage& rhs) const noexcept { return !(*this == rhs); }    //    // Getters    //    const mw::Hash& GetMsgHash() const noexcept { return m_messageHash; }    const PublicKey& GetPublicKey() const noexcept { return m_publicKey; }    const Signature& GetSignature() const noexcept { return m_signature; }    IMPL_SERIALIZABLE(SignedMessage, obj)    {        READWRITE(obj.m_messageHash);        READWRITE(obj.m_publicKey);        READWRITE(obj.m_signature);        SER_READ(obj, obj.m_hash = Hashed(obj));    }    const mw::Hash& GetHash() const noexcept final { return m_hash; }private:    mw::Hash m_messageHash;    PublicKey m_publicKey;    Signature m_signature;    mw::Hash m_hash;};namespace std{    template<>    struct hash<SignedMessage>    {        size_t operator()(const SignedMessage& hash) const        {            return boost::hash_value(hash.Serialized());        }    };}