shadowsocks_rust/service/
genkey.rs1use 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
10pub 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
26pub 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}