11use crate :: error:: { PasteError , PbResult } ;
2- use crate :: privatebin:: Cipher ;
2+ use crate :: privatebin:: { Cipher , CompressionType } ;
33use aes_gcm:: aead:: { Aead , NewAead } ;
44use aes_gcm:: { Key , Nonce } ;
55
@@ -28,6 +28,7 @@ pub fn decrypt_with_password<DecryptedT: serde::de::DeserializeOwned>(
2828 let cipher_algo = & decryptable. get_cipher ( ) . cipher_algo ;
2929 let cipher_mode = & decryptable. get_cipher ( ) . cipher_mode ;
3030 let kdf_keysize = decryptable. get_cipher ( ) . kdf_keysize ;
31+ let compression_type = & decryptable. get_cipher ( ) . compression_type ;
3132
3233 let salt = & decryptable. get_cipher ( ) . vec_kdf_salt ( ) ?;
3334 let iterations = std:: num:: NonZeroU32 :: new ( decryptable. get_cipher ( ) . kdf_iterations ) . unwrap ( ) ;
@@ -39,7 +40,7 @@ pub fn decrypt_with_password<DecryptedT: serde::de::DeserializeOwned>(
3940
4041 match ( & cipher_algo[ ..] , & cipher_mode[ ..] , kdf_keysize) {
4142 ( "aes" , "gcm" , 256 ) => {
42- let data = decrypt_aes_256_gcm ( decryptable, & derived_key) ?;
43+ let data = decrypt_aes_256_gcm ( decryptable, & derived_key, compression_type ) ?;
4344 let value: serde_json:: Value = serde_json:: from_slice ( & data) ?;
4445 Ok ( serde_json:: from_value ( value) ?)
4546 }
@@ -83,7 +84,11 @@ pub fn encrypt(
8384 Ok ( encrypted_data)
8485}
8586
86- fn decrypt_aes_256_gcm ( decryptable : & impl Decryptable , derived_key : & [ u8 ] ) -> PbResult < Vec < u8 > > {
87+ fn decrypt_aes_256_gcm (
88+ decryptable : & impl Decryptable ,
89+ derived_key : & [ u8 ] ,
90+ compression_type : & CompressionType ,
91+ ) -> PbResult < Vec < u8 > > {
8792 type Cipher = aes_gcm:: AesGcm < aes_gcm:: aes:: Aes256 , typenum:: U16 > ;
8893 let ciphertext = base64:: decode ( decryptable. get_ct ( ) ) ?;
8994 let nonce = decryptable. get_cipher ( ) . vec_cipher_iv ( ) ?;
@@ -95,6 +100,9 @@ fn decrypt_aes_256_gcm(decryptable: &impl Decryptable, derived_key: &[u8]) -> Pb
95100 aad : adata_str. as_bytes ( ) ,
96101 } ;
97102 let data = cipher. decrypt ( Nonce :: from_slice ( & nonce) , payload) ?;
98- let decompressed = miniz_oxide:: inflate:: decompress_to_vec ( & data) ?;
103+ let decompressed = match compression_type {
104+ CompressionType :: None => data,
105+ CompressionType :: Zlib => miniz_oxide:: inflate:: decompress_to_vec ( & data) ?,
106+ } ;
99107 Ok ( decompressed)
100108}
0 commit comments