win_crypto_ng/buffer.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
//! Secure buffer implementation
use std::fmt::{Debug, Error, Formatter};
/// Secure buffer implementation.
///
/// On creation, the buffer is initialized with zeroes.
/// On destruction, if the `zeroize` feature is enabled, its content is set to
/// `0` before being released.
#[derive(PartialOrd, PartialEq)]
pub struct Buffer {
inner: Vec<u8>,
}
impl Buffer {
/// Create a new buffer of the specified size.
///
/// # Examples
///
/// ```
/// # use win_crypto_ng::buffer::Buffer;
/// let buf = Buffer::new(76);
/// assert_eq!(buf.len(), 76);
/// ```
pub fn new(size: usize) -> Self {
Buffer {
inner: vec![0; size],
}
}
/// Create a new buffer with its data copied from the slice.
///
/// # Examples
///
/// ```
/// # use win_crypto_ng::buffer::Buffer;
/// const SOME_DATA: &'static [u8] = &[0x01, 0x02, 0x03, 0x04];
/// let buf = Buffer::from(SOME_DATA);
/// assert_eq!(buf.as_slice(), SOME_DATA);
/// ```
pub fn from(data: &[u8]) -> Self {
Buffer {
inner: data.to_vec(),
}
}
pub fn from_vec(data: Vec<u8>) -> Self {
Buffer { inner: data }
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn as_ptr(&self) -> *const u8 {
self.inner.as_ptr()
}
pub fn as_mut_ptr(&mut self) -> *mut u8 {
self.inner.as_mut_ptr()
}
pub fn as_slice(&self) -> &[u8] {
self.inner.as_slice()
}
pub fn as_mut_slice(&mut self) -> &mut [u8] {
self.inner.as_mut_slice()
}
pub fn into_inner(mut self) -> Vec<u8> {
std::mem::take(&mut self.inner)
}
}
impl Drop for Buffer {
fn drop(&mut self) {
#[cfg(feature = "zeroize")]
zeroize::Zeroize::zeroize(&mut self.inner);
}
}
impl Debug for Buffer {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "{:02X?}", self.inner)
}
}