use alloc::vec::Vec;
use rand::{CryptoRng, RngCore};
use thiserror::Error;
use crate::utils::{
Deserializable, Serializable,
zeroize::{Zeroize, ZeroizeOnDrop},
};
pub mod k256;
pub mod x25519;
pub(crate) trait KeyAgreementScheme {
type EphemeralSecretKey: ZeroizeOnDrop;
type EphemeralPublicKey: Serializable + Deserializable;
type SecretKey;
type PublicKey: Clone;
type SharedSecret: AsRef<[u8]> + Zeroize + ZeroizeOnDrop;
fn generate_ephemeral_keypair<R: CryptoRng + RngCore>(
rng: &mut R,
) -> (Self::EphemeralSecretKey, Self::EphemeralPublicKey);
fn exchange_ephemeral_static(
ephemeral_sk: Self::EphemeralSecretKey,
static_pk: &Self::PublicKey,
) -> Result<Self::SharedSecret, KeyAgreementError>;
fn exchange_static_ephemeral(
static_sk: &Self::SecretKey,
ephemeral_pk: &Self::EphemeralPublicKey,
) -> Result<Self::SharedSecret, KeyAgreementError>;
fn extract_key_material(
shared_secret: &Self::SharedSecret,
length: usize,
info: &[u8],
) -> Result<Vec<u8>, KeyAgreementError>;
}
#[derive(Debug, Error)]
pub(crate) enum KeyAgreementError {
#[error("hkdf expansion failed")]
HkdfExpansionFailed,
#[error("shared secret is invalid")]
InvalidSharedSecret,
}