#[macro_use]
extern crate cfg_if;
use osshkeys::error::OsshResult;
use osshkeys::{cipher::Cipher, KeyPair, KeyType};
use std::fs;
use std::io::Write;
#[cfg(unix)]
use std::os::unix::fs::*;
use std::path::Path;
fn main() -> OsshResult<()> {
let filename = "id_ed25519";
let keypair = KeyPair::generate(KeyType::ED25519, 256)?;
let mut fop = fs::OpenOptions::new();
fop.write(true).create(true).truncate(true);
cfg_if! {
if #[cfg(unix)] {
fop.mode(0o600);
}
}
let mut f = fop.open(filename)?;
f.write_all(
keypair
.serialize_openssh(Some("passw0rd"), Cipher::Aes256_Ctr)?
.as_bytes(),
)?;
f.sync_all()?;
let pubkey = keypair.serialize_publickey()?;
let mut pubf = fs::OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(Path::new(filename).with_extension("pub"))?;
writeln!(pubf, "{}", &pubkey)?;
pubf.sync_all()?;
println!("{}", &pubkey);
Ok(())
}