use crate::errors::Error;
use crate::version::private::Version;
use alloc::vec::Vec;
use core::fmt::Debug;
use core::marker::PhantomData;
pub trait Generate<T, V: Version> {
fn generate() -> Result<T, Error>;
}
#[derive(Clone)]
pub struct SymmetricKey<V> {
pub(crate) bytes: Vec<u8>,
pub(crate) phantom: PhantomData<V>,
}
impl<V: Version> SymmetricKey<V> {
pub fn from(bytes: &[u8]) -> Result<Self, Error> {
V::validate_local_key(bytes)?;
Ok(Self {
bytes: bytes.to_vec(),
phantom: PhantomData,
})
}
pub fn as_bytes(&self) -> &[u8] {
self.bytes.as_slice()
}
}
impl<V> Drop for SymmetricKey<V> {
fn drop(&mut self) {
use zeroize::Zeroize;
self.bytes.iter_mut().zeroize();
}
}
impl<V> Debug for SymmetricKey<V> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "SymmetricKey {{***OMITTED***}}")
}
}
impl<V: Version> PartialEq<SymmetricKey<V>> for SymmetricKey<V> {
fn eq(&self, other: &SymmetricKey<V>) -> bool {
use subtle::ConstantTimeEq;
self.as_bytes().ct_eq(other.as_bytes()).into()
}
}
#[derive(Clone)]
pub struct AsymmetricSecretKey<V> {
pub(crate) bytes: Vec<u8>,
pub(crate) phantom: PhantomData<V>,
}
impl<V: Version> AsymmetricSecretKey<V> {
pub fn from(bytes: &[u8]) -> Result<Self, Error> {
V::validate_secret_key(bytes)?;
Ok(Self {
bytes: bytes.to_vec(),
phantom: PhantomData,
})
}
pub fn as_bytes(&self) -> &[u8] {
self.bytes.as_slice()
}
}
impl<V> Drop for AsymmetricSecretKey<V> {
fn drop(&mut self) {
use zeroize::Zeroize;
self.bytes.iter_mut().zeroize();
}
}
impl<V> Debug for AsymmetricSecretKey<V> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "AsymmetricSecretKey {{***OMITTED***}}")
}
}
impl<V: Version> PartialEq<AsymmetricSecretKey<V>> for AsymmetricSecretKey<V> {
fn eq(&self, other: &AsymmetricSecretKey<V>) -> bool {
use subtle::ConstantTimeEq;
self.as_bytes().ct_eq(other.as_bytes()).into()
}
}
#[derive(Debug, Clone)]
pub struct AsymmetricPublicKey<V> {
pub(crate) bytes: Vec<u8>,
pub(crate) phantom: PhantomData<V>,
}
impl<V: Version> AsymmetricPublicKey<V> {
pub fn from(bytes: &[u8]) -> Result<Self, Error> {
V::validate_public_key(bytes)?;
Ok(Self {
bytes: bytes.to_vec(),
phantom: PhantomData,
})
}
pub fn as_bytes(&self) -> &[u8] {
self.bytes.as_slice()
}
}
impl<V: Version> PartialEq<AsymmetricPublicKey<V>> for AsymmetricPublicKey<V> {
fn eq(&self, other: &AsymmetricPublicKey<V>) -> bool {
use subtle::ConstantTimeEq;
self.as_bytes().ct_eq(other.as_bytes()).into()
}
}
#[derive(Debug, Clone)]
pub struct AsymmetricKeyPair<V> {
pub public: AsymmetricPublicKey<V>,
pub secret: AsymmetricSecretKey<V>,
}