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}