use std::fmt;
use serde::{Deserialize, Serialize};
use speedy::{Readable, Writable};
use crate::{
messages::submessages::submessage::{InterpreterSubmessage, ReaderSubmessage, WriterSubmessage},
rtps::Submessage,
security::types::DataHolder,
structure::guid::GuidPrefix,
};
pub const GMCLASSID_SECURITY_PARTICIPANT_CRYPTO_TOKENS: &str = "dds.sec.participant_crypto_tokens";
pub const GMCLASSID_SECURITY_DATAWRITER_CRYPTO_TOKENS: &str = "dds.sec.datawriter_crypto_tokens";
pub const GMCLASSID_SECURITY_DATAREADER_CRYPTO_TOKENS: &str = "dds.sec.datareader_crypto_tokens";
#[derive(Clone)]
pub struct CryptoToken {
pub data_holder: DataHolder,
}
impl From<DataHolder> for CryptoToken {
fn from(value: DataHolder) -> Self {
CryptoToken { data_holder: value }
}
}
pub type ParticipantCryptoToken = CryptoToken;
pub type DatawriterCryptoToken = CryptoToken;
pub type DatareaderCryptoToken = CryptoToken;
pub type CryptoHandle = u32;
pub type ParticipantCryptoHandle = CryptoHandle;
pub type EndpointCryptoHandle = CryptoHandle;
pub type DatawriterCryptoHandle = EndpointCryptoHandle;
pub type DatareaderCryptoHandle = EndpointCryptoHandle;
#[derive(Debug, PartialEq, Eq, Clone, Readable, Writable)]
pub struct CryptoTransformIdentifier {
pub transformation_kind: CryptoTransformKind,
pub transformation_key_id: CryptoTransformKeyId,
}
pub type CryptoTransformKind = [u8; 4];
#[derive(Debug, Clone, Copy, Eq, PartialEq, Readable, Writable, Serialize, Deserialize, Hash)]
pub struct CryptoTransformKeyId([u8; 4]);
impl CryptoTransformKeyId {
pub const ZERO: Self = CryptoTransformKeyId([0, 0, 0, 0]);
pub fn is_zero(&self) -> bool {
*self == Self::ZERO
}
pub fn random() -> Self {
let random_array: [u8; 4] = rand::random();
Self(random_array)
}
}
impl From<[u8; 4]> for CryptoTransformKeyId {
fn from(b: [u8; 4]) -> Self {
Self(b)
}
}
impl fmt::Display for CryptoTransformKeyId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:02x?}", self.0)
}
}
#[allow(clippy::large_enum_variant)]
pub enum EncodedSubmessage {
Unencoded(Submessage),
Encoded(Submessage, Submessage, Submessage),
}
impl From<EncodedSubmessage> for Vec<Submessage> {
fn from(value: EncodedSubmessage) -> Self {
match value {
EncodedSubmessage::Unencoded(submessage) => vec![submessage],
EncodedSubmessage::Encoded(prefix, submessage, postfix) => vec![prefix, submessage, postfix],
}
}
}
pub enum DecodedSubmessage {
Interpreter(InterpreterSubmessage),
Writer(WriterSubmessage, Vec<EndpointCryptoHandle>),
Reader(ReaderSubmessage, Vec<EndpointCryptoHandle>),
}
pub enum DecodeOutcome<T> {
Success(T),
KeysNotFound(CryptoTransformKeyId),
ValidatingReceiverSpecificMACFailed,
ParticipantCryptoHandleNotFound(GuidPrefix),
}