Skip to main content

opentalk_types_signaling_e2ee/
lib.rs

1// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5use bytes::Bytes;
6use opentalk_types_common::modules::{ModuleId, module_id};
7use opentalk_types_signaling::ParticipantId;
8
9pub const MODULE_ID: ModuleId = module_id!("e2ee");
10
11#[derive(Debug, Clone)]
12#[cfg_attr(
13    feature = "serde",
14    derive(serde::Deserialize),
15    serde(rename_all = "snake_case", tag = "action")
16)]
17pub enum E2eeCommand {
18    Invite(Invite),
19    Message(MlsMessages),
20}
21
22#[derive(Debug, Clone)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24pub struct Invite {
25    pub invitee: ParticipantId,
26    pub welcome_message: WelcomeMessage,
27    /// Proposal and commit sent to the existing members of the group
28    pub mls_messages: MlsMessages,
29}
30
31/// Arbitrary encrypted message. This can be any kind of MLS or application message
32#[derive(Debug, Clone, PartialEq, Eq)]
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34pub struct MlsMessages {
35    pub payload: Vec<Bytes>,
36}
37
38impl MlsMessages {
39    pub fn is_valid(&self) -> bool {
40        !self.payload.is_empty()
41    }
42}
43
44/// Welcome and ratchet sent to the invitee
45#[derive(Debug, Clone, PartialEq, Eq)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub struct WelcomeMessage {
48    pub welcome: Bytes,
49    pub ratchet_tree: Bytes,
50}
51
52impl WelcomeMessage {
53    pub fn is_valid(&self) -> bool {
54        !self.welcome.is_empty() && !self.ratchet_tree.is_empty()
55    }
56}
57
58#[cfg_attr(
59    feature = "serde",
60    derive(serde::Serialize, serde::Deserialize),
61    serde(rename_all = "snake_case", tag = "message")
62)]
63#[derive(Debug, Clone, PartialEq, Eq)]
64pub enum E2eeEvent {
65    Welcome(WelcomeMessage),
66    MlsMessages(MlsMessages),
67    // Can't use tuple variant here, because serde recognizes this as a newtype
68    // which it can't serialize, see https://github.com/serde-rs/serde/issues/1307.
69    ParticipantLeft { participant_id: ParticipantId },
70    Error(Error),
71}
72
73#[derive(Debug, Clone, PartialEq, Eq)]
74#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
75pub enum Error {
76    /// The targeted participant does not exist
77    InvalidParticipantTarget,
78    /// The invite is not valid
79    InvalidInvite,
80}