tuwunel_service/server_keys/
sign.rs1use ruma::{CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, RoomVersionId};
2use tuwunel_core::{
3 Result, err, implement,
4 matrix::{event::gen_event_id, room_version},
5};
6
7#[implement(super::Service)]
8pub fn gen_id_hash_and_sign_event(
9 &self,
10 object: &mut CanonicalJsonObject,
11 room_version_id: &RoomVersionId,
12) -> Result<OwnedEventId> {
13 object.remove("event_id");
14
15 if room_version::rules(room_version_id)?
16 .event_format
17 .require_event_id
18 {
19 self.gen_id_hash_and_sign_event_v1(object, room_version_id)
20 } else {
21 self.gen_id_hash_and_sign_event_v3(object, room_version_id)
22 }
23}
24
25#[implement(super::Service)]
26fn gen_id_hash_and_sign_event_v1(
27 &self,
28 object: &mut CanonicalJsonObject,
29 room_version_id: &RoomVersionId,
30) -> Result<OwnedEventId> {
31 let event_id = gen_event_id(object, room_version_id)?;
32
33 object.insert("event_id".into(), CanonicalJsonValue::String(event_id.clone().into()));
34
35 self.services
36 .server_keys
37 .hash_and_sign_event(object, room_version_id)?;
38
39 Ok(event_id)
40}
41
42#[implement(super::Service)]
43fn gen_id_hash_and_sign_event_v3(
44 &self,
45 object: &mut CanonicalJsonObject,
46 room_version_id: &RoomVersionId,
47) -> Result<OwnedEventId> {
48 self.services
49 .server_keys
50 .hash_and_sign_event(object, room_version_id)?;
51
52 let event_id = gen_event_id(object, room_version_id)?;
53
54 object.insert("event_id".into(), CanonicalJsonValue::String(event_id.clone().into()));
55
56 Ok(event_id)
57}
58
59#[implement(super::Service)]
60pub fn hash_and_sign_event(
61 &self,
62 object: &mut CanonicalJsonObject,
63 room_version_id: &RoomVersionId,
64) -> Result {
65 use ruma::signatures::{hash_event, sign_event};
66
67 let server_name = &self.services.server.name;
68 let room_version_rules = room_version::rules(room_version_id)?;
69
70 let map_err = |e: ruma::signatures::JsonError| {
71 use ruma::signatures::JsonError::PduTooLarge;
72 match e {
73 | PduTooLarge => {
74 err!(Request(TooLarge("PDU exceeds 65535 bytes")))
75 },
76 | _ => err!(Request(Unknown(warn!("Signing event failed: {e}")))),
77 }
78 };
79
80 hash_event(object).map_err(map_err)?;
81 sign_event(server_name.as_str(), self.keypair(), object, &room_version_rules.redaction)
82 .map_err(map_err)
83}
84
85#[implement(super::Service)]
86pub fn sign_json(&self, object: &mut CanonicalJsonObject) -> Result {
87 use ruma::signatures::sign_json;
88
89 let server_name = self.services.globals.server_name().as_str();
90
91 sign_json(server_name, self.keypair(), object).map_err(Into::into)
92}