age_crypto/types/
passphrase.rs1use 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}