use serde::{Deserialize, Serialize};
#[cfg(any(feature = "pqc-utils", feature = "ed25519-utils"))]
use crate::{MResult, ServerError};
#[derive(Deserialize, Serialize, PartialEq, Eq, Hash, Clone)]
pub struct MPAATHeader<U> {
pub authnz_pkey: Vec<u8>,
pub nonce: Vec<u8>,
#[serde(flatten)]
pub common_public_fields: Option<U>,
}
#[derive(Deserialize, Serialize, PartialEq, Eq, Hash, Clone)]
pub struct MPAATPayload<T> {
pub cli_pkey: Vec<u8>,
pub exp: chrono::DateTime<chrono::Utc>,
#[serde(flatten)]
pub container: T,
}
#[derive(Deserialize, Serialize, PartialEq, Eq, Hash, Clone)]
pub struct MPAATSignature {
pub sig: Vec<u8>,
}
#[cfg(any(feature = "pqc-utils", feature = "ed25519-utils"))]
impl<U: serde::Serialize> MPAATHeader<U> {
pub fn sign_mpaat(&self, payload: &[u8], keypair: &crate::SignKeypair) -> MResult<Vec<u8>> {
let mut data = rmp_serde::to_vec(self).map_err(ServerError::from_private)?;
data.extend_from_slice(payload);
Ok(keypair.sign_raw(&data))
}
}