From dd7dc11a9a47bd6b005eef6b04d9ea8993ad7a39 Mon Sep 17 00:00:00 2001 From: David-Tillmann Schaefer Date: Fri, 14 Nov 2025 07:22:46 +0100 Subject: [PATCH 1/2] fix: apply cargo fmt --- crates/cli-interface/src/lib.rs | 5 ++++- crates/cracker/src/lib.rs | 17 ++++++----------- crates/engine/src/lib.rs | 2 +- crates/producer/src/default_query.rs | 10 +++++----- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/crates/cli-interface/src/lib.rs b/crates/cli-interface/src/lib.rs index ad679ed..ed975c0 100644 --- a/crates/cli-interface/src/lib.rs +++ b/crates/cli-interface/src/lib.rs @@ -93,7 +93,10 @@ pub fn entrypoint(args: Arguments) -> Result { match res { Some(password) => match std::str::from_utf8(&password) { Ok(password) => { - info!("Success! Found password, displaying as UTF-8: '{}'", password) + info!( + "Success! Found password, displaying as UTF-8: '{}'", + password + ) } Err(_) => { let hex_string: String = password diff --git a/crates/cracker/src/lib.rs b/crates/cracker/src/lib.rs index 9a79fb4..22893a9 100644 --- a/crates/cracker/src/lib.rs +++ b/crates/cracker/src/lib.rs @@ -1,11 +1,11 @@ -use std::{fs, io, cell::RefCell, sync::Arc}; use std::collections::hash_map::HashMap; +use std::{cell::RefCell, fs, io, sync::Arc}; use anyhow::anyhow; -use pdf::PdfError; use pdf::any::AnySync; use pdf::file::{Cache, NoLog, Storage}; use pdf::object::{ParseOptions, PlainRef}; +use pdf::PdfError; #[derive(Clone)] pub struct PDFCracker(Vec); @@ -20,9 +20,7 @@ impl PDFCracker { type ObjectCache = SimpleCache>>; type StreamCache = SimpleCache, Arc>>; -pub struct PDFCrackerState( - Storage, ObjectCache, StreamCache, NoLog> -); +pub struct PDFCrackerState(Storage, ObjectCache, StreamCache, NoLog>); impl PDFCrackerState { /// Init `pdf::file::Storage` so we can reuse it on each `attempt`. @@ -32,7 +30,7 @@ impl PDFCrackerState { ParseOptions::strict(), SimpleCache::new(), SimpleCache::new(), - NoLog + NoLog, ); match res { @@ -43,15 +41,12 @@ impl PDFCrackerState { /// Attempt to crack the cryptography using the password, return true on success. pub fn attempt(&mut self, password: &[u8]) -> bool { - self.0.load_storage_and_trailer_password(password) - .is_ok() + self.0.load_storage_and_trailer_password(password).is_ok() } } /// Single-threaded adapter to use `HashMap` as a `pdf::file::Cache`. -struct SimpleCache( - RefCell> -); +struct SimpleCache(RefCell>); impl SimpleCache { fn new() -> Self { diff --git a/crates/engine/src/lib.rs b/crates/engine/src/lib.rs index 522bca3..11140d3 100644 --- a/crates/engine/src/lib.rs +++ b/crates/engine/src/lib.rs @@ -47,7 +47,7 @@ pub fn crack_file( let c2 = cracker_handle.clone(); let id: std::thread::JoinHandle<()> = std::thread::spawn(move || { let Ok(mut cracker) = PDFCrackerState::from_cracker(&c2) else { - return + return; }; while let Ok(passwd) = r2.recv() { diff --git a/crates/producer/src/default_query.rs b/crates/producer/src/default_query.rs index 3bd8b8c..fb158b2 100644 --- a/crates/producer/src/default_query.rs +++ b/crates/producer/src/default_query.rs @@ -13,14 +13,14 @@ impl DefaultQuery { let mut char_set: Vec = (b'0'..=b'9') .chain(b'A'..=b'Z') .chain(b'a'..=b'z') - .chain(b'!'..=b'/') // Adding special characters from ASCII range ! (33) to / (47) - .chain(b':'..=b'@') // Adding special characters from ASCII range : (58) to @ (64) - .chain(b'['..=b'`') // Adding special characters from ASCII range [ (91) to ` (96) - .chain(b'{'..=b'~') // Adding special characters from ASCII range { (123) to ~ (126) + .chain(b'!'..=b'/') // Adding special characters from ASCII range ! (33) to / (47) + .chain(b':'..=b'@') // Adding special characters from ASCII range : (58) to @ (64) + .chain(b'['..=b'`') // Adding special characters from ASCII range [ (91) to ` (96) + .chain(b'{'..=b'~') // Adding special characters from ASCII range { (123) to ~ (126) .collect(); char_set.sort(); - + Self { max_length, min_length, From 273702e9e49f8ae2022acfd5bc04e7d89fa17c26 Mon Sep 17 00:00:00 2001 From: David-Tillmann Schaefer Date: Thu, 13 Nov 2025 17:21:12 +0100 Subject: [PATCH 2/2] feat: add tests for DefaultQuery for 'aaaa' and '1111' --- examples/encrypted_1111_2222.pdf | Bin 0 -> 1095 bytes examples/encrypted_aaaa_bbbb.pdf | Bin 0 -> 1097 bytes tests/default-query.rs | 40 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 examples/encrypted_1111_2222.pdf create mode 100644 examples/encrypted_aaaa_bbbb.pdf diff --git a/examples/encrypted_1111_2222.pdf b/examples/encrypted_1111_2222.pdf new file mode 100644 index 0000000000000000000000000000000000000000..021472bff49b416fe051407bda468ac43694363e GIT binary patch literal 1095 zcmZWoO=uHA6!r%Z2Jr_Eil7~kl(tZ3caz=Og&0ViM5We*q<>O-nCwo{m2@|3CN))x zhn@sa)?>kgq6aU9ia(W_gBLwWOI7Hp2a8hi;6?nyQfHDT4e7AE?7scp``&xsd%i>@ z)+wLC!1rlw@jZ~C1l{yi0D?h)`X=%eqHe-S&dmapAX!>~3P&VCCXM z0vz@W%t$Rj#Sfrvx9Bh^H@XHIU1Ki)UEv+2xpAo0cp9ig+&Wb^$5V%KI&B9XKuKC~ zi=N3779>fLy~oj8>7%5}2%}H}sFzwc>2gbOSmHoURvLLYNsREtn6;NiI1fZy6x|Z!^AsV!uuv4&WhDHieL7n0vb+T*}8k#^9m`BMN zI6ieK@eBW1XkGbw?#}A;rNqqH@P2Lad5gZb{P5Psa{T9)?BO48HiNIreFHrmgB{bS z+t8VAVD2S^#e6k z^{X%g>o%FsgE-LHwrO0zCYy};v^Lw6oxX~}cdiM?Te!of`i*TH^N5|JUUg0RKzS2+ z28CXH&@V*ba4@Z46I-%o5*om&jwNjA0Y%ARli-Xd<519VP+1E|hN@}0g5`{c16GC- no$%W literal 0 HcmV?d00001 diff --git a/examples/encrypted_aaaa_bbbb.pdf b/examples/encrypted_aaaa_bbbb.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c2278d70c5efd6ebaa52d6fbf0e2df82528c4eb GIT binary patch literal 1097 zcmZWo-Afcv6gT>^+glQaLR^R?Bkj)j2W$(v?vj*fyK03>-krI#JF(6zvv*AkqUbLu z2n;kdf+Bk9%|H@~i0Z)yA&Bb5K#IPID9R$bch_B)^|B1Jzd7gpe&_to4fS-yTgAgV z2ra)`Tmm8#pr1MmKsXFg?|6BlnlpuM(5Liqw zCrNPi0gGOfj}kt`lt2NXE@Hd5-5-Mk0t?hc3F@XaRIQRLsjwysDOwy0AC6dVk!uI2 z9p_203v`rqK&WeBfMTBI+pd>}=%nkld3m=CR8#N{Dip_wm!=tLYCIxO1A<4u?k$&> zk9@iH^N>M*eJIFb@*0yj(7mAbt`H-qYI+8Sh8Q@owFZGKvpP8N8*q@Ss8%hZkCdO|HYn- z0~??|*!-RM}j|Xn@@;2}&20tyD0cqmVns zR=u+W4uow-6l6t^ZNYL(fmlS9uwk2qq=>RC*|;Hksm5;(!)Mr5iE`g<{=t@E