diff --git a/CHANGELOG.md b/CHANGELOG.md index a5ef8c9..0525855 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## v1.1.0 + +- Compress plugin via zlib. + ## v1.0.0 - Implementing a Plug-in System with Extism. diff --git a/Cargo.lock b/Cargo.lock index 9098c55..3de3dff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3177,7 +3177,7 @@ dependencies = [ [[package]] name = "pumpbin" -version = "1.0.0" +version = "1.1.0" dependencies = [ "anyhow", "bincode", @@ -3185,6 +3185,7 @@ dependencies = [ "capnpc", "dirs 5.0.1", "extism", + "flate2", "iced", "memchr", "open", diff --git a/Cargo.toml b/Cargo.toml index 08e153f..c23ed51 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pumpbin" -version = "1.0.0" +version = "1.1.0" authors = ["b1n "] edition = "2021" description = "PumpBin is an Implant Generation Platform." @@ -28,6 +28,7 @@ capnp = "0.19" extism = "1.4.1" serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.120" +flate2 = "1.0.30" [dependencies.iced] version = "0.13.0-dev" diff --git a/src/plugin.rs b/src/plugin.rs index e4f9a99..b44e521 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -9,9 +9,11 @@ use std::{ use anyhow::{anyhow, bail}; use bincode::{decode_from_slice, encode_to_vec, Decode, Encode}; use capnp::{ + io::Write, message::{self, ReaderOptions}, serialize_packed, }; +use flate2::Compression; use crate::{ plugin_capnp, @@ -276,7 +278,12 @@ pub struct Plugin { impl Plugin { pub fn decode_from_slice(data: &[u8]) -> anyhow::Result { - let message = serialize_packed::read_message(data, ReaderOptions::new())?; + let mut decoder = flate2::write::ZlibDecoder::new(Vec::new()); + decoder.write_all(data)?; + let decompressed = decoder.finish()?; + + let message = + serialize_packed::read_message(decompressed.as_slice(), ReaderOptions::new())?; let plugin = message.get_root::()?; let info = plugin.get_info()?; @@ -412,7 +419,11 @@ impl Plugin { let mut buf = Vec::new(); serialize_packed::write_message(&mut buf, &message)?; - anyhow::Ok(buf) + let mut encoder = flate2::write::ZlibEncoder::new(Vec::new(), Compression::best()); + encoder.write_all(buf.as_slice())?; + let compressed = encoder.finish()?; + + anyhow::Ok(compressed) } pub fn replace_binary(