p2panda_encryption/traits/
message.rs1#[cfg(any(test, feature = "data_scheme"))]
4use crate::crypto::xchacha20::XAeadNonce;
5#[cfg(any(test, feature = "data_scheme"))]
6use crate::data_scheme::{self, GroupSecretId};
7#[cfg(any(test, feature = "message_scheme"))]
8use crate::message_scheme::{self, Generation};
9#[cfg(any(test, feature = "message_scheme"))]
10use crate::traits::AckedGroupMembership;
11#[cfg(any(test, feature = "data_scheme"))]
12use crate::traits::GroupMembership;
13
14#[cfg(any(test, feature = "data_scheme"))]
21pub trait GroupMessage<ID, OP, DGM>
22where
23 DGM: GroupMembership<ID, OP>,
24{
25 fn id(&self) -> OP;
27
28 fn sender(&self) -> ID;
30
31 fn content(&self) -> GroupMessageContent<ID>;
33
34 fn direct_messages(&self) -> Vec<data_scheme::DirectMessage<ID, OP, DGM>>;
36}
37
38#[cfg(any(test, feature = "data_scheme"))]
39#[derive(Debug)]
40pub enum GroupMessageContent<ID> {
41 Control(data_scheme::ControlMessage<ID>),
43
44 Application {
46 group_secret_id: GroupSecretId,
48
49 nonce: XAeadNonce,
51
52 ciphertext: Vec<u8>,
54 },
55}
56
57#[cfg(any(test, feature = "data_scheme"))]
58impl<ID> std::fmt::Display for GroupMessageContent<ID> {
59 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60 write!(
61 f,
62 "{}",
63 match self {
64 Self::Control(control_message) => control_message.to_string(),
65 Self::Application {
66 group_secret_id, ..
67 } => format!("application @{}", hex::encode(group_secret_id)),
68 }
69 )
70 }
71}
72
73#[cfg(any(test, feature = "message_scheme"))]
80pub trait ForwardSecureGroupMessage<ID, OP, DGM>
81where
82 DGM: AckedGroupMembership<ID, OP>,
83{
84 fn id(&self) -> OP;
86
87 fn sender(&self) -> ID;
89
90 fn content(&self) -> ForwardSecureMessageContent<ID, OP>;
92
93 fn direct_messages(&self) -> Vec<message_scheme::DirectMessage<ID, OP, DGM>>;
100}
101
102#[cfg(any(test, feature = "message_scheme"))]
103#[derive(Debug)]
104pub enum ForwardSecureMessageContent<ID, OP> {
105 Control(message_scheme::ControlMessage<ID, OP>),
107
108 Application {
110 ciphertext: Vec<u8>,
111 generation: Generation,
112 },
113}
114
115#[cfg(any(test, feature = "message_scheme"))]
116impl<ID, OP> std::fmt::Display for ForwardSecureMessageContent<ID, OP> {
117 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
118 write!(
119 f,
120 "{}",
121 match self {
122 Self::Control(control_message) => control_message.to_string(),
123 Self::Application { generation, .. } => format!("application @{generation}"),
124 }
125 )
126 }
127}