From 1cef3a13b4f96fbd02ed7914ff145f112d33355d Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Mon, 2 Sep 2019 15:40:46 +0200 Subject: tool: Implement compression and padding. --- tool/src/commands/mod.rs | 25 +++++++++++++++++++++++-- tool/src/sq-usage.rs | 2 ++ tool/src/sq.rs | 3 ++- tool/src/sq_cli.rs | 10 +++++++++- 4 files changed, 36 insertions(+), 4 deletions(-) (limited to 'tool') diff --git a/tool/src/commands/mod.rs b/tool/src/commands/mod.rs index 229a6854..0db911ce 100644 --- a/tool/src/commands/mod.rs +++ b/tool/src/commands/mod.rs @@ -8,7 +8,10 @@ use rpassword; extern crate sequoia_openpgp as openpgp; use sequoia_core::Context; -use crate::openpgp::constants::DataFormat; +use crate::openpgp::constants::{ + CompressionAlgorithm, + DataFormat, +}; use crate::openpgp::crypto; use crate::openpgp::{TPK, KeyID, Result}; use crate::openpgp::packet::prelude::*; @@ -22,6 +25,11 @@ use crate::openpgp::parse::stream::{ }; use crate::openpgp::serialize::stream::{ Message, Signer, LiteralWriter, Encryptor, EncryptionMode, + Compressor, +}; +use crate::openpgp::serialize::padding::{ + Padder, + padme, }; extern crate sequoia_store as store; @@ -80,7 +88,8 @@ fn get_signing_keys(tpks: &[openpgp::TPK]) pub fn encrypt(store: &mut store::Store, input: &mut io::Read, output: &mut io::Write, npasswords: usize, recipients: Vec<&str>, - mut tpks: Vec, signers: Vec) + mut tpks: Vec, signers: Vec, + compression: &str) -> Result<()> { for r in recipients { tpks.push(store.lookup(r).context("No such key found")?.tpk()?); @@ -114,6 +123,18 @@ pub fn encrypt(store: &mut store::Store, None, None) .context("Failed to create encryptor")?; + match compression { + "none" => (), + "pad" => sink = Padder::new(sink, padme)?, + "zip" => + sink = Compressor::new(sink, CompressionAlgorithm::Zip, None)?, + "zlib" => + sink = Compressor::new(sink, CompressionAlgorithm::Zlib, None)?, + "bzip2" => + sink = Compressor::new(sink, CompressionAlgorithm::BZip2, None)?, + _ => unreachable!("all possible choices are handled") + } + // Optionally sign message. if ! signers.is_empty() { sink = Signer::with_intended_recipients( diff --git a/tool/src/sq-usage.rs b/tool/src/sq-usage.rs index 0b25be37..c5580112 100644 --- a/tool/src/sq-usage.rs +++ b/tool/src/sq-usage.rs @@ -76,6 +76,8 @@ //! -V, --version Prints version information //! //! OPTIONS: +//! --compression Selects compression scheme to use [default: pad] [possible values: none, +//! pad, zip, zlib, bzip2] //! -o, --output Sets the output file to use //! -r, --recipient