#![cfg_attr(docsrs, feature(doc_cfg))]
#![no_std]
#[cfg(feature = "std")]
#[allow(unused_imports)]
#[macro_use]
extern crate std;
#[cfg(feature = "std")]
pub(crate) use std::vec::Vec;
#[cfg(all(feature = "alloc", not(feature = "std")))]
#[allow(unused_imports)]
#[macro_use]
extern crate alloc;
#[cfg(all(feature = "alloc", not(feature = "std")))]
pub(crate) use alloc::vec::Vec;
#[macro_use]
mod util;
#[cfg(all(test, feature = "std", feature = "secp"))]
mod kat_tests;
#[cfg(test)]
mod test_util;
pub use generic_array;
pub use rand_core;
pub mod aead;
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};
#[doc(inline)]
pub use setup::{setup_receiver, setup_sender};
#[doc(inline)]
pub use single_shot::{single_shot_open_in_place_detached, single_shot_seal_in_place_detached};
#[doc(inline)]
#[cfg(any(feature = "alloc", feature = "std"))]
pub use single_shot::{single_shot_open, single_shot_seal};
use generic_array::{typenum::marker_traits::Unsigned, ArrayLength, GenericArray};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HpkeError {
MessageLimitReached,
OpenError,
SealError,
KdfOutputTooLong,
ValidationError,
EncapError,
DecapError,
IncorrectInputLength(usize, usize),
}
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
),
}
}
}
pub trait Serializable {
type OutputSize: ArrayLength<u8>;
fn write_exact(&self, buf: &mut [u8]);
fn to_bytes(&self) -> GenericArray<u8, Self::OutputSize> {
let mut buf = GenericArray::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>;
}
#[cfg(feature = "std")]
impl std::error::Error for HpkeError {}