Skip to main content

age_crypto/types/
passphrase.rs

1use std::fmt;
2use zeroize::Zeroize;
3pub struct Passphrase {
4    inner: Vec<u8>,
5}
6impl Passphrase {
7    pub fn new(passphrase: &str) -> Self {
8        Self {
9            inner: passphrase.as_bytes().to_vec(),
10        }
11    }
12    #[must_use]
13    pub fn expose(&self) -> &str {
14        std::str::from_utf8(&self.inner).expect("Passphrase must be valid UTF-8")
15    }
16    #[must_use]
17    pub fn len(&self) -> usize {
18        self.inner.len()
19    }
20    #[must_use]
21    pub fn is_empty(&self) -> bool {
22        self.inner.is_empty()
23    }
24}
25impl Drop for Passphrase {
26    fn drop(&mut self) {
27        self.inner.zeroize();
28    }
29}
30impl Clone for Passphrase {
31    fn clone(&self) -> Self {
32        Self {
33            inner: self.inner.clone(),
34        }
35    }
36}
37impl fmt::Debug for Passphrase {
38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39        f.debug_struct("Passphrase")
40            .field("len", &self.inner.len())
41            .field("value", &"[REDACTED]")
42            .finish()
43    }
44}
45impl fmt::Display for Passphrase {
46    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47        write!(f, "[REDACTED]")
48    }
49}