use serde::{Deserialize, Serialize};
use serde_with::{base64::Base64, serde_as};
use crate::{info::EncryptionInfo, prelude::Signature};
#[serde_as]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Payload<T> {
pub info: EncryptionInfo,
pub signature: Option<Signature>,
#[serde_as(as = "Base64")]
pub ciphertext: Vec<u8>,
#[serde(skip)]
_marker: std::marker::PhantomData<T>,
}
impl<T> Payload<T> {
pub fn new(info: EncryptionInfo, signature: Option<Signature>, ciphertext: Vec<u8>) -> Self {
Self {
signature,
info,
ciphertext,
_marker: std::marker::PhantomData,
}
}
pub fn is_signed(&self) -> bool {
self.signature.is_some()
}
pub fn signing_bytes(&self) -> Vec<u8> {
let mut out = self.ciphertext.clone();
out.extend(self.info.alg.as_bytes());
out.extend(&self.info.data);
out
}
}