use alloc::boxed::Box;
use alloc::vec::Vec;
use core::fmt::Debug;
use zeroize::Zeroize;
use crate::Error;
use crate::msgs::enums::HpkeKem;
use crate::msgs::handshake::HpkeSymmetricCipherSuite;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct HpkeSuite {
pub kem: HpkeKem,
pub sym: HpkeSymmetricCipherSuite,
}
pub trait Hpke: Debug + Send + Sync {
fn seal(
&self,
info: &[u8],
aad: &[u8],
plaintext: &[u8],
pub_key: &HpkePublicKey,
) -> Result<(EncapsulatedSecret, Vec<u8>), Error>;
fn setup_sealer(
&self,
info: &[u8],
pub_key: &HpkePublicKey,
) -> Result<(EncapsulatedSecret, Box<dyn HpkeSealer + 'static>), Error>;
fn open(
&self,
enc: &EncapsulatedSecret,
info: &[u8],
aad: &[u8],
ciphertext: &[u8],
secret_key: &HpkePrivateKey,
) -> Result<Vec<u8>, Error>;
fn setup_opener(
&self,
enc: &EncapsulatedSecret,
info: &[u8],
secret_key: &HpkePrivateKey,
) -> Result<Box<dyn HpkeOpener + 'static>, Error>;
fn generate_key_pair(&self) -> Result<(HpkePublicKey, HpkePrivateKey), Error>;
fn fips(&self) -> bool {
false
}
fn suite(&self) -> HpkeSuite;
}
pub trait HpkeSealer: Debug + Send + Sync + 'static {
fn seal(&mut self, aad: &[u8], plaintext: &[u8]) -> Result<Vec<u8>, Error>;
}
pub trait HpkeOpener: Debug + Send + Sync + 'static {
fn open(&mut self, aad: &[u8], ciphertext: &[u8]) -> Result<Vec<u8>, Error>;
}
#[derive(Clone, Debug)]
pub struct HpkePublicKey(pub Vec<u8>);
pub struct HpkePrivateKey(Vec<u8>);
impl HpkePrivateKey {
pub fn secret_bytes(&self) -> &[u8] {
self.0.as_slice()
}
}
impl From<Vec<u8>> for HpkePrivateKey {
fn from(bytes: Vec<u8>) -> Self {
Self(bytes)
}
}
impl Drop for HpkePrivateKey {
fn drop(&mut self) {
self.0.zeroize();
}
}
pub struct HpkeKeyPair {
pub public_key: HpkePublicKey,
pub private_key: HpkePrivateKey,
}
#[derive(Debug)]
pub struct EncapsulatedSecret(pub Vec<u8>);