From a73e2cd8d80c7729f512a57add9cb576beba2b58 Mon Sep 17 00:00:00 2001 From: Janis Date: Tue, 30 Jul 2024 15:50:37 +0200 Subject: [PATCH] cleanup, refactor --- Cargo.toml | 5 ++--- src/bin/duralumin-keygen.rs | 19 ++++++++++++++----- src/key_gen.rs | 19 +++++++++++++------ src/lib.rs | 1 - src/{ed25519.rs => randomart.rs} | 0 5 files changed, 29 insertions(+), 15 deletions(-) rename src/{ed25519.rs => randomart.rs} (100%) diff --git a/Cargo.toml b/Cargo.toml index 1519497..37bd916 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,13 +25,12 @@ required-features = ["ed25519", "clap", "rpassword", "base64"] [dependencies] rand = "0.8" -rand_chacha = "0.3" clap = {version = "3.0.0-beta.5", optional = true, features = ["derive"]} base64 = {version = "0.13", optional = true} bytes = {version = "1.1", optional = true} sha2 = {version = "0.9", optional = true} -rpassword = {version = "5.0", optional = true} -zeroize = {version = "1.5"} +rpassword = {version = "7.0", optional = true} +zeroize = {version = "1.8"} argon2 = "0.5.3" thiserror = "1.0" anyhow = "1.0" diff --git a/src/bin/duralumin-keygen.rs b/src/bin/duralumin-keygen.rs index d76b713..73776b0 100644 --- a/src/bin/duralumin-keygen.rs +++ b/src/bin/duralumin-keygen.rs @@ -4,12 +4,12 @@ use clap::Parser; #[derive(Parser)] #[clap( name = "duralumin-keygen", - version = "0.2.0", + version = "0.3.0", author = "No One " )] struct Opts { - #[clap(short, long, default_value = "duralumin")] - file: String, + #[clap(short, long)] + file: Option, } fn main() -> anyhow::Result<()> { @@ -17,6 +17,15 @@ fn main() -> anyhow::Result<()> { println!("Generating ed25519 ssh keypair:"); let desc = libduralumin::key_gen::cli::keygen_desc_from_stdin()?; + + let base_path = opts.file.unwrap_or_else(|| { + if let Some(tag) = desc.tag.as_ref() { + format!("duralumin_{}", tag.as_str()) + } else { + "duralumin".to_owned() + } + }); + let keypair = libduralumin::key_gen::generate_key(desc)?; println!( @@ -29,8 +38,8 @@ fn main() -> anyhow::Result<()> { keypair.randomart().render("ED25519 256", "SHA256")? ); - let private_path = opts.file.clone(); - let public_path = opts.file.clone() + ".pub"; + let private_path = base_path.clone(); + let public_path = base_path.clone() + ".pub"; let (private_key, public_key) = keypair.encode_keys()?; std::fs::write(&private_path, private_key)?; diff --git a/src/key_gen.rs b/src/key_gen.rs index 0e5e041..9ec550d 100644 --- a/src/key_gen.rs +++ b/src/key_gen.rs @@ -5,6 +5,8 @@ use zeroize::Zeroizing; use crate::randomart; pub mod cli { + use std::io::Write; + use zeroize::Zeroizing; use crate::key_gen::{HashDesc, KeygenDesc}; @@ -26,6 +28,7 @@ pub mod cli { line } pub fn read_line() -> std::io::Result { + std::io::stdout().flush()?; let mut line = String::new(); std::io::stdin().read_line(&mut line)?; fix_newline_ref(&mut line); @@ -54,9 +57,9 @@ pub mod cli { pub type Result = std::result::Result; fn read_passphrase() -> Result> { - let passphrase = Zeroizing::new(rpassword::prompt_password_stdout("Enter a passphrase: ")?); - let passphrase2 = - Zeroizing::new(rpassword::prompt_password_stdout("Enter a passphrase: ")?); + let passphrase = Zeroizing::new(rpassword::prompt_password("Enter a passphrase: ")?); + let passphrase2 = Zeroizing::new(rpassword::prompt_password("Re-enter your passphrase: ")?); + std::io::stdout().flush().expect("flush stdout"); if passphrase == passphrase2 { println!( @@ -71,6 +74,7 @@ pub mod cli { pub fn read_argon_desc() -> Result { print!("Use argon2 variant (argon2i, argon2d, argon2id) [argon2id]: "); + let variant = match read_non_empty_line()?.as_ref().map(|s| s.as_str()) { Some("argon2i") => argon2::Algorithm::Argon2i, Some("argon2d") => argon2::Algorithm::Argon2d, @@ -80,7 +84,7 @@ pub mod cli { } }; - print!("Use argon2 version (16,19) [argon2id]: "); + print!("Use argon2 version (16,19) [19]: "); let version = match read_non_empty_line()?.as_ref().map(|s| s.as_str()) { Some("16") | Some("10") => argon2::Version::V0x10, Some("19") | Some("13") | None => argon2::Version::V0x13, @@ -143,7 +147,10 @@ pub mod cli { let tag = read_non_empty_line()?.map(|s| Zeroizing::new(s)); print!("Encrypt keypair with passphrase? [Y/n]: "); - let encrypt = read_line()? == "Y"; + let encrypt = read_line()? != "n"; + if encrypt { + print!("Will encrypt keypair."); + } print!("Use hash algorithm (sha256, argon2) [argon2]: "); let hash = match read_non_empty_line()?.as_ref().map(|s| s.as_str()) { @@ -225,7 +232,7 @@ impl KeyPair { } let private_key = Zeroizing::new(core::str::from_utf8(&private_key).unwrap().to_string()); - let public_key = public_key.public_key_base64(); + let public_key = format!("{} {}", public_key.name(), public_key.public_key_base64()); Ok((private_key, public_key)) } } diff --git a/src/lib.rs b/src/lib.rs index 2ff4547..1d96c9d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,6 @@ pub mod passphrase_gen; #[cfg(feature = "password-gen")] pub mod password_gen; -#[path = "ed25519.rs"] pub mod randomart; #[cfg(feature = "ed25519")] diff --git a/src/ed25519.rs b/src/randomart.rs similarity index 100% rename from src/ed25519.rs rename to src/randomart.rs