#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
use crate::{from_bytes, match_algo, Config, EncappedKeyAndCiphertext, HpkeError};
use hpke::Serializable;
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
#[cfg(feature = "base-mode-seal")]
pub fn base_mode_seal(
config: &Config,
recipient_public_key: &[u8],
info: &[u8],
plaintext: &[u8],
aad: &[u8],
) -> Result<EncappedKeyAndCiphertext, HpkeError> {
let Config { aead, kdf, kem } = *config;
let seal = match_algo!(aead, kdf, kem, seal);
seal(recipient_public_key, info, plaintext, aad)
}
fn seal<AeadT, KdfT, KemT>(
recipient_public_key: &[u8],
info: &[u8],
plaintext: &[u8],
aad: &[u8],
) -> Result<EncappedKeyAndCiphertext, HpkeError>
where
AeadT: hpke::aead::Aead,
KdfT: hpke::kdf::Kdf,
KemT: hpke::kem::Kem,
{
let (encapped_key, ciphertext) = hpke::single_shot_seal::<AeadT, KdfT, KemT, _>(
&hpke::OpModeS::Base,
&from_bytes(recipient_public_key)?,
info,
plaintext,
aad,
&mut rand::thread_rng(),
)?;
Ok(EncappedKeyAndCiphertext {
encapped_key: encapped_key.to_bytes().to_vec(),
ciphertext,
})
}