utils.rs 2.4 KB

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