use anyhow::Result;
use rust_i18n::t;
use x25519_dalek::{PublicKey, StaticSecret};
pub struct TorKeys {
pub server_string: String,
pub client_string: String,
pub public_b32: String,
}
pub fn generate_keys() -> TorKeys {
let secret = StaticSecret::random();
let public = PublicKey::from(&secret);
let secret_b32 = base32::encode(
base32::Alphabet::Rfc4648 { padding: false },
secret.to_bytes().as_slice(),
)
.to_lowercase();
let public_b32 = base32::encode(
base32::Alphabet::Rfc4648 { padding: false },
public.as_bytes(),
)
.to_lowercase();
TorKeys {
server_string: format!("descriptor:x25519:{}", public_b32),
client_string: format!("{}:descriptor:x25519:{}", public_b32, secret_b32),
public_b32,
}
}
pub fn print_new_keypair() -> Result<()> {
let keys = generate_keys();
println!("{}", t!("keygen.beginning"));
println!("{}", t!("keygen.public_text"));
println!(
"{}",
t!(
"keygen.public_format_text",
server_string = keys.server_string
)
);
println!("{}", t!("keygen.private_text"));
println!(
"{}",
t!("keygen.secret_string", secret_str = keys.client_string)
);
println!(
"{}",
t!(
"keygen.secret_key",
secret_b32 = keys.client_string.split(':').next_back().unwrap()
)
);
Ok(())
}