use std::io;
use base64::Engine;
use openssl::rsa::Rsa;
pub const DEFAULT_BITS: u32 = 4092;
pub fn new_key(bits: Option<u32>) -> io::Result<(String, String)> {
let generated_key =
Rsa::generate(if let Some(b) = bits { b } else { DEFAULT_BITS }).map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("failed to rsa generate {}", e),
)
})?;
let pk = generated_key.private_key_to_pem().map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("failed to derive rsa private key to pem {}", e),
)
})?;
let pk_pem_encoded = String::from_utf8(pk).map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("failed to convert rsa private key to string {}", e),
)
})?;
let pubkey = generated_key.public_key_to_der().map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("failed to derive rsa public key to der {}", e),
)
})?;
let pubkey_der_encoded = base64::engine::general_purpose::STANDARD.encode(pubkey);
Ok((pk_pem_encoded, pubkey_der_encoded))
}
#[test]
fn test_key() {
let (pk_encoded, pubkey_encoded) = new_key(Some(3072)).unwrap();
println!("{pk_encoded}");
println!("{pubkey_encoded}");
}