diff --git a/libraries/droplet/Cargo.lock b/libraries/droplet/Cargo.lock index a5da8f87..beef5a7c 100644 --- a/libraries/droplet/Cargo.lock +++ b/libraries/droplet/Cargo.lock @@ -219,12 +219,13 @@ dependencies = [ [[package]] name = "droplet-rs" -version = "0.11.2" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", "dyn-clone", "futures", + "getrandom 0.3.4", "hex", "humansize", "rcgen", diff --git a/libraries/droplet/Cargo.toml b/libraries/droplet/Cargo.toml index 76f06cc4..c4cb1908 100644 --- a/libraries/droplet/Cargo.toml +++ b/libraries/droplet/Cargo.toml @@ -2,7 +2,7 @@ edition = "2021" authors = ["Drop-OSS"] name = "droplet-rs" -version = "0.11.2" +version = "0.12.0" license = "AGPL-3.0-only" description = "Droplet is a `napi.rs` Rust/Node.js package full of high-performance and low-level utils for Drop" @@ -20,6 +20,7 @@ humansize = "2.1.3" uuid = { version = "1.19.0", features = ["v4"] } sha2 = "0.10.9" futures = "0.3.31" +getrandom = "0.3.4" [dependencies.x509-parser] version = "0.17.0" diff --git a/libraries/droplet/src/main.rs b/libraries/droplet/src/main.rs index d1ae9efc..d098a419 100644 --- a/libraries/droplet/src/main.rs +++ b/libraries/droplet/src/main.rs @@ -1,13 +1,14 @@ use std::path::PathBuf; use droplet_rs::manifest::generate_manifest_rusty; +use serde_json::json; use tokio::runtime::Handle; #[tokio::main] pub async fn main() { let metrics = Handle::current().metrics(); println!("using {} workers", metrics.num_workers()); - generate_manifest_rusty( + let manifest = generate_manifest_rusty( &PathBuf::from("/home/decduck/.local/share/Steam/steamapps/common/Savage Resurrection"), |progress| { println!("PROGRESS: {}", progress) @@ -18,4 +19,5 @@ pub async fn main() { ) .await .unwrap(); + tokio::fs::write("./manifst.json", json!(manifest).to_string()).await.expect("failed to write manifest"); } diff --git a/libraries/droplet/src/manifest.rs b/libraries/droplet/src/manifest.rs index 7b0b015a..f67fd8eb 100644 --- a/libraries/droplet/src/manifest.rs +++ b/libraries/droplet/src/manifest.rs @@ -29,7 +29,7 @@ pub struct FileEntry { pub struct ChunkData { files: Vec, checksum: String, - //iv: [u8; 16] + iv: [u8; 16], } #[derive(Serialize)] @@ -37,6 +37,7 @@ pub struct Manifest { version: String, chunks: HashMap, size: u64, + key: [u8; 16], } const CHUNK_SIZE: u64 = 1024 * 1024 * 64; @@ -153,10 +154,12 @@ pub async fn generate_manifest_rusty( let uuid = uuid::Uuid::new_v4().to_string(); let mut hasher = Sha256::new(); + let mut iv = [0u8; 16]; + getrandom::fill(&mut iv).map_err(|err| anyhow!("failed to generate IV: {:?}", err))?; let mut chunk_data = ChunkData { files: Vec::new(), checksum: String::new(), - //iv: + iv, }; let mut chunk_length = 0; @@ -224,9 +227,13 @@ pub async fn generate_manifest_rusty( let manifest = manifest.lock().await; let manifest = manifest.clone(); + let mut key = [0u8; 16]; + getrandom::fill(&mut key).map_err(|err| anyhow!("failed to generate key: {:?}", err))?; + Ok(Manifest { version: "2".to_string(), chunks: manifest, - size: total_manifest_length.fetch_add(0, Ordering::Relaxed) + size: total_manifest_length.fetch_add(0, Ordering::Relaxed), + key, }) }