use rsa::{
pkcs1::{DecodeRsaPrivateKey, EncodeRsaPrivateKey},
pkcs8::{DecodePublicKey, EncodePublicKey, LineEnding},
RsaPrivateKey, RsaPublicKey,
};
use std::fs;
fn save_public_key(
public_key: &RsaPublicKey,
path: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let pem = public_key.to_public_key_pem(LineEnding::LF)?;
fs::write(path, pem)?;
Ok(())
}
fn load_public_key(path: &str) -> Result<RsaPublicKey, Box<dyn std::error::Error>> {
let pem = fs::read_to_string(path)?;
let public_key = RsaPublicKey::from_public_key_pem(&pem)?;
Ok(public_key)
}
fn save_private_key(
private_key: &RsaPrivateKey,
path: &str,
) -> Result<(), Box<dyn std::error::Error>> {
private_key.write_pkcs1_pem_file(path, LineEnding::LF)?;
Ok(())
}
fn load_private_key(path: &str) -> Result<RsaPrivateKey, Box<dyn std::error::Error>> {
let pem = fs::read_to_string(path)?;
let private_key = RsaPrivateKey::from_pkcs1_pem(&pem)?;
Ok(private_key)
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let data = b"This is a secret message from the client to the server.";
const SERVER_PUBLIC_KEY: &str = std::env!("SERVER_PUBLIC_KEY");
const SERVER_PRIVATE_KEY: &str = std::env!("SERVER_PRIVATE_KEY");
let encrypted_data = gaia_crypt::encrypt(SERVER_PUBLIC_KEY, data)?;
println!("Encrypted data size: {} bytes", encrypted_data.len());
let decrypted_data = gaia_crypt::decrypt(SERVER_PRIVATE_KEY, &encrypted_data)?;
assert_eq!(data, &decrypted_data[..]);
println!(
"Successfully decrypted: {}",
String::from_utf8_lossy(&decrypted_data)
);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encrypt_decrypt() -> Result<(), Box<dyn std::error::Error>> {
let (server_private_key, server_public_key) = gaia_crypt::generate_rsa_keypair()?;
save_public_key(&server_public_key, "server_public_key.pem")?;
save_private_key(&server_private_key, "server_private_key.pem")?;
let data = b"This is a secret message from the client to the server.";
let encrypted_data = gaia_crypt::raw_encrypt(&server_public_key, data)?;
println!("Encrypted data size: {} bytes", encrypted_data.len());
let decrypted_data = gaia_crypt::raw_decrypt(&server_private_key, &encrypted_data)?;
assert_eq!(data, &decrypted_data[..]);
println!(
"Successfully decrypted: {}",
String::from_utf8_lossy(&decrypted_data)
);
Ok(())
}
}