diff --git a/include/ircd/m/id.h b/include/ircd/m/id.h index c29efe317..538b2612d 100644 --- a/include/ircd/m/id.h +++ b/include/ircd/m/id.h @@ -14,6 +14,7 @@ namespace ircd::m { struct id; + struct event; // forward declaration for id::event ctors IRCD_M_EXCEPTION(error, INVALID_MXID, http::BAD_REQUEST) IRCD_M_EXCEPTION(INVALID_MXID, BAD_SIGIL, http::BAD_REQUEST) @@ -178,7 +179,7 @@ struct ircd::m::id::event struct ircd::m::id::event::v3 :ircd::m::id::event { - v3(const mutable_buffer &out, const json::object &); + v3(const mutable_buffer &out, const m::event &); v3(const string_view &id); v3() = default; }; @@ -187,7 +188,7 @@ struct ircd::m::id::event::v3 struct ircd::m::id::event::v4 :ircd::m::id::event { - v4(const mutable_buffer &out, const json::object &); + v4(const mutable_buffer &out, const m::event &); v4(const string_view &id); v4() = default; }; diff --git a/ircd/m_id.cc b/ircd/m_id.cc index 041bd7344..abf79ed98 100644 --- a/ircd/m_id.cc +++ b/ircd/m_id.cc @@ -692,7 +692,7 @@ ircd::m::id::event::v3::v3(const string_view &id) } ircd::m::id::event::v3::v3(const mutable_buffer &out, - const json::object &event) + const m::event &event) :v3{[&out, event] { if(unlikely(buffer::size(out) < 44)) @@ -701,9 +701,21 @@ ircd::m::id::event::v3::v3(const mutable_buffer &out, "Output buffer insufficient for v3 event_id" }; + thread_local char content_buffer[m::event::MAX_SIZE]; + const m::event essential + { + m::essential(event, content_buffer) + }; + + thread_local char preimage_buffer[m::event::MAX_SIZE]; + const json::object &preimage + { + json::stringify(preimage_buffer, essential) + }; + const sha256::buf hash { - sha256{event} + sha256{preimage} }; out[0] = '$'; @@ -735,7 +747,7 @@ ircd::m::id::event::v4::v4(const string_view &id) } ircd::m::id::event::v4::v4(const mutable_buffer &out, - const json::object &event) + const m::event &event) :v4{[&out, event] { if(unlikely(buffer::size(out) < 44)) @@ -744,9 +756,21 @@ ircd::m::id::event::v4::v4(const mutable_buffer &out, "Output buffer insufficient for v4 event_id" }; + thread_local char content_buffer[m::event::MAX_SIZE]; + const m::event essential + { + m::essential(event, content_buffer) + }; + + thread_local char preimage_buffer[m::event::MAX_SIZE]; + const json::object &preimage + { + json::stringify(preimage_buffer, essential) + }; + const sha256::buf hash { - sha256{event} + sha256{preimage} }; out[0] = '$';