use serde::{Deserialize, Serialize};
pub const SUITE_V1: &str = "Kyber1024+XChaCha20P1305+Dilithium3";
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct SenderPub {
pub sid: String,
#[serde(with = "serde_bytes")]
pub pk_dilithium: Vec<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecipientPub {
pub kid: String,
#[serde(with = "serde_bytes")]
pub pk_kyber: Vec<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct Header {
pub v: u32,
pub suite: String,
pub sender: String,
pub recipients: Vec<String>,
pub msg_id: String,
pub timestamp_unix: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct RecipientEnvelope {
pub kid: String,
#[serde(with = "serde_bytes")]
pub kem_ct: Vec<u8>,
#[serde(with = "serde_bytes")]
pub wrap_nonce: Vec<u8>,
#[serde(with = "serde_bytes")]
pub wrapped_cek: Vec<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct BundleUnsigned {
pub header: Header,
#[serde(with = "serde_bytes")]
pub pay_nonce: Vec<u8>,
#[serde(with = "serde_bytes")]
pub ciphertext: Vec<u8>,
pub recipients: Vec<RecipientEnvelope>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct BundleSigned {
pub inner: BundleUnsigned,
#[serde(with = "serde_bytes")]
pub sig_dilithium: Vec<u8>,
}
pub fn to_cbor_canonical<T: serde::Serialize>(v: &T) -> Result<Vec<u8>, crate::TholosError> {
let mut buf = Vec::new();
let mut ser = serde_cbor::ser::Serializer::new(&mut buf);
let _ = ser.self_describe(); v.serialize(&mut ser).map_err(|e| crate::TholosError::Ser(e.to_string()))?;
Ok(buf)
}
pub fn from_cbor<T: serde::de::DeserializeOwned>(data: &[u8]) -> Result<T, crate::TholosError> {
serde_cbor::from_slice::<T>(data).map_err(|e| crate::TholosError::Ser(e.to_string()))
}