[go: up one dir, main page]

seckey/
lib.rs

1//! Use [memsec](https://github.com/quininer/memsec) protected secret memory.
2
3#![no_std]
4
5#[cfg(feature = "use_std")]
6extern crate std;
7
8mod cmpkey;
9mod tempkey;
10mod alloc;
11
12#[cfg(feature = "use_std")]
13mod bytes;
14
15use core::{ mem, ptr };
16pub use cmpkey::CmpKey;
17pub use tempkey::TempKey;
18pub use alloc::ZeroAllocator;
19
20#[cfg(feature = "use_std")]
21pub use bytes::{ SecBytes, SecReadGuard, SecWriteGuard };
22
23
24/// Free a value
25///
26/// Note that this does not clean data outside of the stack.
27///
28/// ```
29/// use seckey::free;
30///
31/// let v = [1, 2, 3];
32/// free(v);
33/// ```
34pub fn free<T: Sized>(mut t: T) {
35    unsafe {
36        ptr::drop_in_place(&mut t);
37        memsec::memzero(&mut t as *mut T as *mut u8, mem::size_of_val(&t));
38        if mem::needs_drop::<T>() {
39            mem::forget(t);
40        }
41    }
42}
43
44/// Zero bytes
45///
46/// ```
47/// use seckey::zero;
48///
49/// let mut v = [1, 2, 3];
50/// zero(&mut v);
51/// assert_eq!(v, [0, 0, 0]);
52///
53/// let mut v = &mut [1u8, 2, 3][..];
54/// zero(v);
55/// assert_eq!(v, [0, 0, 0]);
56/// ```
57#[inline]
58pub fn zero(t: &mut [u8]) {
59    unsafe {
60        memsec::memzero(t.as_mut_ptr(), t.len());
61    }
62}