use core::mem::size_of;
use zerocopy::{AsBytes, FromBytes};
use zeroize::Zeroize;
#[cfg(all(feature = "dalek", not(feature = "force_sodium")))]
use crate::dalek::ephemeral as eph;
#[cfg(all(
feature = "sodium",
any(feature = "force_sodium", not(feature = "dalek"))
))]
use crate::sodium::ephemeral as eph;
#[cfg(any(feature = "sodium", feature = "dalek"))]
pub use eph::{
derive_shared_secret, derive_shared_secret_pk, derive_shared_secret_sk, sk_to_curve,
};
#[cfg(any(feature = "sodium", all(feature = "dalek", feature = "getrandom")))]
pub use eph::generate_ephemeral_keypair;
#[cfg(feature = "dalek")]
pub use crate::dalek::ephemeral::generate_ephemeral_keypair_with_rng;
#[derive(Zeroize)]
#[zeroize(drop)]
pub struct EphSecretKey(pub [u8; 32]);
impl EphSecretKey {
pub const SIZE: usize = size_of::<Self>();
}
#[derive(Copy, Clone, AsBytes, FromBytes)]
#[repr(C)]
pub struct EphPublicKey(pub [u8; 32]);
impl EphPublicKey {
pub const SIZE: usize = size_of::<Self>();
pub fn from_slice(s: &[u8]) -> Option<Self> {
if s.len() == Self::SIZE {
let mut out = Self([0; Self::SIZE]);
out.0.copy_from_slice(s);
Some(out)
} else {
None
}
}
}
#[derive(AsBytes, Clone, Zeroize)]
#[repr(C)]
#[zeroize(drop)]
pub struct SharedSecret(pub [u8; 32]);