ppaass_v3_proxy_tool/
crypto.rs1use 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;
9pub 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
16pub 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}