win_crypto_ng/
buffer.rs

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