aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorPaolo Asperti <[email protected]>2022-07-14 15:59:39 +0200
committerPaolo Asperti <[email protected]>2022-07-14 15:59:39 +0200
commit06409279f4ddd343eea1f0222bfc8deb4b46fb7d (patch)
tree046bd3808c409cf0626af1c613951536060ca46b /src
parent39153ce1472417be101051baecb452da467f2652 (diff)
downloadrustdesk-server-06409279f4ddd343eea1f0222bfc8deb4b46fb7d.tar.gz
rustdesk-server-06409279f4ddd343eea1f0222bfc8deb4b46fb7d.zip
rustdesk-utils
Diffstat (limited to 'src')
-rw-r--r--src/utils.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/utils.rs b/src/utils.rs
new file mode 100644
index 0000000..8b32b4d
--- /dev/null
+++ b/src/utils.rs
@@ -0,0 +1,106 @@
+use sodiumoxide::crypto::sign;
+use std::str;
+use std::env;
+use std::process;
+
+fn print_help() {
+ println!("Usage:");
+ println!(" rustdesk-util [command]\n");
+ println!("Available Commands:");
+ println!(" genkeypair Generate a new keypair");
+ println!(" validatekeypair [public key] [secret key] Validate an existing keypair");
+ process::exit(0x0001);
+}
+
+fn error_then_help(msg: &str) {
+ println!("ERROR: {}\n", msg);
+ print_help();
+}
+
+fn gen_keypair() {
+ let (pk, sk) = sign::gen_keypair();
+ let public_key = base64::encode(pk);
+ let secret_key = base64::encode(sk);
+ println!("Public Key: {public_key}");
+ println!("Secret Key: {secret_key}");
+}
+
+fn validate_keypair(pk: &str, sk: &str) {
+ let sk1 = base64::decode(&sk);
+ match sk1 {
+ Ok(_) => {},
+ Err(_) => {
+ println!("Invalid secret key");
+ process::exit(0x0001);
+ },
+ }
+ let sk1 = sk1.unwrap();
+
+ let secret_key = sign::SecretKey::from_slice(sk1.as_slice());
+ match secret_key {
+ Some(_) => {},
+ None => {
+ println!("Invalid Secret key");
+ process::exit(0x0001);
+ },
+ }
+ let secret_key = secret_key.unwrap();
+
+ let pk1 = base64::decode(&pk);
+ match pk1 {
+ Ok(_) => {},
+ Err(_) => {
+ println!("Invalid public key");
+ process::exit(0x0001);
+ },
+ }
+ let pk1 = pk1.unwrap();
+
+ let public_key = sign::PublicKey::from_slice(pk1.as_slice());
+ match public_key {
+ Some(_) => {},
+ None => {
+ println!("Invalid Public key");
+ process::exit(0x0001);
+ },
+ }
+ let public_key = public_key.unwrap();
+
+ let random_data_to_test = b"This is meh.";
+ let signed_data = sign::sign(random_data_to_test, &secret_key);
+ let verified_data = sign::verify(&signed_data, &public_key);
+ match verified_data {
+ Ok(_) => {},
+ Err(_) => {
+ println!("Key pair is INVALID");
+ process::exit(0x0001);
+ },
+ }
+ let verified_data = verified_data.unwrap();
+
+ if random_data_to_test == &verified_data[..] {
+ println!("Key pair is VALID");
+ } else {
+ println!("Key pair is INVALID");
+ process::exit(0x0001);
+ }
+}
+
+fn main() {
+ let args: Vec<_> = env::args().collect();
+ if args.len() <= 1 {
+ print_help();
+ }
+
+ let command = args[1].to_lowercase();
+ match command.as_str() {
+ "genkeypair" => gen_keypair(),
+ "validatekeypair" => {
+ if args.len() <= 3 {
+ error_then_help("You must supply both the public and the secret key");
+ }
+ validate_keypair(args[2].as_str(),args[3].as_str());
+ },
+ _=>print_help(),
+ }
+} \ No newline at end of file