From 99634d9702497d3f64f42d1c18c5f034f6aa6a5a Mon Sep 17 00:00:00 2001 From: Karolin Varner Date: Fri, 17 Nov 2023 16:47:25 +0100 Subject: [PATCH] chore: Move sodium init integration into rosenpass-sodium crate --- Cargo.lock | 11 +++++++++++ Cargo.toml | 1 + rosenpass-sodium/Cargo.toml | 16 ++++++++++++++++ rosenpass-sodium/readme.md | 5 +++++ rosenpass-sodium/src/lib.rs | 16 ++++++++++++++++ rosenpass/Cargo.toml | 8 +++----- rosenpass/src/main.rs | 11 +++++++++-- rosenpass/src/protocol.rs | 6 +++--- rosenpass/src/sodium.rs | 7 ------- 9 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 rosenpass-sodium/Cargo.toml create mode 100644 rosenpass-sodium/readme.md create mode 100644 rosenpass-sodium/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index de81d0a..b97ac4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1025,6 +1025,7 @@ dependencies = [ "oqs-sys", "paste", "rosenpass-constant-time", + "rosenpass-sodium", "rosenpass-util", "serde", "stacker", @@ -1038,6 +1039,16 @@ dependencies = [ name = "rosenpass-constant-time" version = "0.1.0" +[[package]] +name = "rosenpass-sodium" +version = "0.1.0" +dependencies = [ + "anyhow", + "libsodium-sys-stable", + "log", + "rosenpass-util", +] + [[package]] name = "rosenpass-util" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 87e2a78..c939129 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "rosenpass", "rosenpass-util", "rosenpass-constant-time", + "rosenpass-sodium", ] [workspace.metadata.release] diff --git a/rosenpass-sodium/Cargo.toml b/rosenpass-sodium/Cargo.toml new file mode 100644 index 0000000..91229da --- /dev/null +++ b/rosenpass-sodium/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "rosenpass-sodium" +authors = ["Karolin Varner ", "wucke13 "] +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +description = "Rosenpass internal bindings to libsodium" +homepage = "https://rosenpass.eu/" +repository = "https://github.com/rosenpass/rosenpass" +readme = "readme.md" + +[dependencies] +rosenpass-util = { path = "../rosenpass-util" } +anyhow = { version = "1.0.71", features = ["backtrace"] } +libsodium-sys-stable = { version = "1.19.28", features = ["use-pkg-config"] } +log = { version = "0.4.17" } diff --git a/rosenpass-sodium/readme.md b/rosenpass-sodium/readme.md new file mode 100644 index 0000000..0ddad45 --- /dev/null +++ b/rosenpass-sodium/readme.md @@ -0,0 +1,5 @@ +# Rosenpass internal libsodium bindings + +Rosenpass internal library providing bindings to libsodium. + +This is an internal library; not guarantee is made about its API at this point in time. diff --git a/rosenpass-sodium/src/lib.rs b/rosenpass-sodium/src/lib.rs new file mode 100644 index 0000000..8a95fd9 --- /dev/null +++ b/rosenpass-sodium/src/lib.rs @@ -0,0 +1,16 @@ +use libsodium_sys as libsodium; + +macro_rules! sodium_call { + ($name:ident, $($args:expr),*) => { ::rosenpass_util::attempt!({ + anyhow::ensure!(unsafe{libsodium::$name($($args),*)} > -1, + "Error in libsodium's {}.", stringify!($name)); + Ok(()) + })}; + ($name:ident) => { sodium_call!($name, ) }; +} + +#[inline] +pub fn init() -> anyhow::Result<()> { + log::trace!("initializing libsodium"); + sodium_call!(sodium_init) +} diff --git a/rosenpass/Cargo.toml b/rosenpass/Cargo.toml index bc641a1..0fc1b49 100644 --- a/rosenpass/Cargo.toml +++ b/rosenpass/Cargo.toml @@ -16,6 +16,7 @@ harness = false [dependencies] rosenpass-util = { path = "../rosenpass-util" } rosenpass-constant-time = { path = "../rosenpass-constant-time" } +rosenpass-sodium = { path = "../rosenpass-sodium" } anyhow = { version = "1.0.71", features = ["backtrace"] } static_assertions = "1.1.0" memoffset = "0.9.0" @@ -24,8 +25,8 @@ oqs-sys = { version = "0.8", default-features = false, features = ['classic_mcel lazy_static = "1.4.0" thiserror = "1.0.40" paste = "1.0.12" -log = { version = "0.4.17", optional = true } -env_logger = { version = "0.10.0", optional = true } +log = { version = "0.4.17" } +env_logger = { version = "0.10.0" } serde = { version = "1.0.163", features = ["derive"] } toml = "0.7.4" clap = { version = "4.3.0", features = ["derive"] } @@ -38,6 +39,3 @@ anyhow = "1.0.71" criterion = "0.4.0" test_bin = "0.4.0" stacker = "0.1.15" - -[features] -default = ["log", "env_logger"] diff --git a/rosenpass/src/main.rs b/rosenpass/src/main.rs index f4af8ce..c6c9d84 100644 --- a/rosenpass/src/main.rs +++ b/rosenpass/src/main.rs @@ -1,11 +1,18 @@ use log::error; -use rosenpass::{cli::Cli, sodium::sodium_init}; +use rosenpass::cli::Cli; +use rosenpass_util::attempt; use std::process::exit; /// Catches errors, prints them through the logger, then exits pub fn main() { env_logger::init(); - match sodium_init().and_then(|()| Cli::run()) { + + let res = attempt!({ + rosenpass_sodium::init()?; + Cli::run() + }); + + match res { Ok(_) => {} Err(e) => { error!("{e}"); diff --git a/rosenpass/src/protocol.rs b/rosenpass/src/protocol.rs index 2af37d8..41bf5fc 100644 --- a/rosenpass/src/protocol.rs +++ b/rosenpass/src/protocol.rs @@ -25,8 +25,8 @@ //! }; //! # fn main() -> anyhow::Result<()> { //! -//! // always init libsodium before anything -//! rosenpass::sodium::sodium_init()?; +//! // always initialize libsodium before anything +//! rosenpass_sodium::init()?; //! //! // initialize secret and public key for peer a ... //! let (mut peer_a_sk, mut peer_a_pk) = (SSk::zero(), SPk::zero()); @@ -1750,7 +1750,7 @@ mod test { /// Through all this, the handshake should still successfully terminate; /// i.e. an exchanged key must be produced in both servers. fn handles_incorrect_size_messages() { - crate::sodium::sodium_init().unwrap(); + rosenpass_sodium::init().unwrap(); stacker::grow(8 * 1024 * 1024, || { const OVERSIZED_MESSAGE: usize = ((MAX_MESSAGE_LEN as f32) * 1.2) as usize; diff --git a/rosenpass/src/sodium.rs b/rosenpass/src/sodium.rs index 84ed5f4..e41d35e 100644 --- a/rosenpass/src/sodium.rs +++ b/rosenpass/src/sodium.rs @@ -2,7 +2,6 @@ use anyhow::{ensure, Result}; use libsodium_sys as libsodium; -use log::trace; use rosenpass_constant_time::xor_into; use rosenpass_util::attempt; use static_assertions::const_assert_eq; @@ -34,12 +33,6 @@ macro_rules! sodium_call { ($name:ident) => { sodium_call!($name, ) }; } -#[inline] -pub fn sodium_init() -> Result<()> { - trace!("initializing libsodium"); - sodium_call!(sodium_init) -} - #[inline] pub fn sodium_memcmp(a: &[u8], b: &[u8]) -> bool { a.len() == b.len()