From 85a61808de0abd14f4a7cb243f74fd4e82e1b0c0 Mon Sep 17 00:00:00 2001 From: Karolin Varner Date: Thu, 30 Nov 2023 14:13:19 +0100 Subject: [PATCH] feat: Use the zeroize crate for zeroization --- Cargo.lock | 1 + secret-memory/Cargo.toml | 1 + secret-memory/src/secret.rs | 21 ++++++++++++--------- sodium/src/helpers.rs | 5 ----- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e6870b..ba73b44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1126,6 +1126,7 @@ dependencies = [ "rosenpass-sodium", "rosenpass-to", "rosenpass-util", + "zeroize", ] [[package]] diff --git a/secret-memory/Cargo.toml b/secret-memory/Cargo.toml index 48d5ddb..c102599 100644 --- a/secret-memory/Cargo.toml +++ b/secret-memory/Cargo.toml @@ -16,3 +16,4 @@ rosenpass-sodium = { workspace = true } rosenpass-util = { workspace = true } libsodium-sys-stable = { workspace = true } lazy_static = { workspace = true } +zeroize = { workspace = true } diff --git a/secret-memory/src/secret.rs b/secret-memory/src/secret.rs index 97983dc..76d5b66 100644 --- a/secret-memory/src/secret.rs +++ b/secret-memory/src/secret.rs @@ -6,6 +6,7 @@ use rosenpass_util::{ file::{fopen_r, LoadValue, LoadValueB64, ReadExactToEnd}, functional::mutating, }; +use zeroize::{Zeroize, ZeroizeOnDrop}; use std::{ collections::HashMap, convert::TryInto, fmt, os::raw::c_void, path::Path, ptr::null_mut, @@ -74,7 +75,7 @@ impl SecretMemoryPool { /// /// # Safety /// - /// This function contains an unsafe call to [libsodium::sodium_malloc]. + /// This function contains an unsafe call to [libsodium_sys::sodium_malloc]. /// This call has no known safety invariants, thus nothing can go wrong™. /// However, just like normal `malloc()` this can return a null ptr. Thus /// the returned pointer is checked for null; causing the program to panic @@ -100,8 +101,8 @@ impl Drop for SecretMemoryPool { /// # Safety /// /// The drop implementation frees the contained elements using - /// [libsodium::sodium_free]. This is safe as long as every `*mut c_void` - /// contained was initialized with a call to [libsodium::sodium_malloc] + /// [libsodium_sys::sodium_free]. This is safe as long as every `*mut c_void` + /// contained was initialized with a call to [libsodium_sys::sodium_malloc] fn drop(&mut self) { for ptr in self.pool.drain().flat_map(|(_, x)| x.into_iter()) { unsafe { @@ -119,7 +120,7 @@ unsafe impl Send for SecretMemoryPool {} /// Store for a secret /// -/// Uses memory allocated with [libsodium::sodium_malloc], +/// Uses memory allocated with [libsodium_sys::sodium_malloc], /// esentially can do the same things as `[u8; N].as_mut_ptr()`. pub struct Secret { ptr: *mut c_void, @@ -164,11 +165,6 @@ impl Secret { mutating(Self::zero(), |r| r.randomize()) } - /// Sets all data of an existing secret to null bytes - pub fn zeroize(&mut self) { - rosenpass_sodium::helpers::memzero(self.secret_mut()); - } - /// Sets all data an existing secret to random bytes pub fn randomize(&mut self) { rosenpass_sodium::helpers::randombytes_buf(self.secret_mut()); @@ -204,6 +200,13 @@ impl fmt::Debug for Secret { } } +impl ZeroizeOnDrop for Secret {} +impl Zeroize for Secret { + fn zeroize(&mut self) { + self.secret_mut().zeroize(); + } +} + impl LoadValue for Secret { type Error = anyhow::Error; diff --git a/sodium/src/helpers.rs b/sodium/src/helpers.rs index a83bc99..26e0bf5 100644 --- a/sodium/src/helpers.rs +++ b/sodium/src/helpers.rs @@ -32,11 +32,6 @@ pub fn randombytes_buf(buf: &mut [u8]) { unsafe { libsodium::randombytes_buf(buf.as_mut_ptr() as *mut c_void, buf.len()) }; } -#[inline] -pub fn memzero(buf: &mut [u8]) { - unsafe { libsodium::sodium_memzero(buf.as_mut_ptr() as *mut c_void, buf.len()) }; -} - // Choose a fully random u64 // TODO: Replace with ::rand::random pub fn rand_u64() -> u64 {