Paolo Asperti лет назад: 3
Родитель
Сommit
06409279f4
3 измененных файлов с 112 добавлено и 1 удалено
  1. 2 1
      .github/workflows/build.yaml
  2. 4 0
      Cargo.toml
  3. 106 0
      src/utils.rs

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

@@ -66,6 +66,7 @@ jobs:
66 66
           path: |
67 67
             target/${{ matrix.job.target }}/release/hbbr
68 68
             target/${{ matrix.job.target }}/release/hbbs
69
+            target/${{ matrix.job.target }}/release/rustdesk-utils
69 70
           if-no-files-found: error
70 71
 
71 72
   # github (draft) release with all binaries
@@ -102,7 +103,7 @@ jobs:
102 103
           path: i386
103 104
 
104 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 108
       - name: Create Release
108 109
         uses: softprops/action-gh-release@v1

+ 4 - 0
Cargo.toml

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

+ 106 - 0
src/utils.rs

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