#![cfg_attr(docsrs, feature(doc_cfg))]
#![no_std]
#[cfg(feature = "kat")]
#[macro_use]
extern crate std;
#[cfg(feature = "alloc")]
#[allow(unused_imports)]
#[macro_use]
extern crate alloc;
#[cfg(feature = "alloc")]
pub(crate) use alloc::vec::Vec;
#[cfg(all(test, feature = "kat"))]
mod kat_tests;
#[cfg(test)]
mod test_util;
#[cfg(not(any(feature = "x25519", feature = "nistp", feature = "mlkem")))]
compile_error!("At least one KEM feature must be enabled: `x25519`, `nistp`, or `mlkem`");
#[cfg(not(any(feature = "aes", feature = "chacha")))]
compile_error!("At least one AEAD feature must be enabled: `aes` or `chacha`");
pub use ::aead::inout;
pub use hybrid_array;
pub use rand_core;
#[macro_use]
mod util;
pub mod aead;
pub mod danger;
#[cfg(any(feature = "x25519", feature = "nistp"))]
mod dhkex;
pub mod kdf;
pub mod kem;
mod op_mode;
mod setup;
mod single_shot;
#[doc(inline)]
pub use kem::Kem;
#[doc(inline)]
pub use op_mode::{OpModeR, OpModeS, PskBundle};
#[cfg(feature = "getrandom")]
#[doc(inline)]
pub use setup::setup_sender;
#[doc(inline)]
pub use setup::{setup_receiver, setup_sender_with_rng};
#[cfg(feature = "getrandom")]
#[doc(inline)]
pub use single_shot::single_shot_seal_inout_detached;
#[doc(inline)]
pub use single_shot::{single_shot_open_inout_detached, single_shot_seal_inout_detached_with_rng};
#[cfg(all(feature = "alloc", feature = "getrandom"))]
#[doc(inline)]
pub use single_shot::single_shot_seal;
#[doc(inline)]
#[cfg(feature = "alloc")]
pub use single_shot::{single_shot_open, single_shot_seal_with_rng};
use hybrid_array::{Array, ArraySize, typenum::marker_traits::Unsigned};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HpkeError {
MessageLimitReached,
OpenError,
SealError,
KdfOutputTooLong,
ValidationError,
EncapError,
DecapError,
IncorrectInputLength(usize, usize),
InvalidPskBundle,
}
impl core::fmt::Display for HpkeError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
HpkeError::MessageLimitReached => write!(f, "Message limit reached"),
HpkeError::OpenError => write!(f, "Failed to open ciphertext"),
HpkeError::SealError => write!(f, "Failed to seal plaintext"),
HpkeError::KdfOutputTooLong => write!(f, "Too many bytes requested from KDF"),
HpkeError::ValidationError => write!(f, "Input value is invalid"),
HpkeError::EncapError => write!(f, "Encapsulation failed"),
HpkeError::DecapError => write!(f, "Decapsulation failed"),
HpkeError::IncorrectInputLength(expected, given) => write!(
f,
"Incorrect input length. Expected {} bytes. Got {}.",
expected, given
),
HpkeError::InvalidPskBundle => {
write!(f, "Preshared key bundle is missing a key or key ID")
}
}
}
}
pub trait Serializable {
type OutputSize: ArraySize;
fn write_exact(&self, buf: &mut [u8]);
fn to_bytes(&self) -> Array<u8, Self::OutputSize> {
let mut buf = Array::default();
self.write_exact(&mut buf);
buf
}
fn size() -> usize {
Self::OutputSize::to_usize()
}
}
pub trait Deserializable: Serializable + Sized {
fn from_bytes(encoded: &[u8]) -> Result<Self, HpkeError>;
}
impl core::error::Error for HpkeError {}