#[cfg(any(test, feature = "data_scheme"))]
use crate::crypto::xchacha20::XAeadNonce;
#[cfg(any(test, feature = "data_scheme"))]
use crate::data_scheme::{self, GroupSecretId};
#[cfg(any(test, feature = "message_scheme"))]
use crate::message_scheme::{self, Generation};
#[cfg(any(test, feature = "message_scheme"))]
use crate::traits::AckedGroupMembership;
#[cfg(any(test, feature = "data_scheme"))]
use crate::traits::GroupMembership;
#[cfg(any(test, feature = "data_scheme"))]
pub trait GroupMessage<ID, OP, DGM>
where
DGM: GroupMembership<ID, OP>,
{
fn id(&self) -> OP;
fn sender(&self) -> ID;
fn content(&self) -> GroupMessageContent<ID>;
fn direct_messages(&self) -> Vec<data_scheme::DirectMessage<ID, OP, DGM>>;
}
#[cfg(any(test, feature = "data_scheme"))]
#[derive(Debug)]
pub enum GroupMessageContent<ID> {
Control(data_scheme::ControlMessage<ID>),
Application {
group_secret_id: GroupSecretId,
nonce: XAeadNonce,
ciphertext: Vec<u8>,
},
}
#[cfg(any(test, feature = "data_scheme"))]
impl<ID> std::fmt::Display for GroupMessageContent<ID> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::Control(control_message) => control_message.to_string(),
Self::Application {
group_secret_id, ..
} => format!("application @{}", hex::encode(group_secret_id)),
}
)
}
}
#[cfg(any(test, feature = "message_scheme"))]
pub trait ForwardSecureGroupMessage<ID, OP, DGM>
where
DGM: AckedGroupMembership<ID, OP>,
{
fn id(&self) -> OP;
fn sender(&self) -> ID;
fn content(&self) -> ForwardSecureMessageContent<ID, OP>;
fn direct_messages(&self) -> Vec<message_scheme::DirectMessage<ID, OP, DGM>>;
}
#[cfg(any(test, feature = "message_scheme"))]
#[derive(Debug)]
pub enum ForwardSecureMessageContent<ID, OP> {
Control(message_scheme::ControlMessage<ID, OP>),
Application {
ciphertext: Vec<u8>,
generation: Generation,
},
}
#[cfg(any(test, feature = "message_scheme"))]
impl<ID, OP> std::fmt::Display for ForwardSecureMessageContent<ID, OP> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::Control(control_message) => control_message.to_string(),
Self::Application { generation, .. } => format!("application @{generation}"),
}
)
}
}