shadowsocks_rust/service/
genkey.rs

1//! Generate sufficient key for method
2
3use std::process::ExitCode;
4
5use base64::Engine as _;
6use clap::{Arg, ArgAction, ArgMatches, Command, builder::PossibleValuesParser};
7
8use shadowsocks_service::shadowsocks::crypto::{CipherKind, available_ciphers};
9
10/// Defines command line options
11pub fn define_command_line_options(mut app: Command) -> Command {
12    app = app.arg(
13        Arg::new("ENCRYPT_METHOD")
14            .short('m')
15            .long("encrypt-method")
16            .num_args(1)
17            .action(ArgAction::Set)
18            .required(true)
19            .value_parser(PossibleValuesParser::new(available_ciphers()))
20            .help("Server's encryption method"),
21    );
22
23    app
24}
25
26/// Program entrance `main`
27pub fn main(matches: &ArgMatches) -> ExitCode {
28    let method = matches
29        .get_one::<String>("ENCRYPT_METHOD")
30        .map(|x| x.parse::<CipherKind>().expect("method"))
31        .expect("`method` is required");
32
33    let key_len = method.key_len();
34    if key_len > 0 {
35        let mut key = vec![0u8; key_len];
36        rand::fill(key.as_mut_slice());
37
38        let encoded_key = base64::engine::general_purpose::STANDARD.encode(&key);
39        println!("{encoded_key}");
40    }
41
42    ExitCode::SUCCESS
43}