From 2b3372610758f184dff75122e314a0be2aaabc5d Mon Sep 17 00:00:00 2001 From: rcmerci Date: Fri, 2 Aug 2024 16:52:04 +0800 Subject: [PATCH] add decrypt-cli --- Cargo.lock | 212 +++++++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + decrypt-cli/Cargo.toml | 11 +++ decrypt-cli/src/main.rs | 111 +++++++++++++++++++++ 4 files changed, 334 insertions(+), 1 deletion(-) create mode 100644 decrypt-cli/Cargo.toml create mode 100644 decrypt-cli/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index c28ffa4..c63c9c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -102,6 +102,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" version = "1.0.80" @@ -166,6 +215,17 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bigdecimal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -273,6 +333,52 @@ dependencies = [ "zeroize", ] +[[package]] +name = "clap" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim 0.11.1", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + [[package]] name = "combine" version = "4.6.6" @@ -404,6 +510,15 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "decrypt-cli" +version = "0.1.0" +dependencies = [ + "clap", + "edn-format", + "lsq-encryption", +] + [[package]] name = "digest" version = "0.9.0" @@ -441,6 +556,22 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "edn-format" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22313f5794126f6d36a04f468ab167514161d9e1915152392e2e6a6ca2adece4" +dependencies = [ + "bigdecimal", + "chrono", + "internship", + "itertools", + "num-bigint", + "ordered-float", + "thiserror", + "uuid", +] + [[package]] name = "either" version = "1.10.0" @@ -692,6 +823,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -845,7 +982,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "strsim", + "strsim 0.10.0", "syn 2.0.52", "unic-langid", ] @@ -915,6 +1052,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "internship" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75b80c06d9124692b2927086ed75c8721d4061f9c159d9675d3f6d63729b597" +dependencies = [ + "serde", +] + [[package]] name = "intl-memoizer" version = "0.5.1" @@ -946,6 +1092,21 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" @@ -1152,6 +1313,25 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -1192,6 +1372,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1836,6 +2025,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.5.0" @@ -2181,6 +2376,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.12", +] + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 0c023c4..1649ace 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "rsapi-impl", "rsapi-jni", "packages/rsapi", + "decrypt-cli", ] resolver = "2" diff --git a/decrypt-cli/Cargo.toml b/decrypt-cli/Cargo.toml new file mode 100644 index 0000000..8850c6c --- /dev/null +++ b/decrypt-cli/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "decrypt-cli" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { version = "4.5.13", features = ["derive"] } +edn-format = "3.3.0" +lsq-encryption = { path = "../lsq-encryption" } diff --git a/decrypt-cli/src/main.rs b/decrypt-cli/src/main.rs new file mode 100644 index 0000000..afcd52a --- /dev/null +++ b/decrypt-cli/src/main.rs @@ -0,0 +1,111 @@ +use clap::{value_parser, Arg, Command}; +use std::fs; +use std::io; +use std::path; +use std::result::Result; +#[derive(Debug)] +struct Keys { + encrypted_secret_key: String, + _public_key: String, +} + +fn read_keys>(path: P) -> Keys { + let file_content = + fs::read_to_string(&path).expect(&format!("Unable to read file: {:?}", path.as_ref())); + let edn = edn_format::parse_str(&file_content).expect("Failed to read keys-file as edn"); + match edn { + edn_format::Value::Map(map) => { + let edn_format::Value::String(encrypted_secret_key) = map + .get(&edn_format::Value::String( + "encrypted-private-key".to_string(), + )) + .expect("Failed to get encrypted-private-key") + else { + panic!("encrypted_secret_key") + }; + let edn_format::Value::String(public_key) = map + .get(&edn_format::Value::String("public-key".to_string())) + .expect("Failed to get public-key") + else { + panic!("public_key") + }; + Keys { + encrypted_secret_key: encrypted_secret_key.to_owned(), + public_key: public_key.to_owned(), + } + } + _ => { + panic!("Failed to parse edn") + } + } +} + +fn decrypt_file>(path: P, secret_key: &str, dst: P) { + let file_content = fs::read(&path).unwrap(); + let decrypted_content = lsq_encryption::decrypt_with_x25519(secret_key, &file_content) + .expect(&format!("Failed to decrypt: {:?}", path.as_ref())); + let mut dst_path = path::PathBuf::from(dst.as_ref()); + // TODO: decrypt path + let filename = path.as_ref().file_name().unwrap(); + dst_path.push(filename); + fs::write(&dst_path, decrypted_content).expect(&format!("Failed to write: {:?}", dst_path)); + println!("Generated {:?}", dst_path); +} + +fn main() -> Result<(), io::Error> { + let matches = Command::new("decrypt cli") + .arg( + Arg::new("password") + .help("graph password") + .long("pwd") + .required(true), + ) + .arg( + Arg::new("dir") + .help("graph data dir path") + .long("dir") + .value_name("PATH") + .required(true) + .value_parser(value_parser!(path::PathBuf)), + ) + .arg( + Arg::new("dst") + .help("dir to store decrypted data") + .long("dst") + .value_name("PATH") + .default_value("./decrypted") + .value_parser(value_parser!(path::PathBuf)), + ) + .get_matches(); + let passwd = matches.get_one::("password").unwrap(); + let dir = matches.get_one::("dir").unwrap(); + let dst = matches.get_one::("dst").unwrap(); + let mut pathbuf = path::PathBuf::from(dir); + pathbuf.push("keys.edn"); + let keys_edn_path = pathbuf.to_str().unwrap(); + let keys = read_keys(keys_edn_path); + println!("keys.edn: {:?}", &keys); + let secret_key_ = lsq_encryption::decrypt_with_user_passphrase( + &passwd, + &keys.encrypted_secret_key.as_bytes(), + ) + .expect("Failed to decrypt secret_key, wrong password"); + let secret_key = std::str::from_utf8(&secret_key_).unwrap(); + println!("secret key: {}", secret_key); + println!("dst dir: {:?}", dst); + fs::create_dir_all(dst).expect(&format!("Failed to create dir: {:?}", dst)); + let entries = fs::read_dir(dir).expect(&format!("Failed to read dir: {:?}", dir)); + for entry in entries { + match entry { + Ok(entry) => { + let path = entry.path(); + if path.is_file() && path.file_name().unwrap() != "keys.edn" { + decrypt_file(path, secret_key, dst.clone()); + } + } + _ => {} + } + } + + Ok(()) +}