pub struct Aes { /* private fields */ }Expand description
AES cipher implementation using RustCrypto (production-grade)
This implementation uses the audited aes and cbc crates from the
RustCrypto project for secure AES-128 and AES-256 encryption.
Implementations§
Source§impl Aes
impl Aes
Sourcepub fn encrypt_cbc(&self, data: &[u8], iv: &[u8]) -> Result<Vec<u8>, AesError>
pub fn encrypt_cbc(&self, data: &[u8], iv: &[u8]) -> Result<Vec<u8>, AesError>
Encrypt data using AES-CBC mode with PKCS#7 padding
Uses RustCrypto’s cbc crate for production-grade encryption.
Sourcepub fn decrypt_cbc(&self, data: &[u8], iv: &[u8]) -> Result<Vec<u8>, AesError>
pub fn decrypt_cbc(&self, data: &[u8], iv: &[u8]) -> Result<Vec<u8>, AesError>
Decrypt data using AES-CBC mode with PKCS#7 padding removal
Uses RustCrypto’s cbc crate for production-grade decryption.
Sourcepub fn encrypt_ecb(&self, data: &[u8]) -> Result<Vec<u8>, AesError>
pub fn encrypt_ecb(&self, data: &[u8]) -> Result<Vec<u8>, AesError>
Encrypt data using AES-ECB mode (for Perms entry in R6)
Note: ECB mode is generally insecure but required by PDF spec for Perms entry.
Sourcepub fn decrypt_ecb(&self, data: &[u8]) -> Result<Vec<u8>, AesError>
pub fn decrypt_ecb(&self, data: &[u8]) -> Result<Vec<u8>, AesError>
Decrypt data using AES-ECB mode (for Perms entry verification in R6)
Sourcepub fn encrypt_cbc_raw(
&self,
data: &[u8],
iv: &[u8],
) -> Result<Vec<u8>, AesError>
pub fn encrypt_cbc_raw( &self, data: &[u8], iv: &[u8], ) -> Result<Vec<u8>, AesError>
Encrypt data using AES-CBC mode WITHOUT padding
Used for R5/R6 UE entry encryption where data is already block-aligned (32 bytes). Unlike encrypt_cbc, this does not add PKCS#7 padding.
§Requirements
- Data length must be a multiple of 16 bytes
- IV must be exactly 16 bytes
§Security Note
The XOR operations in CBC chaining use simple loops. While Rust/LLVM typically produces constant-time code for fixed-size array XOR operations, this is not formally guaranteed. PDF encryption is designed for offline brute-force attacks where timing side-channels are not in the threat model.
Sourcepub fn decrypt_cbc_raw(
&self,
data: &[u8],
iv: &[u8],
) -> Result<Vec<u8>, AesError>
pub fn decrypt_cbc_raw( &self, data: &[u8], iv: &[u8], ) -> Result<Vec<u8>, AesError>
Decrypt data using AES-CBC mode WITHOUT padding
Used for R5/R6 UE entry decryption where data is already block-aligned (32 bytes). Unlike decrypt_cbc, this does not expect or remove PKCS#7 padding.
§Requirements
- Data length must be a multiple of 16 bytes
- IV must be exactly 16 bytes
§Security Note
The XOR operations in CBC chaining use simple loops. While Rust/LLVM typically produces constant-time code for fixed-size array XOR operations, this is not formally guaranteed. PDF encryption is designed for offline brute-force attacks where timing side-channels are not in the threat model.