navajo 0.0.4

cryptographic APIs
Documentation
use alloc::vec::Vec;
use serde::{Deserialize, Serialize};
use zeroize::ZeroizeOnDrop;

use crate::sensitive;

#[derive(Clone, ZeroizeOnDrop, Debug, Eq, PartialEq)]
pub(super) struct KeyPair {
    pub(super) private: sensitive::Bytes,
    pub(super) public: sensitive::Bytes,
}
#[derive(Serialize, Deserialize)]
struct KeyPairData(sensitive::Bytes, sensitive::Bytes);

impl<'de> Deserialize<'de> for KeyPair {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let KeyPairData(private, public) = Deserialize::deserialize(deserializer)?;
        Ok(Self { private, public })
    }
}
impl Serialize for KeyPair {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let data = KeyPairData(self.private.clone(), self.public.clone());
        data.serialize(serializer)
    }
}

impl KeyPair {
    pub(super) fn concat(&self) -> Vec<u8> {
        [self.private.as_ref(), self.public.as_ref()].concat()
    }
}