use crate::{crypto::AgreementAlgorithmTy, rng::CryptoRng};
pub trait Agreement: Sized {
type EphemeralSecretKey;
type PublicKey;
type SharedSecret;
fn diffie_hellman(
&self,
esk: Self::EphemeralSecretKey,
pk: &[u8],
) -> crate::Result<Self::SharedSecret>;
fn ephemeral_secret_key<RNG>(
&self,
aat: AgreementAlgorithmTy,
rng: &mut RNG,
) -> crate::Result<Self::EphemeralSecretKey>
where
RNG: CryptoRng;
fn public_key(&self, esk: &Self::EphemeralSecretKey) -> crate::Result<Self::PublicKey>;
}
impl Agreement for () {
type EphemeralSecretKey = ();
type SharedSecret = ();
type PublicKey = [u8; 0];
#[inline]
fn diffie_hellman(
&self,
_: Self::EphemeralSecretKey,
_: &[u8],
) -> crate::Result<Self::SharedSecret> {
Ok(())
}
#[inline]
fn ephemeral_secret_key<RNG>(
&self,
_: AgreementAlgorithmTy,
_: &mut RNG,
) -> crate::Result<Self::EphemeralSecretKey>
where
RNG: CryptoRng,
{
Ok(())
}
#[inline]
fn public_key(&self, _: &Self::EphemeralSecretKey) -> crate::Result<Self::PublicKey> {
Ok([0; 0])
}
}