Просмотр исходного кода

Merge pull request #62 from paspo/rustdesk-utils

small util for key management
RustDesk лет назад: 3
Родитель
Сommit
003d9f1324
3 измененных файлов с 99 добавлено и 1 удалено
  1. 2 1
      .github/workflows/build.yaml
  2. 4 0
      Cargo.toml
  3. 93 0
      src/utils.rs

+ 2 - 1
.github/workflows/build.yaml

@@ -66,6 +66,7 @@ jobs:
66
           path: |
66
           path: |
67
             target/${{ matrix.job.target }}/release/hbbr
67
             target/${{ matrix.job.target }}/release/hbbr
68
             target/${{ matrix.job.target }}/release/hbbs
68
             target/${{ matrix.job.target }}/release/hbbs
69
+            target/${{ matrix.job.target }}/release/rustdesk-utils
69
           if-no-files-found: error
70
           if-no-files-found: error
70
 
71
 
71
   # github (draft) release with all binaries
72
   # github (draft) release with all binaries
@@ -102,7 +103,7 @@ jobs:
102
           path: i386
103
           path: i386
103
 
104
 
104
       - name: Rename files
105
       - name: Rename files
105
-        run: for arch in amd64 arm64v8 armv7 i386 ; do for b in hbbr hbbs ; do mv -v ${arch}/${b} ${arch}/${b}-${arch} ; done ; done 
106
+        run: for arch in amd64 arm64v8 armv7 i386 ; do for b in hbbr hbbs rustdesk-utils ; do mv -v ${arch}/${b} ${arch}/${b}-${arch} ; done ; done 
106
 
107
 
107
       - name: Create Release
108
       - name: Create Release
108
         uses: softprops/action-gh-release@v1
109
         uses: softprops/action-gh-release@v1

+ 4 - 0
Cargo.toml

@@ -10,6 +10,10 @@ default-run = "hbbs"
10
 name = "hbbr"
10
 name = "hbbr"
11
 path = "src/hbbr.rs"
11
 path = "src/hbbr.rs"
12
 
12
 
13
+[[bin]]
14
+name = "rustdesk-utils"
15
+path = "src/utils.rs"
16
+
13
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
17
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
14
 
18
 
15
 [dependencies]
19
 [dependencies]

+ 93 - 0
src/utils.rs

@@ -0,0 +1,93 @@
1
+use hbb_common::{bail, ResultType};
2
+use sodiumoxide::crypto::sign;
3
+use std::env;
4
+use std::process;
5
+use std::str;
6
+
7
+fn print_help() {
8
+    println!(
9
+        "Usage:
10
+    rustdesk-util [command]\n
11
+Available Commands:
12
+    genkeypair                                   Generate a new keypair
13
+    validatekeypair [public key] [secret key]    Validate an existing keypair"
14
+    );
15
+    process::exit(0x0001);
16
+}
17
+
18
+fn error_then_help(msg: &str) {
19
+    println!("ERROR: {}\n", msg);
20
+    print_help();
21
+}
22
+
23
+fn gen_keypair() {
24
+    let (pk, sk) = sign::gen_keypair();
25
+    let public_key = base64::encode(pk);
26
+    let secret_key = base64::encode(sk);
27
+    println!("Public Key:  {public_key}");
28
+    println!("Secret Key:  {secret_key}");
29
+}
30
+
31
+fn validate_keypair(pk: &str, sk: &str) -> ResultType<()> {
32
+    let sk1 = base64::decode(&sk);
33
+    if sk1.is_err() {
34
+        bail!("Invalid secret key");
35
+    }
36
+    let sk1 = sk1.unwrap();
37
+
38
+    let secret_key = sign::SecretKey::from_slice(sk1.as_slice());
39
+    if secret_key.is_none() {
40
+        bail!("Invalid Secret key");
41
+    }
42
+    let secret_key = secret_key.unwrap();
43
+
44
+    let pk1 = base64::decode(&pk);
45
+    if pk1.is_err() {
46
+        bail!("Invalid public key");
47
+    }
48
+    let pk1 = pk1.unwrap();
49
+
50
+    let public_key = sign::PublicKey::from_slice(pk1.as_slice());
51
+    if public_key.is_none() {
52
+        bail!("Invalid Public key");
53
+    }
54
+    let public_key = public_key.unwrap();
55
+
56
+    let random_data_to_test = b"This is meh.";
57
+    let signed_data = sign::sign(random_data_to_test, &secret_key);
58
+    let verified_data = sign::verify(&signed_data, &public_key);
59
+    if verified_data.is_err() {
60
+        bail!("Key pair is INVALID");
61
+    }
62
+    let verified_data = verified_data.unwrap();
63
+
64
+    if random_data_to_test != &verified_data[..] {
65
+        bail!("Key pair is INVALID");
66
+    }
67
+
68
+    Ok(())
69
+}
70
+
71
+fn main() {
72
+    let args: Vec<_> = env::args().collect();
73
+    if args.len() <= 1 {
74
+        print_help();
75
+    }
76
+
77
+    let command = args[1].to_lowercase();
78
+    match command.as_str() {
79
+        "genkeypair" => gen_keypair(),
80
+        "validatekeypair" => {
81
+            if args.len() <= 3 {
82
+                error_then_help("You must supply both the public and the secret key");
83
+            }
84
+            let res = validate_keypair(args[2].as_str(), args[3].as_str());
85
+            if let Err(e) = res {
86
+                println!("{}", e);
87
+                process::exit(0x0001);
88
+            }
89
+            println!("Key pair is VALID");
90
+        }
91
+        _ => print_help(),
92
+    }
93
+}