ppaass_v3_proxy_tool/
crypto.rs

1use ppaass_common::crypto::{
2    DEFAULT_AGENT_PRIVATE_KEY_PATH, DEFAULT_AGENT_PUBLIC_KEY_PATH, DEFAULT_PROXY_PRIVATE_KEY_PATH,
3    DEFAULT_PROXY_PUBLIC_KEY_PATH, EncodePrivateKey, EncodePublicKey, LineEnding, OsRng,
4    RsaPrivateKey, RsaPublicKey,
5};
6use ppaass_common::error::CommonError;
7use std::fs;
8use std::path::Path;
9/// Generate the key pairs for agent
10pub fn generate_agent_key_pairs(base_dir: &Path, username: &str) -> Result<(), CommonError> {
11    let private_key_path = base_dir.join(username).join(DEFAULT_AGENT_PRIVATE_KEY_PATH);
12    let public_key_path = base_dir.join(username).join(DEFAULT_AGENT_PUBLIC_KEY_PATH);
13    generate_rsa_key_pairs(&private_key_path, &public_key_path)
14}
15
16/// Generate the key pairs for proxy
17pub fn generate_proxy_key_pairs(base_dir: &Path, username: &str) -> Result<(), CommonError> {
18    let private_key_path = base_dir.join(username).join(DEFAULT_PROXY_PRIVATE_KEY_PATH);
19    let public_key_path = base_dir.join(username).join(DEFAULT_PROXY_PUBLIC_KEY_PATH);
20    generate_rsa_key_pairs(&private_key_path, &public_key_path)
21}
22fn generate_rsa_key_pairs(
23    private_key_path: &Path,
24    public_key_path: &Path,
25) -> Result<(), CommonError> {
26    let private_key = RsaPrivateKey::new(&mut OsRng, 2048).expect("Fail to generate private key");
27    let public_key = RsaPublicKey::from(&private_key);
28    let private_key_pem = private_key
29        .to_pkcs8_pem(LineEnding::CRLF)
30        .expect("Fail to generate pem for private key.");
31    let public_key_pem = public_key
32        .to_public_key_pem(LineEnding::CRLF)
33        .expect("Fail to generate pem for public key.");
34    match private_key_path.parent() {
35        None => {
36            println!("Write private key: {:?}", private_key_path.to_str());
37            fs::write(private_key_path, private_key_pem.as_bytes())?;
38        }
39        Some(parent) => {
40            if !parent.exists() {
41                println!("Create parent directory :{:?}", parent.to_str());
42                fs::create_dir_all(parent)?;
43            }
44            println!("Write private key: {:?}", private_key_path.to_str());
45            fs::write(private_key_path, private_key_pem.as_bytes())?;
46        }
47    };
48    match public_key_path.parent() {
49        None => {
50            println!("Write public key: {:?}", public_key_path.to_str());
51            fs::write(public_key_path, public_key_pem.as_bytes())?;
52        }
53        Some(parent) => {
54            if !parent.exists() {
55                println!("Create parent directory :{:?}", parent.to_str());
56                fs::create_dir_all(parent)?;
57            }
58            println!("Write public key: {:?}", public_key_path.to_str());
59            fs::write(public_key_path, public_key_pem.as_bytes())?;
60        }
61    };
62    Ok(())
63}