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