diff --git a/Cargo.lock b/Cargo.lock index 853b0a4..d6fbe06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1891,6 +1891,8 @@ dependencies = [ "oqs-sys", "paste", "rosenpass-cipher-traits", + "rosenpass-constant-time", + "rosenpass-secret-memory", "rosenpass-util", ] diff --git a/oqs/Cargo.toml b/oqs/Cargo.toml index ed93c74..6a69563 100644 --- a/oqs/Cargo.toml +++ b/oqs/Cargo.toml @@ -14,3 +14,7 @@ rosenpass-cipher-traits = { workspace = true } rosenpass-util = { workspace = true } oqs-sys = { workspace = true } paste = { workspace = true } + +[dev-dependencies] +rosenpass-secret-memory = { workspace = true } +rosenpass-constant-time = { workspace = true } diff --git a/oqs/src/kem_macro.rs b/oqs/src/kem_macro.rs index d26a53b..fc05b4f 100644 --- a/oqs/src/kem_macro.rs +++ b/oqs/src/kem_macro.rs @@ -1,9 +1,42 @@ +//! Generic helpers for declaring bindings to liboqs kems + +/// Generate bindings to a liboqs-provided KEM macro_rules! oqs_kem { ($name:ident) => { ::paste::paste!{ + #[doc = "Bindings for ::oqs_sys::kem::" [<"OQS_KEM" _ $name:snake>] "_*"] mod [< $name:snake >] { use rosenpass_cipher_traits::Kem; use rosenpass_util::result::Guaranteed; + #[doc = "Bindings for ::oqs_sys::kem::" [<"OQS_KEM" _ $name:snake>] "_*"] + #[doc = ""] + #[doc = "# Examples"] + #[doc = ""] + #[doc = "```rust"] + #[doc = "use std::borrow::{Borrow, BorrowMut};"] + #[doc = "use rosenpass_cipher_traits::Kem;"] + #[doc = "use rosenpass_oqs::" $name:camel " as MyKem;"] + #[doc = "use rosenpass_secret_memory::{Secret, Public};"] + #[doc = ""] + #[doc = "rosenpass_secret_memory::secret_policy_try_use_memfd_secrets();"] + #[doc = ""] + #[doc = "// Recipient generates secret key, transfers pk to sender"] + #[doc = "let mut sk = Secret::<{ MyKem::SK_LEN }>::zero();"] + #[doc = "let mut pk = Public::<{ MyKem::PK_LEN }>::zero();"] + #[doc = "MyKem::keygen(sk.secret_mut(), pk.borrow_mut());"] + #[doc = ""] + #[doc = "// Sender generates ciphertext and local shared key, sends ciphertext to recipient"] + #[doc = "let mut shk_enc = Secret::<{ MyKem::SHK_LEN }>::zero();"] + #[doc = "let mut ct = Public::<{ MyKem::CT_LEN }>::zero();"] + #[doc = "MyKem::encaps(shk_enc.secret_mut(), ct.borrow_mut(), pk.borrow());"] + #[doc = ""] + #[doc = "// Recipient decapsulates ciphertext"] + #[doc = "let mut shk_dec = Secret::<{ MyKem::SHK_LEN }>::zero();"] + #[doc = "MyKem::decaps(shk_dec.secret_mut(), sk.secret(), ct.borrow());"] + #[doc = ""] + #[doc = "// Both parties end up with the same shared key"] + #[doc = "assert!(rosenpass_constant_time::compare(shk_enc.secret_mut(), shk_dec.secret_mut()) == 0);"] + #[doc = "```"] pub enum [< $name:camel >] {} /// # Panic & Safety diff --git a/oqs/src/lib.rs b/oqs/src/lib.rs index f8f4506..842a8d5 100644 --- a/oqs/src/lib.rs +++ b/oqs/src/lib.rs @@ -1,3 +1,8 @@ +#![warn(missing_docs)] +#![warn(clippy::missing_docs_in_private_items)] +//! Bindings for liboqs used in Rosenpass + +/// Call into a libOQS function macro_rules! oqs_call { ($name:path, $($args:expr),*) => {{ use oqs_sys::common::OQS_STATUS::*;