#![forbid(unsafe_code)]
#![warn(missing_docs, rust_2018_idioms)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
mod api;
mod constants;
mod error;
mod hybrid_kem;
mod keys;
mod multi;
#[cfg(feature = "pem")]
#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
mod pem;
mod rotate;
mod seal;
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
mod serde_impls;
mod sign;
mod stream;
mod types;
mod wire;
pub use api::HybridCrypto;
pub use constants::*;
pub use error::{Error, Result};
pub use keys::{KeyId, KeyPair, PublicKeyBundle};
pub use multi::{open_multi, seal_multi, MultiRecipientEnvelope};
pub use rotate::{verify_rotation, RotationAttestation};
pub use seal::{open, seal};
pub use stream::{StreamOpener, StreamSealer};
pub use types::{Envelope, HybridSignature};
pub use zeroize::Zeroizing;
pub fn verify(
message: &[u8],
context: &[u8],
signature: &HybridSignature,
signer: &PublicKeyBundle,
) -> Result<()> {
sign::verify(message, context, signature, signer)
}
pub mod prelude {
pub use crate::{
seal, verify, Envelope, HybridCrypto, HybridSignature, KeyPair, PublicKeyBundle, Result,
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn end_to_end_encryption() {
let alice = HybridCrypto::generate().unwrap();
let bob = HybridCrypto::generate().unwrap();
let envelope = alice.seal_for(b"Test message", bob.public_keys()).unwrap();
let decrypted = bob.open(&envelope).unwrap();
assert_eq!(decrypted, b"Test message");
}
#[test]
fn end_to_end_signature() {
let alice = HybridCrypto::generate().unwrap();
let sig = alice.sign(b"Message to sign", b"").unwrap();
verify(b"Message to sign", b"", &sig, alice.public_keys()).unwrap();
}
#[test]
fn free_function_seal_matches_method() {
let bob = HybridCrypto::generate().unwrap();
let envelope = seal(b"via free function", bob.public_keys()).unwrap();
assert_eq!(bob.open(&envelope).unwrap(), b"via free function");
}
}