owned/
owned.rs

1use readpassphrase_3::{readpassphrase, readpassphrase_into, Error, Flags, PASSWORD_LEN};
2use zeroize::{Zeroize, Zeroizing};
3
4fn main() -> Result<(), Error> {
5    let mut buf = Zeroizing::new(Some(vec![0u8; PASSWORD_LEN]));
6    let pass = Zeroizing::new(
7        readpassphrase(c"Password: ", buf.as_deref_mut().unwrap(), Flags::ECHO_ON)?.to_string(),
8    );
9    let mut buf = buf.take();
10    loop {
11        buf = Some(
12            match readpassphrase_into(c"Confirmation: ", buf.take().unwrap(), Flags::REQUIRE_TTY) {
13                Ok(mut s) if *pass == s => {
14                    s.zeroize();
15                    break;
16                }
17                Ok(s) => s.into_bytes(),
18                Err(e) => match e.error() {
19                    Error::Io(_) => return Err(e.into()),
20                    Error::Utf8(_) => {
21                        eprintln!("decode error: {e}");
22                        e.into_bytes()
23                    }
24                },
25            },
26        );
27    }
28    Ok(())
29}