relay-core 0.2.0-beta.4

The core components of the Relay Protocol.
Documentation
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
    }
}