1#![allow(clippy::needless_range_loop)]
18
19use crate::encryption::{generate_iv, Aes, AesKey, Permissions, Rc4, Rc4Key};
20use crate::error::Result;
21use crate::objects::ObjectId;
22use rand::Rng;
23use sha2::{Digest, Sha256, Sha384, Sha512};
24use subtle::ConstantTimeEq;
25use zeroize::{Zeroize, ZeroizeOnDrop};
26
27const PADDING: [u8; 32] = [
29 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
30 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A,
31];
32
33#[derive(Debug, Clone, Zeroize, ZeroizeOnDrop)]
38pub struct UserPassword(pub String);
39
40#[derive(Debug, Clone, Zeroize, ZeroizeOnDrop)]
45pub struct OwnerPassword(pub String);
46
47#[derive(Debug, Clone, Zeroize, ZeroizeOnDrop)]
52pub struct EncryptionKey {
53 pub key: Vec<u8>,
55}
56
57impl EncryptionKey {
58 pub fn new(key: Vec<u8>) -> Self {
60 Self { key }
61 }
62
63 pub fn len(&self) -> usize {
65 self.key.len()
66 }
67
68 pub fn is_empty(&self) -> bool {
70 self.key.is_empty()
71 }
72
73 pub fn as_bytes(&self) -> &[u8] {
75 &self.key
76 }
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
81pub enum SecurityHandlerRevision {
82 R2 = 2,
84 R3 = 3,
86 R4 = 4,
88 R5 = 5,
90 R6 = 6,
92}
93
94pub struct StandardSecurityHandler {
96 pub revision: SecurityHandlerRevision,
98 pub key_length: usize,
100}
101
102impl StandardSecurityHandler {
103 pub fn rc4_40bit() -> Self {
105 Self {
106 revision: SecurityHandlerRevision::R2,
107 key_length: 5,
108 }
109 }
110
111 pub fn rc4_128bit() -> Self {
113 Self {
114 revision: SecurityHandlerRevision::R3,
115 key_length: 16,
116 }
117 }
118
119 pub fn aes_128_r4() -> Self {
121 Self {
122 revision: SecurityHandlerRevision::R4,
123 key_length: 16,
124 }
125 }
126
127 pub fn aes_256_r5() -> Self {
129 Self {
130 revision: SecurityHandlerRevision::R5,
131 key_length: 32,
132 }
133 }
134
135 pub fn aes_256_r6() -> Self {
137 Self {
138 revision: SecurityHandlerRevision::R6,
139 key_length: 32,
140 }
141 }
142
143 fn pad_password(password: &str) -> [u8; 32] {
145 let mut padded = [0u8; 32];
146 let password_bytes = password.as_bytes();
147 let len = password_bytes.len().min(32);
148
149 padded[..len].copy_from_slice(&password_bytes[..len]);
151
152 if len < 32 {
154 padded[len..].copy_from_slice(&PADDING[..32 - len]);
155 }
156
157 padded
158 }
159
160 pub fn compute_owner_hash(
162 &self,
163 owner_password: &OwnerPassword,
164 user_password: &UserPassword,
165 ) -> Vec<u8> {
166 let owner_pad = Self::pad_password(&owner_password.0);
168 let user_pad = Self::pad_password(&user_password.0);
169
170 let mut hash = md5::compute(&owner_pad).to_vec();
172
173 if self.revision >= SecurityHandlerRevision::R3 {
175 for _ in 0..50 {
176 hash = md5::compute(&hash).to_vec();
177 }
178 }
179
180 let rc4_key = Rc4Key::from_slice(&hash[..self.key_length]);
182
183 let mut result = rc4_encrypt(&rc4_key, &user_pad);
185
186 if self.revision >= SecurityHandlerRevision::R3 {
188 for i in 1..=19 {
189 let mut key_bytes = hash[..self.key_length].to_vec();
190 for j in 0..self.key_length {
191 key_bytes[j] ^= i as u8;
192 }
193 let iter_key = Rc4Key::from_slice(&key_bytes);
194 result = rc4_encrypt(&iter_key, &result);
195 }
196 }
197
198 result
199 }
200
201 pub fn compute_user_hash(
203 &self,
204 user_password: &UserPassword,
205 owner_hash: &[u8],
206 permissions: Permissions,
207 file_id: Option<&[u8]>,
208 ) -> Result<Vec<u8>> {
209 self.compute_user_hash_with_metadata(user_password, owner_hash, permissions, file_id, true)
210 }
211
212 pub(crate) fn compute_user_hash_with_metadata(
217 &self,
218 user_password: &UserPassword,
219 owner_hash: &[u8],
220 permissions: Permissions,
221 file_id: Option<&[u8]>,
222 encrypt_metadata: bool,
223 ) -> Result<Vec<u8>> {
224 if matches!(
228 self.revision,
229 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6
230 ) {
231 let aes_key =
232 self.compute_aes_encryption_key(user_password, owner_hash, permissions, file_id)?;
233 return Ok(sha256(&aes_key.key));
234 }
235
236 let padded = Self::pad_password(&user_password.0);
237 self.compute_user_hash_from_padded(
238 &padded,
239 owner_hash,
240 permissions,
241 file_id,
242 encrypt_metadata,
243 )
244 }
245
246 pub(crate) fn compute_user_hash_from_padded(
257 &self,
258 padded: &[u8],
259 owner_hash: &[u8],
260 permissions: Permissions,
261 file_id: Option<&[u8]>,
262 encrypt_metadata: bool,
263 ) -> Result<Vec<u8>> {
264 let key = self.compute_key_from_padded(
266 padded,
267 owner_hash,
268 permissions,
269 file_id,
270 encrypt_metadata,
271 )?;
272
273 match self.revision {
274 SecurityHandlerRevision::R2 => {
275 let rc4_key = Rc4Key::from_slice(&key.key);
277 Ok(rc4_encrypt(&rc4_key, &PADDING))
278 }
279 SecurityHandlerRevision::R3 | SecurityHandlerRevision::R4 => {
280 let mut data = Vec::new();
282 data.extend_from_slice(&PADDING);
283
284 if let Some(id) = file_id {
285 data.extend_from_slice(id);
286 }
287
288 let hash = md5::compute(&data);
289
290 let rc4_key = Rc4Key::from_slice(&key.key);
292 let mut result = rc4_encrypt(&rc4_key, hash.as_ref());
293
294 for i in 1..=19 {
296 let mut key_bytes = key.key.clone();
297 for j in 0..key_bytes.len() {
298 key_bytes[j] ^= i as u8;
299 }
300 let iter_key = Rc4Key::from_slice(&key_bytes);
301 result = rc4_encrypt(&iter_key, &result);
302 }
303
304 result.resize(32, 0);
306 Ok(result)
307 }
308 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
309 Err(crate::error::PdfError::EncryptionError(
312 "padded-password user hash is not defined for R5/R6".to_string(),
313 ))
314 }
315 }
316 }
317
318 pub fn compute_encryption_key(
320 &self,
321 user_password: &UserPassword,
322 owner_hash: &[u8],
323 permissions: Permissions,
324 file_id: Option<&[u8]>,
325 ) -> Result<EncryptionKey> {
326 self.compute_encryption_key_with_metadata(
330 user_password,
331 owner_hash,
332 permissions,
333 file_id,
334 true,
335 )
336 }
337
338 pub(crate) fn compute_encryption_key_with_metadata(
345 &self,
346 user_password: &UserPassword,
347 owner_hash: &[u8],
348 permissions: Permissions,
349 file_id: Option<&[u8]>,
350 encrypt_metadata: bool,
351 ) -> Result<EncryptionKey> {
352 match self.revision {
353 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
354 self.compute_aes_encryption_key(user_password, owner_hash, permissions, file_id)
356 }
357 _ => {
358 let padded = Self::pad_password(&user_password.0);
359 self.compute_key_from_padded(
360 &padded,
361 owner_hash,
362 permissions,
363 file_id,
364 encrypt_metadata,
365 )
366 }
367 }
368 }
369
370 pub(crate) fn compute_key_from_padded(
375 &self,
376 padded: &[u8],
377 owner_hash: &[u8],
378 permissions: Permissions,
379 file_id: Option<&[u8]>,
380 encrypt_metadata: bool,
381 ) -> Result<EncryptionKey> {
382 debug_assert!(self.revision <= SecurityHandlerRevision::R4);
383
384 let mut data = Vec::new();
386 data.extend_from_slice(padded);
387 data.extend_from_slice(owner_hash);
388 data.extend_from_slice(&permissions.bits().to_le_bytes());
389
390 if let Some(id) = file_id {
391 data.extend_from_slice(id);
392 }
393
394 if !encrypt_metadata {
399 data.extend_from_slice(&[0xFF, 0xFF, 0xFF, 0xFF]);
400 }
401
402 let mut hash = md5::compute(&data).to_vec();
404
405 if self.revision >= SecurityHandlerRevision::R3 {
407 for _ in 0..50 {
408 hash = md5::compute(&hash[..self.key_length]).to_vec();
409 }
410 }
411
412 hash.truncate(self.key_length);
414
415 Ok(EncryptionKey::new(hash))
416 }
417
418 pub fn encrypt_string(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
420 match self.revision {
421 SecurityHandlerRevision::R4
422 | SecurityHandlerRevision::R5
423 | SecurityHandlerRevision::R6 => {
424 self.encrypt_aes(data, key, obj_id).unwrap_or_default()
426 }
427 _ => {
428 let obj_key = self.compute_object_key(key, obj_id);
430 let rc4_key = Rc4Key::from_slice(&obj_key);
431 rc4_encrypt(&rc4_key, data)
432 }
433 }
434 }
435
436 pub(crate) fn try_decrypt_string(
444 &self,
445 data: &[u8],
446 key: &EncryptionKey,
447 obj_id: &ObjectId,
448 ) -> Result<Vec<u8>> {
449 match self.revision {
450 SecurityHandlerRevision::R4
451 | SecurityHandlerRevision::R5
452 | SecurityHandlerRevision::R6 => self.decrypt_aes(data, key, obj_id),
453 _ => Ok(self.encrypt_string(data, key, obj_id)),
455 }
456 }
457
458 pub(crate) fn try_decrypt_stream(
465 &self,
466 data: &[u8],
467 key: &EncryptionKey,
468 obj_id: &ObjectId,
469 ) -> Result<Vec<u8>> {
470 self.try_decrypt_string(data, key, obj_id)
472 }
473
474 pub fn decrypt_string(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
477 self.try_decrypt_string(data, key, obj_id)
478 .unwrap_or_default()
479 }
480
481 pub fn encrypt_stream(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
483 self.encrypt_string(data, key, obj_id)
484 }
485
486 pub fn decrypt_stream(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
489 self.try_decrypt_stream(data, key, obj_id)
490 .unwrap_or_default()
491 }
492
493 pub fn encrypt_aes(
498 &self,
499 data: &[u8],
500 key: &EncryptionKey,
501 obj_id: &ObjectId,
502 ) -> Result<Vec<u8>> {
503 let aes = match self.revision {
504 SecurityHandlerRevision::R4 => {
505 let obj_key = self.compute_r4_aes_object_key(key, obj_id);
506 Aes::new(AesKey::new_128(obj_key)?)
507 }
508 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
509 let obj_key = self.compute_aes256_object_key(key, obj_id)?;
510 Aes::new(AesKey::new_256(obj_key)?)
511 }
512 _ => {
513 return Err(crate::error::PdfError::EncryptionError(
514 "AES encryption requires Rev 4+ (use RC4 for Rev 2/3)".to_string(),
515 ));
516 }
517 };
518
519 let iv = generate_iv();
520 let mut result = Vec::with_capacity(16 + data.len() + 16);
521 result.extend_from_slice(&iv);
522
523 let encrypted = aes.encrypt_cbc(data, &iv).map_err(|e| {
524 crate::error::PdfError::EncryptionError(format!("AES encryption failed: {e}"))
525 })?;
526
527 result.extend_from_slice(&encrypted);
528 Ok(result)
529 }
530
531 pub fn decrypt_aes(
536 &self,
537 data: &[u8],
538 key: &EncryptionKey,
539 obj_id: &ObjectId,
540 ) -> Result<Vec<u8>> {
541 if data.len() < 16 {
542 return Err(crate::error::PdfError::EncryptionError(
543 "AES encrypted data must be at least 16 bytes (IV)".to_string(),
544 ));
545 }
546
547 let iv = &data[0..16];
548 let encrypted_data = &data[16..];
549
550 let aes = match self.revision {
551 SecurityHandlerRevision::R4 => {
552 let obj_key = self.compute_r4_aes_object_key(key, obj_id);
553 Aes::new(AesKey::new_128(obj_key)?)
554 }
555 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
556 let obj_key = self.compute_aes256_object_key(key, obj_id)?;
557 Aes::new(AesKey::new_256(obj_key)?)
558 }
559 _ => {
560 return Err(crate::error::PdfError::EncryptionError(
561 "AES decryption requires Rev 4+ (use RC4 for Rev 2/3)".to_string(),
562 ));
563 }
564 };
565
566 aes.decrypt_cbc(encrypted_data, iv).map_err(|e| {
567 crate::error::PdfError::EncryptionError(format!("AES decryption failed: {e}"))
568 })
569 }
570
571 fn compute_r4_aes_object_key(&self, key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
576 let mut data = Vec::new();
577 data.extend_from_slice(&key.key);
578 data.extend_from_slice(&obj_id.number().to_le_bytes()[..3]);
579 data.extend_from_slice(&obj_id.generation().to_le_bytes()[..2]);
580 data.extend_from_slice(b"sAlT");
581
582 let hash = md5::compute(&data);
583 let key_len = (key.len() + 5).min(16);
584 hash[..key_len].to_vec()
585 }
586
587 fn compute_aes256_object_key(
597 &self,
598 key: &EncryptionKey,
599 _obj_id: &ObjectId,
600 ) -> Result<Vec<u8>> {
601 if self.revision < SecurityHandlerRevision::R5 {
602 return Err(crate::error::PdfError::EncryptionError(
603 "AESV3 file-key derivation only for Rev 5+".to_string(),
604 ));
605 }
606
607 Ok(key.key.clone())
608 }
609
610 pub fn compute_aes_encryption_key(
612 &self,
613 user_password: &UserPassword,
614 owner_hash: &[u8],
615 permissions: Permissions,
616 file_id: Option<&[u8]>,
617 ) -> Result<EncryptionKey> {
618 if self.revision < SecurityHandlerRevision::R5 {
619 return Err(crate::error::PdfError::EncryptionError(
620 "AES key computation only for Rev 5+".to_string(),
621 ));
622 }
623
624 let mut data = Vec::new();
626
627 let password_bytes = user_password.0.as_bytes();
629 data.extend_from_slice(password_bytes);
630
631 data.extend_from_slice(owner_hash);
633 data.extend_from_slice(&permissions.bits().to_le_bytes());
634
635 if let Some(id) = file_id {
636 data.extend_from_slice(id);
637 }
638
639 let mut hash = sha256(&data);
641
642 for _ in 0..100 {
644 hash = sha256(&hash);
645 }
646
647 hash.truncate(32);
649
650 Ok(EncryptionKey::new(hash))
651 }
652
653 pub fn validate_aes_user_password(
655 &self,
656 password: &UserPassword,
657 user_hash: &[u8],
658 permissions: Permissions,
659 file_id: Option<&[u8]>,
660 ) -> Result<bool> {
661 if self.revision < SecurityHandlerRevision::R5 {
662 return Err(crate::error::PdfError::EncryptionError(
663 "AES password validation only for Rev 5+".to_string(),
664 ));
665 }
666
667 let computed_key =
668 self.compute_aes_encryption_key(password, user_hash, permissions, file_id)?;
669
670 let computed_hash = sha256(&computed_key.key);
672
673 Ok(user_hash.len() >= 32 && computed_hash[..32] == user_hash[..32])
674 }
675
676 pub fn compute_r5_user_hash(&self, user_password: &UserPassword) -> Result<Vec<u8>> {
691 if self.revision != SecurityHandlerRevision::R5 {
692 return Err(crate::error::PdfError::EncryptionError(
693 "R5 user hash only for Revision 5".to_string(),
694 ));
695 }
696
697 let validation_salt = generate_salt(R5_SALT_LENGTH);
699 let key_salt = generate_salt(R5_SALT_LENGTH);
700
701 let mut data = Vec::new();
703 data.extend_from_slice(user_password.0.as_bytes());
704 data.extend_from_slice(&validation_salt);
705
706 let mut hash = sha256(&data);
707
708 for _ in 0..R5_HASH_ITERATIONS {
710 hash = sha256(&hash);
711 }
712
713 let mut u_entry = Vec::with_capacity(48);
715 u_entry.extend_from_slice(&hash[..32]);
716 u_entry.extend_from_slice(&validation_salt);
717 u_entry.extend_from_slice(&key_salt);
718
719 debug_assert_eq!(u_entry.len(), 48);
720 Ok(u_entry)
721 }
722
723 pub fn validate_r5_user_password(
737 &self,
738 password: &UserPassword,
739 u_entry: &[u8],
740 ) -> Result<bool> {
741 let u_entry = defined_entry_prefix(u_entry, "R5 U")?;
742
743 let validation_salt = &u_entry[U_VALIDATION_SALT_START..U_VALIDATION_SALT_END];
745
746 let mut data = Vec::new();
748 data.extend_from_slice(password.0.as_bytes());
749 data.extend_from_slice(validation_salt);
750
751 let mut hash = sha256(&data);
752
753 for _ in 0..R5_HASH_ITERATIONS {
755 hash = sha256(&hash);
756 }
757
758 let stored_hash = &u_entry[..U_HASH_LENGTH];
760 let computed_hash = &hash[..U_HASH_LENGTH];
761 Ok(bool::from(computed_hash.ct_eq(stored_hash)))
762 }
763
764 pub fn compute_r5_ue_entry(
774 &self,
775 user_password: &UserPassword,
776 u_entry: &[u8],
777 encryption_key: &EncryptionKey,
778 ) -> Result<Vec<u8>> {
779 if u_entry.len() != U_ENTRY_LENGTH {
780 return Err(crate::error::PdfError::EncryptionError(format!(
781 "U entry must be {} bytes",
782 U_ENTRY_LENGTH
783 )));
784 }
785 if encryption_key.len() != UE_ENTRY_LENGTH {
786 return Err(crate::error::PdfError::EncryptionError(format!(
787 "Encryption key must be {} bytes for R5",
788 UE_ENTRY_LENGTH
789 )));
790 }
791
792 let key_salt = &u_entry[U_KEY_SALT_START..U_KEY_SALT_END];
794
795 let mut data = Vec::new();
797 data.extend_from_slice(user_password.0.as_bytes());
798 data.extend_from_slice(key_salt);
799
800 let intermediate_key = sha256(&data);
801
802 let aes_key = AesKey::new_256(intermediate_key)?;
805 let aes = Aes::new(aes_key);
806 let iv = [0u8; 16];
807
808 let encrypted = aes
809 .encrypt_cbc_raw(encryption_key.as_bytes(), &iv)
810 .map_err(|e| {
811 crate::error::PdfError::EncryptionError(format!("UE encryption failed: {}", e))
812 })?;
813
814 Ok(encrypted)
816 }
817
818 pub fn recover_r5_encryption_key(
825 &self,
826 user_password: &UserPassword,
827 u_entry: &[u8],
828 ue_entry: &[u8],
829 ) -> Result<EncryptionKey> {
830 if ue_entry.len() != UE_ENTRY_LENGTH {
831 return Err(crate::error::PdfError::EncryptionError(format!(
832 "UE entry must be {} bytes, got {}",
833 UE_ENTRY_LENGTH,
834 ue_entry.len()
835 )));
836 }
837 let u_entry = defined_entry_prefix(u_entry, "U")?;
838
839 let key_salt = &u_entry[U_KEY_SALT_START..U_KEY_SALT_END];
841
842 let mut data = Vec::new();
844 data.extend_from_slice(user_password.0.as_bytes());
845 data.extend_from_slice(key_salt);
846
847 let intermediate_key = sha256(&data);
848
849 let aes_key = AesKey::new_256(intermediate_key)?;
852 let aes = Aes::new(aes_key);
853 let iv = [0u8; 16];
854
855 let decrypted = aes.decrypt_cbc_raw(ue_entry, &iv).map_err(|e| {
856 crate::error::PdfError::EncryptionError(format!("UE decryption failed: {}", e))
857 })?;
858
859 Ok(EncryptionKey::new(decrypted))
860 }
861
862 pub fn compute_r6_user_hash(&self, user_password: &UserPassword) -> Result<Vec<u8>> {
877 if self.revision != SecurityHandlerRevision::R6 {
878 return Err(crate::error::PdfError::EncryptionError(
879 "R6 user hash only for Revision 6".to_string(),
880 ));
881 }
882
883 let validation_salt = generate_salt(R6_SALT_LENGTH);
885 let key_salt = generate_salt(R6_SALT_LENGTH);
886
887 let hash = compute_hash_r6_algorithm_2b(
890 user_password.0.as_bytes(),
891 &validation_salt,
892 &[], )?;
894
895 let mut u_entry = Vec::with_capacity(48);
897 u_entry.extend_from_slice(&hash[..32]);
898 u_entry.extend_from_slice(&validation_salt);
899 u_entry.extend_from_slice(&key_salt);
900
901 debug_assert_eq!(u_entry.len(), 48);
902 Ok(u_entry)
903 }
904
905 pub fn validate_r6_user_password(
918 &self,
919 password: &UserPassword,
920 u_entry: &[u8],
921 ) -> Result<bool> {
922 let u_entry = defined_entry_prefix(u_entry, "R6 U")?;
923
924 let validation_salt = &u_entry[U_VALIDATION_SALT_START..U_VALIDATION_SALT_END];
926
927 let hash = compute_hash_r6_algorithm_2b(password.0.as_bytes(), validation_salt, &[])?;
930
931 let stored_hash = &u_entry[..U_HASH_LENGTH];
933 let computed_hash = &hash[..U_HASH_LENGTH];
934 Ok(bool::from(computed_hash.ct_eq(stored_hash)))
935 }
936
937 pub fn compute_r6_ue_entry(
944 &self,
945 user_password: &UserPassword,
946 u_entry: &[u8],
947 encryption_key: &EncryptionKey,
948 ) -> Result<Vec<u8>> {
949 if u_entry.len() != U_ENTRY_LENGTH {
950 return Err(crate::error::PdfError::EncryptionError(format!(
951 "U entry must be {} bytes",
952 U_ENTRY_LENGTH
953 )));
954 }
955 if encryption_key.len() != UE_ENTRY_LENGTH {
956 return Err(crate::error::PdfError::EncryptionError(format!(
957 "Encryption key must be {} bytes for R6",
958 UE_ENTRY_LENGTH
959 )));
960 }
961
962 let key_salt = &u_entry[U_KEY_SALT_START..U_KEY_SALT_END];
964
965 let hash = compute_hash_r6_algorithm_2b(user_password.0.as_bytes(), key_salt, &[])?;
971 let intermediate_key = hash[..U_HASH_LENGTH].to_vec();
972
973 let aes_key = AesKey::new_256(intermediate_key)?;
975 let aes = Aes::new(aes_key);
976 let iv = [0u8; 16];
977
978 let encrypted = aes
979 .encrypt_cbc_raw(encryption_key.as_bytes(), &iv)
980 .map_err(|e| {
981 crate::error::PdfError::EncryptionError(format!("UE encryption failed: {}", e))
982 })?;
983
984 Ok(encrypted)
985 }
986
987 pub fn recover_r6_encryption_key(
994 &self,
995 user_password: &UserPassword,
996 u_entry: &[u8],
997 ue_entry: &[u8],
998 ) -> Result<EncryptionKey> {
999 if ue_entry.len() != UE_ENTRY_LENGTH {
1000 return Err(crate::error::PdfError::EncryptionError(format!(
1001 "UE entry must be {} bytes, got {}",
1002 UE_ENTRY_LENGTH,
1003 ue_entry.len()
1004 )));
1005 }
1006 let u_entry = defined_entry_prefix(u_entry, "U")?;
1007
1008 let key_salt = &u_entry[U_KEY_SALT_START..U_KEY_SALT_END];
1010
1011 let hash = compute_hash_r6_algorithm_2b(user_password.0.as_bytes(), key_salt, &[])?;
1018 let intermediate_key = hash[..U_HASH_LENGTH].to_vec();
1019
1020 let aes_key = AesKey::new_256(intermediate_key)?;
1022 let aes = Aes::new(aes_key);
1023 let iv = [0u8; 16];
1024
1025 let decrypted = aes.decrypt_cbc_raw(ue_entry, &iv).map_err(|e| {
1026 crate::error::PdfError::EncryptionError(format!("UE decryption failed: {}", e))
1027 })?;
1028
1029 Ok(EncryptionKey::new(decrypted))
1030 }
1031
1032 pub fn compute_r6_perms_entry(
1048 &self,
1049 permissions: Permissions,
1050 encryption_key: &EncryptionKey,
1051 encrypt_metadata: bool,
1052 ) -> Result<Vec<u8>> {
1053 if self.revision != SecurityHandlerRevision::R6 {
1054 return Err(crate::error::PdfError::EncryptionError(
1055 "Perms entry only for Revision 6".to_string(),
1056 ));
1057 }
1058 if encryption_key.len() != UE_ENTRY_LENGTH {
1059 return Err(crate::error::PdfError::EncryptionError(format!(
1060 "Encryption key must be {} bytes for R6 Perms",
1061 UE_ENTRY_LENGTH
1062 )));
1063 }
1064
1065 let mut plaintext = vec![0u8; PERMS_ENTRY_LENGTH];
1067
1068 let p_bytes = (permissions.bits() as u32).to_le_bytes();
1070 plaintext[PERMS_P_START..PERMS_P_END].copy_from_slice(&p_bytes);
1071
1072 plaintext[PERMS_MARKER_START..PERMS_MARKER_END].copy_from_slice(&PERMS_MARKER);
1074
1075 plaintext[PERMS_LITERAL_START..PERMS_LITERAL_END].copy_from_slice(PERMS_LITERAL);
1077
1078 plaintext[PERMS_ENCRYPT_META_BYTE] = if encrypt_metadata { b'T' } else { b'F' };
1080
1081 let aes_key = AesKey::new_256(encryption_key.key.clone())?;
1085 let aes = Aes::new(aes_key);
1086
1087 let encrypted = aes.encrypt_ecb(&plaintext).map_err(|e| {
1088 crate::error::PdfError::EncryptionError(format!("Perms encryption failed: {}", e))
1089 })?;
1090
1091 Ok(encrypted)
1092 }
1093
1094 pub fn validate_r6_perms(
1104 &self,
1105 perms_entry: &[u8],
1106 encryption_key: &EncryptionKey,
1107 expected_permissions: Permissions,
1108 ) -> Result<bool> {
1109 if perms_entry.len() != PERMS_ENTRY_LENGTH {
1110 return Err(crate::error::PdfError::EncryptionError(format!(
1111 "Perms entry must be {} bytes, got {}",
1112 PERMS_ENTRY_LENGTH,
1113 perms_entry.len()
1114 )));
1115 }
1116 if encryption_key.len() != UE_ENTRY_LENGTH {
1117 return Err(crate::error::PdfError::EncryptionError(format!(
1118 "Encryption key must be {} bytes",
1119 UE_ENTRY_LENGTH
1120 )));
1121 }
1122
1123 let aes_key = AesKey::new_256(encryption_key.key.clone())?;
1125 let aes = Aes::new(aes_key);
1126
1127 let decrypted = aes.decrypt_ecb(perms_entry).map_err(|e| {
1128 crate::error::PdfError::EncryptionError(format!("Perms decryption failed: {}", e))
1129 })?;
1130
1131 if decrypted[PERMS_MARKER_START..PERMS_MARKER_END] != PERMS_MARKER {
1133 return Ok(false);
1134 }
1135
1136 if &decrypted[PERMS_LITERAL_START..PERMS_LITERAL_END] != PERMS_LITERAL {
1138 return Ok(false);
1139 }
1140
1141 let expected_bytes = (expected_permissions.bits() as u32).to_le_bytes();
1143 let actual_bytes = &decrypted[PERMS_P_START..PERMS_P_END];
1144 Ok(bool::from(expected_bytes.ct_eq(actual_bytes)))
1145 }
1146
1147 pub fn extract_r6_encrypt_metadata(
1152 &self,
1153 perms_entry: &[u8],
1154 encryption_key: &EncryptionKey,
1155 ) -> Result<Option<bool>> {
1156 if perms_entry.len() != PERMS_ENTRY_LENGTH || encryption_key.len() != UE_ENTRY_LENGTH {
1157 return Ok(None);
1158 }
1159
1160 let aes_key = AesKey::new_256(encryption_key.key.clone())?;
1161 let aes = Aes::new(aes_key);
1162
1163 let decrypted = match aes.decrypt_ecb(perms_entry) {
1164 Ok(d) => d,
1165 Err(_) => return Ok(None),
1166 };
1167
1168 if decrypted[PERMS_MARKER_START..PERMS_MARKER_END] != PERMS_MARKER
1170 || &decrypted[PERMS_LITERAL_START..PERMS_LITERAL_END] != PERMS_LITERAL
1171 {
1172 return Ok(None);
1173 }
1174
1175 match decrypted[PERMS_ENCRYPT_META_BYTE] {
1177 b'T' => Ok(Some(true)),
1178 b'F' => Ok(Some(false)),
1179 _ => Ok(None), }
1181 }
1182
1183 pub fn compute_r5_owner_hash(
1194 &self,
1195 owner_password: &OwnerPassword,
1196 u_entry: &[u8],
1197 ) -> Result<Vec<u8>> {
1198 if self.revision != SecurityHandlerRevision::R5 {
1199 return Err(crate::error::PdfError::EncryptionError(
1200 "R5 owner hash only for Revision 5".to_string(),
1201 ));
1202 }
1203 if u_entry.len() != U_ENTRY_LENGTH {
1204 return Err(crate::error::PdfError::EncryptionError(format!(
1205 "U entry must be {} bytes for R5 O computation, got {}",
1206 U_ENTRY_LENGTH,
1207 u_entry.len()
1208 )));
1209 }
1210
1211 let validation_salt = generate_salt(R5_SALT_LENGTH);
1213 let key_salt = generate_salt(R5_SALT_LENGTH);
1214
1215 let mut data = Vec::new();
1220 data.extend_from_slice(owner_password.0.as_bytes());
1221 data.extend_from_slice(&validation_salt);
1222 data.extend_from_slice(u_entry);
1223
1224 let hash = sha256(&data);
1225
1226 let mut o_entry = Vec::with_capacity(U_ENTRY_LENGTH);
1228 o_entry.extend_from_slice(&hash[..U_HASH_LENGTH]);
1229 o_entry.extend_from_slice(&validation_salt);
1230 o_entry.extend_from_slice(&key_salt);
1231
1232 debug_assert_eq!(o_entry.len(), U_ENTRY_LENGTH);
1233 Ok(o_entry)
1234 }
1235
1236 pub fn validate_r5_owner_password(
1240 &self,
1241 owner_password: &OwnerPassword,
1242 o_entry: &[u8],
1243 u_entry: &[u8],
1244 ) -> Result<bool> {
1245 let o_entry = defined_entry_prefix(o_entry, "R5 O")?;
1246 let u_entry = defined_entry_prefix(u_entry, "R5 U")?;
1247
1248 let validation_salt = &o_entry[U_VALIDATION_SALT_START..U_VALIDATION_SALT_END];
1250
1251 let mut data = Vec::new();
1254 data.extend_from_slice(owner_password.0.as_bytes());
1255 data.extend_from_slice(validation_salt);
1256 data.extend_from_slice(u_entry);
1257
1258 let hash = sha256(&data);
1259
1260 let stored_hash = &o_entry[..U_HASH_LENGTH];
1262 Ok(bool::from(hash[..U_HASH_LENGTH].ct_eq(stored_hash)))
1263 }
1264
1265 pub fn compute_r5_oe_entry(
1270 &self,
1271 owner_password: &OwnerPassword,
1272 o_entry: &[u8],
1273 u_entry: &[u8],
1274 encryption_key: &[u8],
1275 ) -> Result<Vec<u8>> {
1276 if o_entry.len() != U_ENTRY_LENGTH {
1277 return Err(crate::error::PdfError::EncryptionError(format!(
1278 "O entry must be {} bytes",
1279 U_ENTRY_LENGTH
1280 )));
1281 }
1282 if u_entry.len() != U_ENTRY_LENGTH {
1283 return Err(crate::error::PdfError::EncryptionError(format!(
1284 "U entry must be {} bytes",
1285 U_ENTRY_LENGTH
1286 )));
1287 }
1288 if encryption_key.len() != UE_ENTRY_LENGTH {
1289 return Err(crate::error::PdfError::EncryptionError(format!(
1290 "Encryption key must be {} bytes",
1291 UE_ENTRY_LENGTH
1292 )));
1293 }
1294
1295 let key_salt = &o_entry[U_KEY_SALT_START..U_KEY_SALT_END];
1297
1298 let mut data = Vec::new();
1301 data.extend_from_slice(owner_password.0.as_bytes());
1302 data.extend_from_slice(key_salt);
1303 data.extend_from_slice(u_entry);
1304
1305 let intermediate_key = sha256(&data);
1306
1307 let aes = Aes::new(AesKey::new_256(intermediate_key)?);
1309 let iv = [0u8; 16];
1310
1311 let encrypted = aes.encrypt_cbc_raw(encryption_key, &iv).map_err(|e| {
1312 crate::error::PdfError::EncryptionError(format!("OE encryption failed: {}", e))
1313 })?;
1314
1315 Ok(encrypted[..UE_ENTRY_LENGTH].to_vec())
1317 }
1318
1319 pub fn recover_r5_owner_encryption_key(
1321 &self,
1322 owner_password: &OwnerPassword,
1323 o_entry: &[u8],
1324 u_entry: &[u8],
1325 oe_entry: &[u8],
1326 ) -> Result<Vec<u8>> {
1327 let o_entry = defined_entry_prefix(o_entry, "O")?;
1328 let u_entry = defined_entry_prefix(u_entry, "U")?;
1329 if oe_entry.len() != UE_ENTRY_LENGTH {
1330 return Err(crate::error::PdfError::EncryptionError(format!(
1331 "OE entry must be {} bytes",
1332 UE_ENTRY_LENGTH
1333 )));
1334 }
1335
1336 let key_salt = &o_entry[U_KEY_SALT_START..U_KEY_SALT_END];
1338
1339 let mut data = Vec::new();
1342 data.extend_from_slice(owner_password.0.as_bytes());
1343 data.extend_from_slice(key_salt);
1344 data.extend_from_slice(u_entry);
1345
1346 let intermediate_key = sha256(&data);
1347
1348 let aes = Aes::new(AesKey::new_256(intermediate_key)?);
1350 let iv = [0u8; 16];
1351
1352 let decrypted = aes.decrypt_cbc_raw(oe_entry, &iv).map_err(|e| {
1353 crate::error::PdfError::EncryptionError(format!("OE decryption failed: {}", e))
1354 })?;
1355
1356 Ok(decrypted)
1357 }
1358
1359 pub fn compute_r6_owner_hash(
1363 &self,
1364 owner_password: &OwnerPassword,
1365 u_entry: &[u8],
1366 ) -> Result<Vec<u8>> {
1367 if self.revision != SecurityHandlerRevision::R6 {
1368 return Err(crate::error::PdfError::EncryptionError(
1369 "R6 owner hash only for Revision 6".to_string(),
1370 ));
1371 }
1372 if u_entry.len() != U_ENTRY_LENGTH {
1373 return Err(crate::error::PdfError::EncryptionError(format!(
1374 "U entry must be {} bytes for R6 O computation",
1375 U_ENTRY_LENGTH
1376 )));
1377 }
1378
1379 let validation_salt = generate_salt(R6_SALT_LENGTH);
1381 let key_salt = generate_salt(R6_SALT_LENGTH);
1382
1383 let hash =
1390 compute_hash_r6_algorithm_2b(owner_password.0.as_bytes(), &validation_salt, u_entry)?;
1391
1392 let mut o_entry = Vec::with_capacity(U_ENTRY_LENGTH);
1394 o_entry.extend_from_slice(&hash[..U_HASH_LENGTH]);
1395 o_entry.extend_from_slice(&validation_salt);
1396 o_entry.extend_from_slice(&key_salt);
1397
1398 debug_assert_eq!(o_entry.len(), U_ENTRY_LENGTH);
1399 Ok(o_entry)
1400 }
1401
1402 pub fn validate_r6_owner_password(
1406 &self,
1407 owner_password: &OwnerPassword,
1408 o_entry: &[u8],
1409 u_entry: &[u8],
1410 ) -> Result<bool> {
1411 let o_entry = defined_entry_prefix(o_entry, "R6 O")?;
1412 let u_entry = defined_entry_prefix(u_entry, "R6 U")?;
1413
1414 let validation_salt = &o_entry[U_VALIDATION_SALT_START..U_VALIDATION_SALT_END];
1416
1417 let hash =
1421 compute_hash_r6_algorithm_2b(owner_password.0.as_bytes(), validation_salt, u_entry)?;
1422
1423 let stored_hash = &o_entry[..U_HASH_LENGTH];
1425 Ok(bool::from(hash[..U_HASH_LENGTH].ct_eq(stored_hash)))
1426 }
1427
1428 pub fn compute_r6_oe_entry(
1432 &self,
1433 owner_password: &OwnerPassword,
1434 o_entry: &[u8],
1435 u_entry: &[u8],
1436 encryption_key: &[u8],
1437 ) -> Result<Vec<u8>> {
1438 if o_entry.len() != U_ENTRY_LENGTH {
1439 return Err(crate::error::PdfError::EncryptionError(format!(
1440 "O entry must be {} bytes",
1441 U_ENTRY_LENGTH
1442 )));
1443 }
1444 if u_entry.len() != U_ENTRY_LENGTH {
1445 return Err(crate::error::PdfError::EncryptionError(format!(
1446 "U entry must be {} bytes",
1447 U_ENTRY_LENGTH
1448 )));
1449 }
1450 if encryption_key.len() != UE_ENTRY_LENGTH {
1451 return Err(crate::error::PdfError::EncryptionError(format!(
1452 "Encryption key must be {} bytes",
1453 UE_ENTRY_LENGTH
1454 )));
1455 }
1456
1457 let key_salt = &o_entry[U_KEY_SALT_START..U_KEY_SALT_END];
1459
1460 let intermediate_key =
1463 compute_hash_r6_algorithm_2b(owner_password.0.as_bytes(), key_salt, u_entry)?;
1464
1465 let aes = Aes::new(AesKey::new_256(intermediate_key[..32].to_vec())?);
1467 let iv = [0u8; 16];
1468
1469 let encrypted = aes.encrypt_cbc_raw(encryption_key, &iv).map_err(|e| {
1470 crate::error::PdfError::EncryptionError(format!("OE encryption failed: {}", e))
1471 })?;
1472
1473 Ok(encrypted[..UE_ENTRY_LENGTH].to_vec())
1474 }
1475
1476 pub fn recover_r6_owner_encryption_key(
1478 &self,
1479 owner_password: &OwnerPassword,
1480 o_entry: &[u8],
1481 u_entry: &[u8],
1482 oe_entry: &[u8],
1483 ) -> Result<Vec<u8>> {
1484 let o_entry = defined_entry_prefix(o_entry, "O")?;
1485 let u_entry = defined_entry_prefix(u_entry, "U")?;
1486 if oe_entry.len() != UE_ENTRY_LENGTH {
1487 return Err(crate::error::PdfError::EncryptionError(format!(
1488 "OE entry must be {} bytes",
1489 UE_ENTRY_LENGTH
1490 )));
1491 }
1492
1493 let key_salt = &o_entry[U_KEY_SALT_START..U_KEY_SALT_END];
1495
1496 let intermediate_key =
1499 compute_hash_r6_algorithm_2b(owner_password.0.as_bytes(), key_salt, u_entry)?;
1500
1501 let aes = Aes::new(AesKey::new_256(intermediate_key[..32].to_vec())?);
1503 let iv = [0u8; 16];
1504
1505 let decrypted = aes.decrypt_cbc_raw(oe_entry, &iv).map_err(|e| {
1506 crate::error::PdfError::EncryptionError(format!("OE decryption failed: {}", e))
1507 })?;
1508
1509 Ok(decrypted)
1510 }
1511
1512 pub fn compute_object_key(&self, key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
1514 let mut data = Vec::new();
1515 data.extend_from_slice(&key.key);
1516 data.extend_from_slice(&obj_id.number().to_le_bytes()[..3]); data.extend_from_slice(&obj_id.generation().to_le_bytes()[..2]); let hash = md5::compute(&data);
1520 let key_len = (key.len() + 5).min(16);
1521 hash[..key_len].to_vec()
1522 }
1523
1524 pub fn validate_user_password(
1529 &self,
1530 password: &UserPassword,
1531 user_hash: &[u8],
1532 owner_hash: &[u8],
1533 permissions: Permissions,
1534 file_id: Option<&[u8]>,
1535 ) -> Result<bool> {
1536 let key = self.compute_encryption_key(password, owner_hash, permissions, file_id)?;
1538
1539 match self.revision {
1540 SecurityHandlerRevision::R2 => {
1541 let rc4_key = Rc4Key::from_slice(&key.key);
1543 let encrypted_padding = rc4_encrypt(&rc4_key, &PADDING);
1544
1545 Ok(user_hash.len() >= 32 && encrypted_padding[..] == user_hash[..32])
1547 }
1548 SecurityHandlerRevision::R3 | SecurityHandlerRevision::R4 => {
1549 let mut data = Vec::new();
1551 data.extend_from_slice(&PADDING);
1552
1553 if let Some(id) = file_id {
1554 data.extend_from_slice(id);
1555 }
1556
1557 let hash = md5::compute(&data);
1558
1559 let rc4_key = Rc4Key::from_slice(&key.key);
1561 let mut encrypted = rc4_encrypt(&rc4_key, hash.as_ref());
1562
1563 for i in 1..=19 {
1565 let mut key_bytes = key.key.clone();
1566 for byte in &mut key_bytes {
1567 *byte ^= i as u8;
1568 }
1569 let iter_key = Rc4Key::from_slice(&key_bytes);
1570 encrypted = rc4_encrypt(&iter_key, &encrypted);
1571 }
1572
1573 Ok(user_hash.len() >= 16 && encrypted[..16] == user_hash[..16])
1575 }
1576 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
1577 self.validate_aes_user_password(password, user_hash, permissions, file_id)
1579 }
1580 }
1581 }
1582
1583 pub fn validate_owner_password(
1600 &self,
1601 owner_password: &OwnerPassword,
1602 owner_hash: &[u8],
1603 _user_password: &UserPassword, _permissions: Permissions,
1605 _file_id: Option<&[u8]>,
1606 u_entry: Option<&[u8]>,
1607 ) -> Result<bool> {
1608 match self.revision {
1609 SecurityHandlerRevision::R2
1610 | SecurityHandlerRevision::R3
1611 | SecurityHandlerRevision::R4 => {
1612 let owner_pad = Self::pad_password(&owner_password.0);
1614
1615 let mut hash = md5::compute(&owner_pad).to_vec();
1617
1618 if self.revision >= SecurityHandlerRevision::R3 {
1620 for _ in 0..50 {
1621 hash = md5::compute(&hash).to_vec();
1622 }
1623 }
1624
1625 let rc4_key = Rc4Key::from_slice(&hash[..self.key_length]);
1627
1628 let mut decrypted = owner_hash[..32].to_vec();
1630
1631 if self.revision >= SecurityHandlerRevision::R3 {
1633 for i in (0..20).rev() {
1634 let mut key_bytes = hash[..self.key_length].to_vec();
1635 for byte in &mut key_bytes {
1636 *byte ^= i as u8;
1637 }
1638 let iter_key = Rc4Key::from_slice(&key_bytes);
1639 decrypted = rc4_encrypt(&iter_key, &decrypted);
1640 }
1641 } else {
1642 decrypted = rc4_encrypt(&rc4_key, &decrypted);
1644 }
1645
1646 let user_pwd_bytes = decrypted
1652 .iter()
1653 .take_while(|&&b| b != 0x28 || decrypted.starts_with(&PADDING))
1654 .copied()
1655 .collect::<Vec<u8>>();
1656
1657 let recovered_user =
1658 UserPassword(String::from_utf8_lossy(&user_pwd_bytes).to_string());
1659
1660 let computed_owner = self.compute_owner_hash(owner_password, &recovered_user);
1662
1663 Ok(computed_owner[..32] == owner_hash[..32])
1665 }
1666 SecurityHandlerRevision::R5 => {
1667 let u = u_entry.ok_or_else(|| {
1670 crate::error::PdfError::EncryptionError(
1671 "R5 owner password validation requires U entry".to_string(),
1672 )
1673 })?;
1674 self.validate_r5_owner_password(owner_password, owner_hash, u)
1675 }
1676 SecurityHandlerRevision::R6 => {
1677 let u = u_entry.ok_or_else(|| {
1679 crate::error::PdfError::EncryptionError(
1680 "R6 owner password validation requires U entry".to_string(),
1681 )
1682 })?;
1683 self.validate_r6_owner_password(owner_password, owner_hash, u)
1684 }
1685 }
1686 }
1687}
1688
1689fn rc4_encrypt(key: &Rc4Key, data: &[u8]) -> Vec<u8> {
1691 let mut cipher = Rc4::new(key);
1692 cipher.process(data)
1693}
1694
1695fn sha256(data: &[u8]) -> Vec<u8> {
1702 Sha256::digest(data).to_vec()
1703}
1704
1705fn sha384(data: &[u8]) -> Vec<u8> {
1710 Sha384::digest(data).to_vec()
1711}
1712
1713fn sha512(data: &[u8]) -> Vec<u8> {
1718 Sha512::digest(data).to_vec()
1719}
1720
1721const ALGORITHM_2B_MIN_ROUNDS: usize = 64;
1727
1728const ALGORITHM_2B_MAX_ROUNDS: usize = 2048;
1730
1731const ALGORITHM_2B_MAX_PASSWORD_LEN: usize = 127;
1734
1735const HASH_SELECTOR_BYTES: usize = 16;
1737
1738pub fn compute_hash_r6_algorithm_2b(
1770 password: &[u8],
1771 salt: &[u8],
1772 u_entry: &[u8],
1773) -> Result<Vec<u8>> {
1774 if password.len() > ALGORITHM_2B_MAX_PASSWORD_LEN {
1776 return Err(crate::error::PdfError::EncryptionError(format!(
1777 "Password too long ({} bytes, max {})",
1778 password.len(),
1779 ALGORITHM_2B_MAX_PASSWORD_LEN
1780 )));
1781 }
1782
1783 let mut input = Vec::with_capacity(password.len() + salt.len() + u_entry.len().min(48));
1785 input.extend_from_slice(password);
1786 input.extend_from_slice(salt);
1787 if !u_entry.is_empty() {
1788 input.extend_from_slice(&u_entry[..u_entry.len().min(48)]);
1789 }
1790
1791 let mut k = sha256(&input);
1792
1793 let mut round: usize = 0;
1795 loop {
1796 let mut k1_unit = Vec::new();
1799 k1_unit.extend_from_slice(password);
1800 k1_unit.extend_from_slice(&k);
1801 if !u_entry.is_empty() {
1802 k1_unit.extend_from_slice(&u_entry[..u_entry.len().min(48)]);
1803 }
1804
1805 let mut k1 = Vec::with_capacity(k1_unit.len() * 64);
1807 for _ in 0..64 {
1808 k1.extend_from_slice(&k1_unit);
1809 }
1810
1811 while k1.len() % 16 != 0 {
1814 k1.push(0);
1815 }
1816
1817 if k.len() < 32 {
1820 while k.len() < 32 {
1822 k.push(0);
1823 }
1824 }
1825
1826 let aes_key = AesKey::new_128(k[..16].to_vec()).map_err(|e| {
1827 crate::error::PdfError::EncryptionError(format!(
1828 "Algorithm 2.B: Failed to create AES key: {}",
1829 e
1830 ))
1831 })?;
1832 let aes = Aes::new(aes_key);
1833 let iv = &k[16..32];
1834
1835 let e = aes.encrypt_cbc_raw(&k1, iv).map_err(|e| {
1836 crate::error::PdfError::EncryptionError(format!(
1837 "Algorithm 2.B: AES encryption failed: {}",
1838 e
1839 ))
1840 })?;
1841
1842 let hash_selector = {
1847 let sum: u64 = e[..HASH_SELECTOR_BYTES.min(e.len())]
1848 .iter()
1849 .map(|&b| b as u64)
1850 .sum();
1851 (sum % 3) as u8
1852 };
1853
1854 k = match hash_selector {
1855 0 => sha256(&e),
1856 1 => sha384(&e),
1857 2 => sha512(&e),
1858 _ => unreachable!("Modulo 3 can only be 0, 1, or 2"),
1859 };
1860
1861 let last_byte = *e.last().unwrap_or(&0);
1864 round += 1;
1865
1866 if round >= ALGORITHM_2B_MIN_ROUNDS {
1867 if (last_byte as usize) <= round.saturating_sub(32) {
1871 break;
1872 }
1873 }
1874
1875 if round >= ALGORITHM_2B_MAX_ROUNDS {
1877 break;
1878 }
1879 }
1880
1881 Ok(k[..32.min(k.len())].to_vec())
1884}
1885
1886const R5_SALT_LENGTH: usize = 8;
1888
1889const R5_HASH_ITERATIONS: usize = 0;
1893
1894const R6_SALT_LENGTH: usize = 8;
1896
1897const U_HASH_LENGTH: usize = 32;
1903
1904const U_VALIDATION_SALT_START: usize = 32;
1906
1907const U_VALIDATION_SALT_END: usize = 40;
1909
1910const U_KEY_SALT_START: usize = 40;
1912
1913const U_KEY_SALT_END: usize = 48;
1915
1916const U_ENTRY_LENGTH: usize = 48;
1918
1919fn defined_entry_prefix<'a>(entry: &'a [u8], label: &str) -> Result<&'a [u8]> {
1933 if entry.len() < U_ENTRY_LENGTH {
1934 return Err(crate::error::PdfError::EncryptionError(format!(
1935 "{} entry must be at least {} bytes, got {}",
1936 label,
1937 U_ENTRY_LENGTH,
1938 entry.len()
1939 )));
1940 }
1941 Ok(&entry[..U_ENTRY_LENGTH])
1942}
1943
1944const UE_ENTRY_LENGTH: usize = 32;
1946
1947const PERMS_ENTRY_LENGTH: usize = 16;
1953
1954const PERMS_P_START: usize = 0;
1956
1957const PERMS_P_END: usize = 4;
1959
1960const PERMS_MARKER_START: usize = 4;
1962
1963const PERMS_MARKER_END: usize = 8;
1965
1966const PERMS_LITERAL_START: usize = 8;
1968
1969const PERMS_LITERAL_END: usize = 11;
1971
1972const PERMS_ENCRYPT_META_BYTE: usize = 11;
1974
1975const PERMS_MARKER: [u8; 4] = [0xFF, 0xFF, 0xFF, 0xFF];
1977
1978const PERMS_LITERAL: &[u8; 3] = b"adb";
1980
1981fn generate_salt(len: usize) -> Vec<u8> {
1991 let mut salt = vec![0u8; len];
1992 rand::rng().fill_bytes(&mut salt);
1993 salt
1994}
1995
1996#[cfg(test)]
1997mod tests {
1998 use super::*;
1999
2000 #[test]
2001 fn test_pad_password() {
2002 let padded = StandardSecurityHandler::pad_password("test");
2003 assert_eq!(padded.len(), 32);
2004 assert_eq!(&padded[..4], b"test");
2005 assert_eq!(&padded[4..8], &PADDING[..4]);
2006 }
2007
2008 #[test]
2009 fn test_pad_password_long() {
2010 let long_password = "a".repeat(40);
2011 let padded = StandardSecurityHandler::pad_password(&long_password);
2012 assert_eq!(padded.len(), 32);
2013 assert_eq!(&padded[..32], &long_password.as_bytes()[..32]);
2014 }
2015
2016 #[test]
2017 fn test_rc4_40bit_handler() {
2018 let handler = StandardSecurityHandler::rc4_40bit();
2019 assert_eq!(handler.revision, SecurityHandlerRevision::R2);
2020 assert_eq!(handler.key_length, 5);
2021 }
2022
2023 #[test]
2024 fn test_rc4_128bit_handler() {
2025 let handler = StandardSecurityHandler::rc4_128bit();
2026 assert_eq!(handler.revision, SecurityHandlerRevision::R3);
2027 assert_eq!(handler.key_length, 16);
2028 }
2029
2030 #[test]
2031 fn test_owner_hash_computation() {
2032 let handler = StandardSecurityHandler::rc4_40bit();
2033 let owner_pwd = OwnerPassword("owner".to_string());
2034 let user_pwd = UserPassword("user".to_string());
2035
2036 let hash = handler.compute_owner_hash(&owner_pwd, &user_pwd);
2037 assert_eq!(hash.len(), 32);
2038 }
2039
2040 #[test]
2041 fn test_encryption_key_computation() {
2042 let handler = StandardSecurityHandler::rc4_40bit();
2043 let user_pwd = UserPassword("user".to_string());
2044 let owner_hash = vec![0u8; 32];
2045 let permissions = Permissions::new();
2046
2047 let key = handler
2048 .compute_encryption_key(&user_pwd, &owner_hash, permissions, None)
2049 .unwrap();
2050
2051 assert_eq!(key.len(), 5);
2052 }
2053
2054 #[test]
2055 fn test_aes_256_r5_handler() {
2056 let handler = StandardSecurityHandler::aes_256_r5();
2057 assert_eq!(handler.revision, SecurityHandlerRevision::R5);
2058 assert_eq!(handler.key_length, 32);
2059 }
2060
2061 #[test]
2062 fn test_aes_256_r6_handler() {
2063 let handler = StandardSecurityHandler::aes_256_r6();
2064 assert_eq!(handler.revision, SecurityHandlerRevision::R6);
2065 assert_eq!(handler.key_length, 32);
2066 }
2067
2068 #[test]
2069 fn test_aes_encryption_key_computation() {
2070 let handler = StandardSecurityHandler::aes_256_r5();
2071 let user_pwd = UserPassword("testuser".to_string());
2072 let owner_hash = vec![0u8; 32];
2073 let permissions = Permissions::new();
2074
2075 let key = handler
2076 .compute_aes_encryption_key(&user_pwd, &owner_hash, permissions, None)
2077 .unwrap();
2078
2079 assert_eq!(key.len(), 32);
2080 }
2081
2082 #[test]
2083 fn test_aes_encrypt_decrypt() {
2084 let handler = StandardSecurityHandler::aes_256_r5();
2085 let key = EncryptionKey::new(vec![0u8; 32]);
2086 let obj_id = ObjectId::new(1, 0);
2087 let data = b"Hello AES encryption!";
2088
2089 let encrypted = handler.encrypt_aes(data, &key, &obj_id).unwrap();
2090 assert_ne!(encrypted.as_slice(), data);
2091 assert!(encrypted.len() > data.len()); let _decrypted = handler.decrypt_aes(&encrypted, &key, &obj_id);
2095 }
2097
2098 #[test]
2099 fn test_aes_with_rc4_handler_fails() {
2100 let handler = StandardSecurityHandler::rc4_128bit();
2101 let key = EncryptionKey::new(vec![0u8; 16]);
2102 let obj_id = ObjectId::new(1, 0);
2103 let data = b"test data";
2104
2105 assert!(handler.encrypt_aes(data, &key, &obj_id).is_err());
2107 assert!(handler.decrypt_aes(data, &key, &obj_id).is_err());
2108 }
2109
2110 #[test]
2111 fn test_aes_decrypt_invalid_data() {
2112 let handler = StandardSecurityHandler::aes_256_r5();
2113 let key = EncryptionKey::new(vec![0u8; 32]);
2114 let obj_id = ObjectId::new(1, 0);
2115
2116 let short_data = vec![0u8; 10];
2118 assert!(handler.decrypt_aes(&short_data, &key, &obj_id).is_err());
2119 }
2120
2121 #[test]
2122 fn test_sha256_deterministic() {
2123 let data1 = b"test data";
2124 let data2 = b"test data";
2125 let data3 = b"different data";
2126
2127 let hash1 = sha256(data1);
2128 let hash2 = sha256(data2);
2129 let hash3 = sha256(data3);
2130
2131 assert_eq!(hash1.len(), 32);
2132 assert_eq!(hash2.len(), 32);
2133 assert_eq!(hash3.len(), 32);
2134
2135 assert_eq!(hash1, hash2); assert_ne!(hash1, hash3); }
2138
2139 #[test]
2140 fn test_security_handler_revision_ordering() {
2141 assert!(SecurityHandlerRevision::R2 < SecurityHandlerRevision::R3);
2142 assert!(SecurityHandlerRevision::R3 < SecurityHandlerRevision::R4);
2143 assert!(SecurityHandlerRevision::R4 < SecurityHandlerRevision::R5);
2144 assert!(SecurityHandlerRevision::R5 < SecurityHandlerRevision::R6);
2145 }
2146
2147 #[test]
2148 fn test_aes_password_validation() {
2149 let handler = StandardSecurityHandler::aes_256_r5();
2150 let password = UserPassword("testpassword".to_string());
2151 let user_hash = vec![0u8; 32]; let permissions = Permissions::new();
2153
2154 let result = handler.validate_aes_user_password(&password, &user_hash, permissions, None);
2156 assert!(result.is_ok());
2157 }
2158
2159 #[test]
2162 fn test_user_password_debug() {
2163 let pwd = UserPassword("debug_test".to_string());
2164 let debug_str = format!("{pwd:?}");
2165 assert!(debug_str.contains("UserPassword"));
2166 assert!(debug_str.contains("debug_test"));
2167 }
2168
2169 #[test]
2170 fn test_owner_password_debug() {
2171 let pwd = OwnerPassword("owner_debug".to_string());
2172 let debug_str = format!("{pwd:?}");
2173 assert!(debug_str.contains("OwnerPassword"));
2174 assert!(debug_str.contains("owner_debug"));
2175 }
2176
2177 #[test]
2178 fn test_encryption_key_debug() {
2179 let key = EncryptionKey::new(vec![0x01, 0x02, 0x03]);
2180 let debug_str = format!("{key:?}");
2181 assert!(debug_str.contains("EncryptionKey"));
2182 }
2183
2184 #[test]
2185 fn test_security_handler_revision_equality() {
2186 assert_eq!(SecurityHandlerRevision::R2, SecurityHandlerRevision::R2);
2187 assert_ne!(SecurityHandlerRevision::R2, SecurityHandlerRevision::R3);
2188 }
2189
2190 #[test]
2191 fn test_security_handler_revision_values() {
2192 assert_eq!(SecurityHandlerRevision::R2 as u8, 2);
2193 assert_eq!(SecurityHandlerRevision::R3 as u8, 3);
2194 assert_eq!(SecurityHandlerRevision::R4 as u8, 4);
2195 assert_eq!(SecurityHandlerRevision::R5 as u8, 5);
2196 assert_eq!(SecurityHandlerRevision::R6 as u8, 6);
2197 }
2198
2199 #[test]
2200 fn test_pad_password_various_lengths() {
2201 for len in 0..=40 {
2202 let password = "x".repeat(len);
2203 let padded = StandardSecurityHandler::pad_password(&password);
2204 assert_eq!(padded.len(), 32);
2205
2206 if len <= 32 {
2207 assert_eq!(&padded[..len], password.as_bytes());
2208 } else {
2209 assert_eq!(&padded[..], &password.as_bytes()[..32]);
2210 }
2211 }
2212 }
2213
2214 #[test]
2215 fn test_pad_password_unicode() {
2216 let padded = StandardSecurityHandler::pad_password("café");
2217 assert_eq!(padded.len(), 32);
2218 assert_eq!(&padded[..5], "café".as_bytes());
2220 }
2221
2222 #[test]
2223 fn test_compute_owner_hash_different_users() {
2224 let handler = StandardSecurityHandler::rc4_128bit();
2225 let owner = OwnerPassword("owner".to_string());
2226 let user1 = UserPassword("user1".to_string());
2227 let user2 = UserPassword("user2".to_string());
2228
2229 let hash1 = handler.compute_owner_hash(&owner, &user1);
2230 let hash2 = handler.compute_owner_hash(&owner, &user2);
2231
2232 assert_ne!(hash1, hash2); }
2234
2235 #[test]
2236 fn test_compute_user_hash_r4() {
2237 let handler = StandardSecurityHandler {
2238 revision: SecurityHandlerRevision::R4,
2239 key_length: 16,
2240 };
2241 let user = UserPassword("r4test".to_string());
2242 let owner_hash = vec![0xAA; 32];
2243 let permissions = Permissions::new();
2244
2245 let hash = handler
2246 .compute_user_hash(&user, &owner_hash, permissions, None)
2247 .unwrap();
2248 assert_eq!(hash.len(), 32);
2249 }
2250
2251 #[test]
2252 fn test_compute_user_hash_r6() {
2253 let handler = StandardSecurityHandler::aes_256_r6();
2254 let user = UserPassword("r6test".to_string());
2255 let owner_hash = vec![0xBB; 32];
2256 let permissions = Permissions::all();
2257
2258 let hash = handler
2259 .compute_user_hash(&user, &owner_hash, permissions, None)
2260 .unwrap();
2261 assert_eq!(hash.len(), 32);
2262 }
2263
2264 #[test]
2265 fn test_encryption_key_with_file_id_affects_result() {
2266 let handler = StandardSecurityHandler::rc4_128bit();
2267 let user = UserPassword("test".to_string());
2268 let owner_hash = vec![0xFF; 32];
2269 let permissions = Permissions::new();
2270 let file_id = b"unique_file_id_12345";
2271
2272 let key_with_id = handler
2273 .compute_encryption_key(&user, &owner_hash, permissions, Some(file_id))
2274 .unwrap();
2275 let key_without_id = handler
2276 .compute_encryption_key(&user, &owner_hash, permissions, None)
2277 .unwrap();
2278
2279 assert_ne!(key_with_id.key, key_without_id.key);
2280 }
2281
2282 #[test]
2283 fn test_encrypt_string_empty() {
2284 let handler = StandardSecurityHandler::rc4_40bit();
2285 let key = EncryptionKey::new(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
2286 let obj_id = ObjectId::new(1, 0);
2287
2288 let encrypted = handler.encrypt_string(b"", &key, &obj_id);
2289 assert_eq!(encrypted.len(), 0);
2290 }
2291
2292 #[test]
2293 fn test_encrypt_decrypt_large_data() {
2294 let handler = StandardSecurityHandler::rc4_128bit();
2295 let key = EncryptionKey::new(vec![0xAA; 16]);
2296 let obj_id = ObjectId::new(42, 0);
2297 let large_data = vec![0x55; 10000]; let encrypted = handler.encrypt_string(&large_data, &key, &obj_id);
2300 assert_eq!(encrypted.len(), large_data.len());
2301 assert_ne!(encrypted, large_data);
2302
2303 let decrypted = handler.decrypt_string(&encrypted, &key, &obj_id);
2304 assert_eq!(decrypted, large_data);
2305 }
2306
2307 #[test]
2308 fn test_stream_encryption_different_from_string() {
2309 let handler = StandardSecurityHandler::rc4_128bit();
2311 let key = EncryptionKey::new(vec![0x11; 16]);
2312 let obj_id = ObjectId::new(5, 1);
2313 let data = b"Stream content test";
2314
2315 let encrypted_string = handler.encrypt_string(data, &key, &obj_id);
2316 let encrypted_stream = handler.encrypt_stream(data, &key, &obj_id);
2317
2318 assert_eq!(encrypted_string, encrypted_stream); }
2320
2321 #[test]
2322 fn test_aes_encryption_with_different_object_ids() {
2323 let handler = StandardSecurityHandler::aes_256_r5();
2324 let key = EncryptionKey::new(vec![0x77; 32]);
2325 let obj_id1 = ObjectId::new(10, 0);
2326 let obj_id2 = ObjectId::new(11, 0);
2327 let data = b"AES test data";
2328
2329 let encrypted1 = handler.encrypt_aes(data, &key, &obj_id1).unwrap();
2330 let encrypted2 = handler.encrypt_aes(data, &key, &obj_id2).unwrap();
2331
2332 assert_ne!(encrypted1, encrypted2);
2334 }
2335
2336 #[test]
2337 fn test_aes_decrypt_invalid_iv_length() {
2338 let handler = StandardSecurityHandler::aes_256_r5();
2339 let key = EncryptionKey::new(vec![0x88; 32]);
2340 let obj_id = ObjectId::new(1, 0);
2341
2342 let short_data = vec![0u8; 10];
2344 assert!(handler.decrypt_aes(&short_data, &key, &obj_id).is_err());
2345
2346 let iv_only = vec![0u8; 16];
2348 let result = handler.decrypt_aes(&iv_only, &key, &obj_id);
2349 if let Ok(decrypted) = result {
2351 assert_eq!(decrypted.len(), 0);
2352 }
2353 }
2354
2355 #[test]
2356 fn test_aes_validate_password_wrong_hash_length() {
2357 let handler = StandardSecurityHandler::aes_256_r5();
2358 let password = UserPassword("test".to_string());
2359 let short_hash = vec![0u8; 16]; let permissions = Permissions::new();
2361
2362 let result = handler
2363 .validate_aes_user_password(&password, &short_hash, permissions, None)
2364 .unwrap();
2365 assert!(!result); }
2367
2368 #[test]
2369 fn test_permissions_affect_encryption_key() {
2370 let handler = StandardSecurityHandler::rc4_128bit();
2371 let user = UserPassword("same_user".to_string());
2372 let owner_hash = vec![0xCC; 32];
2373
2374 let perms1 = Permissions::new();
2375 let perms2 = Permissions::all();
2376
2377 let key1 = handler
2378 .compute_encryption_key(&user, &owner_hash, perms1, None)
2379 .unwrap();
2380 let key2 = handler
2381 .compute_encryption_key(&user, &owner_hash, perms2, None)
2382 .unwrap();
2383
2384 assert_ne!(key1.key, key2.key); }
2386
2387 #[test]
2388 fn test_different_handlers_produce_different_keys() {
2389 let user = UserPassword("test".to_string());
2390 let owner_hash = vec![0xDD; 32];
2391 let permissions = Permissions::new();
2392
2393 let handler_r2 = StandardSecurityHandler::rc4_40bit();
2394 let handler_r3 = StandardSecurityHandler::rc4_128bit();
2395
2396 let key_r2 = handler_r2
2397 .compute_encryption_key(&user, &owner_hash, permissions, None)
2398 .unwrap();
2399 let key_r3 = handler_r3
2400 .compute_encryption_key(&user, &owner_hash, permissions, None)
2401 .unwrap();
2402
2403 assert_ne!(key_r2.len(), key_r3.len()); assert_eq!(key_r2.len(), 5);
2405 assert_eq!(key_r3.len(), 16);
2406 }
2407
2408 #[test]
2409 fn test_full_workflow_aes_r6() {
2410 let handler = StandardSecurityHandler::aes_256_r6();
2411 let user_pwd = UserPassword("user_r6".to_string());
2412 let permissions = Permissions::new();
2413 let file_id = b"test_file_r6";
2414
2415 let owner_hash = vec![0x42; 32]; let user_hash = handler
2420 .compute_user_hash(&user_pwd, &owner_hash, permissions, Some(file_id))
2421 .unwrap();
2422 assert_eq!(user_hash.len(), 32);
2423
2424 let key = handler
2426 .compute_aes_encryption_key(&user_pwd, &owner_hash, permissions, Some(file_id))
2427 .unwrap();
2428 assert_eq!(key.len(), 32);
2429
2430 let obj_id = ObjectId::new(100, 5);
2432 let content = b"R6 AES encryption test";
2433 let encrypted = handler.encrypt_string(content, &key, &obj_id);
2434
2435 if !encrypted.is_empty() {
2437 assert_ne!(encrypted.as_slice(), content);
2438 }
2439 }
2440
2441 #[test]
2442 fn test_md5_compute_consistency() {
2443 let data = b"consistent data for md5";
2444 let hash1 = md5::compute(data);
2445 let hash2 = md5::compute(data);
2446
2447 assert_eq!(hash1, hash2);
2448 assert_eq!(hash1.len(), 16);
2449 }
2450
2451 #[test]
2452 fn test_sha256_consistency() {
2453 let data = b"consistent data for sha256";
2454 let hash1 = sha256(data);
2455 let hash2 = sha256(data);
2456
2457 assert_eq!(hash1, hash2);
2458 assert_eq!(hash1.len(), 32);
2459 }
2460
2461 #[test]
2462 fn test_rc4_encrypt_helper() {
2463 let key = Rc4Key::from_slice(&[0x01, 0x02, 0x03, 0x04, 0x05]);
2464 let data = b"test rc4 helper";
2465
2466 let encrypted = rc4_encrypt(&key, data);
2467 assert_ne!(encrypted.as_slice(), data);
2468
2469 let decrypted = rc4_encrypt(&key, &encrypted);
2471 assert_eq!(decrypted.as_slice(), data);
2472 }
2473
2474 #[test]
2475 fn test_edge_case_max_object_generation() {
2476 let handler = StandardSecurityHandler::rc4_128bit();
2477 let key = EncryptionKey::new(vec![0xEE; 16]);
2478 let obj_id = ObjectId::new(0xFFFFFF, 0xFFFF); let data = b"edge case";
2480
2481 let encrypted = handler.encrypt_string(data, &key, &obj_id);
2482 let decrypted = handler.decrypt_string(&encrypted, &key, &obj_id);
2483 assert_eq!(decrypted.as_slice(), data);
2484 }
2485
2486 #[test]
2491 fn test_try_decrypt_stream_surfaces_aes_error() {
2492 let handler = StandardSecurityHandler::aes_128_r4();
2493 let key = EncryptionKey::new(vec![0x11; 16]);
2494 let obj_id = ObjectId::new(1, 0);
2495
2496 let undecryptable = [0u8; 8];
2498
2499 let err = handler.try_decrypt_stream(&undecryptable, &key, &obj_id);
2500 assert!(
2501 err.is_err(),
2502 "try_decrypt_stream must return Err on undecryptable AES data, got {err:?}"
2503 );
2504
2505 let lenient = handler.decrypt_stream(&undecryptable, &key, &obj_id);
2508 assert!(lenient.is_empty());
2509 }
2510
2511 #[test]
2512 fn test_try_decrypt_string_surfaces_aes_error() {
2513 let handler = StandardSecurityHandler::aes_128_r4();
2514 let key = EncryptionKey::new(vec![0x22; 16]);
2515 let obj_id = ObjectId::new(2, 0);
2516
2517 let undecryptable = [0u8; 4];
2518 assert!(
2519 handler
2520 .try_decrypt_string(&undecryptable, &key, &obj_id)
2521 .is_err(),
2522 "try_decrypt_string must return Err on undecryptable AES data"
2523 );
2524 }
2525
2526 #[test]
2529 fn test_sha256_nist_empty_string() {
2530 let hash = sha256(b"");
2532 let expected: [u8; 32] = [
2533 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f,
2534 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b,
2535 0x78, 0x52, 0xb8, 0x55,
2536 ];
2537 assert_eq!(
2538 hash.as_slice(),
2539 expected.as_slice(),
2540 "SHA-256('') must match NIST test vector"
2541 );
2542 }
2543
2544 #[test]
2545 fn test_sha256_nist_abc() {
2546 let hash = sha256(b"abc");
2548 let expected: [u8; 32] = [
2549 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae,
2550 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61,
2551 0xf2, 0x00, 0x15, 0xad,
2552 ];
2553 assert_eq!(
2554 hash.as_slice(),
2555 expected.as_slice(),
2556 "SHA-256('abc') must match NIST test vector"
2557 );
2558 }
2559
2560 #[test]
2561 fn test_sha512_nist_abc() {
2562 let hash = sha512(b"abc");
2564 let expected: [u8; 64] = [
2565 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20,
2566 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6,
2567 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba,
2568 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd, 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
2569 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f,
2570 ];
2571 assert_eq!(
2572 hash.as_slice(),
2573 expected.as_slice(),
2574 "SHA-512('abc') must match NIST test vector"
2575 );
2576 }
2577
2578 #[test]
2579 fn test_sha512_length() {
2580 let hash = sha512(b"test data");
2581 assert_eq!(hash.len(), 64, "SHA-512 must produce 64 bytes");
2582 }
2583
2584 #[test]
2585 fn test_sha512_deterministic() {
2586 let data1 = b"sha512 test data";
2587 let data2 = b"sha512 test data";
2588 let data3 = b"different data";
2589
2590 let hash1 = sha512(data1);
2591 let hash2 = sha512(data2);
2592 let hash3 = sha512(data3);
2593
2594 assert_eq!(hash1, hash2, "Same input must produce same SHA-512 hash");
2595 assert_ne!(hash1, hash3, "Different input must produce different hash");
2596 }
2597
2598 #[test]
2601 fn test_r5_user_hash_computation() {
2602 let handler = StandardSecurityHandler::aes_256_r5();
2603 let password = UserPassword("test_password".to_string());
2604
2605 let u_entry = handler.compute_r5_user_hash(&password).unwrap();
2606
2607 assert_eq!(u_entry.len(), 48, "R5 U entry must be 48 bytes");
2609 }
2610
2611 #[test]
2612 fn test_r5_user_password_validation_correct() {
2613 let handler = StandardSecurityHandler::aes_256_r5();
2614 let password = UserPassword("correct_password".to_string());
2615
2616 let u_entry = handler.compute_r5_user_hash(&password).unwrap();
2618
2619 let is_valid = handler
2621 .validate_r5_user_password(&password, &u_entry)
2622 .unwrap();
2623 assert!(is_valid, "Correct password must validate");
2624 }
2625
2626 #[test]
2627 fn test_r5_user_password_validation_incorrect() {
2628 let handler = StandardSecurityHandler::aes_256_r5();
2629 let correct_password = UserPassword("correct_password".to_string());
2630 let wrong_password = UserPassword("wrong_password".to_string());
2631
2632 let u_entry = handler.compute_r5_user_hash(&correct_password).unwrap();
2634
2635 let is_valid = handler
2637 .validate_r5_user_password(&wrong_password, &u_entry)
2638 .unwrap();
2639 assert!(!is_valid, "Wrong password must not validate");
2640 }
2641
2642 #[test]
2643 fn test_r5_user_hash_random_salts() {
2644 let handler = StandardSecurityHandler::aes_256_r5();
2645 let password = UserPassword("same_password".to_string());
2646
2647 let u_entry1 = handler.compute_r5_user_hash(&password).unwrap();
2649 let u_entry2 = handler.compute_r5_user_hash(&password).unwrap();
2650
2651 assert_ne!(
2653 &u_entry1[..32],
2654 &u_entry2[..32],
2655 "Different random salts should produce different hashes"
2656 );
2657
2658 assert_ne!(
2660 &u_entry1[32..40],
2661 &u_entry2[32..40],
2662 "Validation salts must be random"
2663 );
2664
2665 assert!(handler
2667 .validate_r5_user_password(&password, &u_entry1)
2668 .unwrap());
2669 assert!(handler
2670 .validate_r5_user_password(&password, &u_entry2)
2671 .unwrap());
2672 }
2673
2674 #[test]
2675 fn test_r5_user_hash_entry_shorter_than_the_salts_is_rejected() {
2676 let handler = StandardSecurityHandler::aes_256_r5();
2677 let password = UserPassword("test".to_string());
2678
2679 let short_entry = vec![0u8; 32];
2681 let result = handler.validate_r5_user_password(&password, &short_entry);
2682 assert!(result.is_err(), "Short U entry must fail");
2683
2684 let long_entry = vec![0u8; 64];
2688 assert!(
2689 !handler
2690 .validate_r5_user_password(&password, &long_entry)
2691 .expect("a longer entry is read, not refused"),
2692 "an all-zero entry must not authenticate any password"
2693 );
2694 }
2695
2696 #[test]
2697 fn test_r5_empty_password() {
2698 let handler = StandardSecurityHandler::aes_256_r5();
2699 let empty_password = UserPassword("".to_string());
2700
2701 let u_entry = handler.compute_r5_user_hash(&empty_password).unwrap();
2703 assert_eq!(u_entry.len(), 48);
2704
2705 let is_valid = handler
2706 .validate_r5_user_password(&empty_password, &u_entry)
2707 .unwrap();
2708 assert!(is_valid, "Empty password must validate correctly");
2709
2710 let non_empty = UserPassword("not_empty".to_string());
2712 let is_valid = handler
2713 .validate_r5_user_password(&non_empty, &u_entry)
2714 .unwrap();
2715 assert!(!is_valid, "Non-empty password must not validate");
2716 }
2717
2718 #[test]
2721 fn test_r5_ue_entry_computation() {
2722 let handler = StandardSecurityHandler::aes_256_r5();
2723 let password = UserPassword("ue_test_password".to_string());
2724 let encryption_key = EncryptionKey::new(vec![0xAB; 32]);
2725
2726 let u_entry = handler.compute_r5_user_hash(&password).unwrap();
2728
2729 let ue_entry = handler
2731 .compute_r5_ue_entry(&password, &u_entry, &encryption_key)
2732 .unwrap();
2733
2734 assert_eq!(ue_entry.len(), 32, "R5 UE entry must be 32 bytes");
2736
2737 assert_ne!(
2739 ue_entry.as_slice(),
2740 encryption_key.as_bytes(),
2741 "UE must be encrypted"
2742 );
2743 }
2744
2745 #[test]
2746 fn test_r5_encryption_key_recovery() {
2747 let handler = StandardSecurityHandler::aes_256_r5();
2748 let password = UserPassword("recovery_test".to_string());
2749 let original_key = EncryptionKey::new(vec![0x42; 32]);
2750
2751 let u_entry = handler.compute_r5_user_hash(&password).unwrap();
2753
2754 let ue_entry = handler
2756 .compute_r5_ue_entry(&password, &u_entry, &original_key)
2757 .unwrap();
2758
2759 let recovered_key = handler
2761 .recover_r5_encryption_key(&password, &u_entry, &ue_entry)
2762 .unwrap();
2763
2764 assert_eq!(
2766 recovered_key.as_bytes(),
2767 original_key.as_bytes(),
2768 "Recovered key must match original"
2769 );
2770 }
2771
2772 #[test]
2773 fn test_r5_ue_wrong_password_fails() {
2774 let handler = StandardSecurityHandler::aes_256_r5();
2775 let correct_password = UserPassword("correct".to_string());
2776 let wrong_password = UserPassword("wrong".to_string());
2777 let original_key = EncryptionKey::new(vec![0x99; 32]);
2778
2779 let u_entry = handler.compute_r5_user_hash(&correct_password).unwrap();
2781 let ue_entry = handler
2782 .compute_r5_ue_entry(&correct_password, &u_entry, &original_key)
2783 .unwrap();
2784
2785 let recovered_key = handler
2787 .recover_r5_encryption_key(&wrong_password, &u_entry, &ue_entry)
2788 .unwrap();
2789
2790 assert_ne!(
2792 recovered_key.as_bytes(),
2793 original_key.as_bytes(),
2794 "Wrong password must produce wrong key"
2795 );
2796 }
2797
2798 #[test]
2799 fn test_r5_ue_invalid_length() {
2800 let handler = StandardSecurityHandler::aes_256_r5();
2801 let password = UserPassword("test".to_string());
2802 let u_entry = vec![0u8; 48]; let short_ue = vec![0u8; 16]; let result = handler.recover_r5_encryption_key(&password, &u_entry, &short_ue);
2807 assert!(result.is_err(), "Short UE entry must fail");
2808
2809 let long_ue = vec![0u8; 64]; let result = handler.recover_r5_encryption_key(&password, &u_entry, &long_ue);
2811 assert!(result.is_err(), "Long UE entry must fail");
2812 }
2813
2814 #[test]
2815 fn test_r5_ue_invalid_u_length() {
2816 let handler = StandardSecurityHandler::aes_256_r5();
2817 let password = UserPassword("test".to_string());
2818 let encryption_key = EncryptionKey::new(vec![0x11; 32]);
2819
2820 let short_u = vec![0u8; 32]; let result = handler.compute_r5_ue_entry(&password, &short_u, &encryption_key);
2823 assert!(
2824 result.is_err(),
2825 "Short U entry must fail for UE computation"
2826 );
2827 }
2828
2829 #[test]
2830 fn test_r5_full_workflow_u_ue() {
2831 let handler = StandardSecurityHandler::aes_256_r5();
2832 let password = UserPassword("full_workflow_test".to_string());
2833 let encryption_key = EncryptionKey::new((0..32).collect::<Vec<u8>>());
2834
2835 let u_entry = handler.compute_r5_user_hash(&password).unwrap();
2837 assert_eq!(u_entry.len(), 48);
2838
2839 assert!(handler
2841 .validate_r5_user_password(&password, &u_entry)
2842 .unwrap());
2843
2844 let ue_entry = handler
2846 .compute_r5_ue_entry(&password, &u_entry, &encryption_key)
2847 .unwrap();
2848 assert_eq!(ue_entry.len(), 32);
2849
2850 let recovered = handler
2852 .recover_r5_encryption_key(&password, &u_entry, &ue_entry)
2853 .unwrap();
2854
2855 assert_eq!(
2857 recovered.as_bytes(),
2858 encryption_key.as_bytes(),
2859 "Full R5 workflow: recovered key must match original"
2860 );
2861 }
2862
2863 #[test]
2866 fn test_r6_user_hash_computation() {
2867 let handler = StandardSecurityHandler::aes_256_r6();
2868 let password = UserPassword("r6_test_password".to_string());
2869
2870 let u_entry = handler.compute_r6_user_hash(&password).unwrap();
2871
2872 assert_eq!(u_entry.len(), 48, "R6 U entry must be 48 bytes");
2874 }
2875
2876 #[test]
2877 fn test_r6_user_password_validation_correct() {
2878 let handler = StandardSecurityHandler::aes_256_r6();
2879 let password = UserPassword("r6_correct_password".to_string());
2880
2881 let u_entry = handler.compute_r6_user_hash(&password).unwrap();
2883
2884 let is_valid = handler
2886 .validate_r6_user_password(&password, &u_entry)
2887 .unwrap();
2888 assert!(is_valid, "Correct R6 password must validate");
2889 }
2890
2891 #[test]
2892 fn test_r6_user_password_validation_incorrect() {
2893 let handler = StandardSecurityHandler::aes_256_r6();
2894 let correct_password = UserPassword("r6_correct".to_string());
2895 let wrong_password = UserPassword("r6_wrong".to_string());
2896
2897 let u_entry = handler.compute_r6_user_hash(&correct_password).unwrap();
2899
2900 let is_valid = handler
2902 .validate_r6_user_password(&wrong_password, &u_entry)
2903 .unwrap();
2904 assert!(!is_valid, "Wrong R6 password must not validate");
2905 }
2906
2907 #[test]
2908 fn test_r6_uses_sha512_not_sha256() {
2909 let handler_r5 = StandardSecurityHandler::aes_256_r5();
2911 let handler_r6 = StandardSecurityHandler::aes_256_r6();
2912 let password = UserPassword("same_password_both_revisions".to_string());
2913
2914 let u_r5 = handler_r5.compute_r5_user_hash(&password).unwrap();
2915 let u_r6 = handler_r6.compute_r6_user_hash(&password).unwrap();
2916
2917 assert_ne!(
2920 &u_r5[..32],
2921 &u_r6[..32],
2922 "R5 (SHA-256) and R6 (SHA-512) must produce different hashes"
2923 );
2924 }
2925
2926 #[test]
2927 fn test_r6_unicode_password() {
2928 let handler = StandardSecurityHandler::aes_256_r6();
2929 let unicode_password = UserPassword("café🔒日本語".to_string());
2930
2931 let u_entry = handler.compute_r6_user_hash(&unicode_password).unwrap();
2932 assert_eq!(u_entry.len(), 48);
2933
2934 let is_valid = handler
2936 .validate_r6_user_password(&unicode_password, &u_entry)
2937 .unwrap();
2938 assert!(is_valid, "Unicode password must validate");
2939
2940 let different_unicode = UserPassword("café🔓日本語".to_string()); let is_valid = handler
2943 .validate_r6_user_password(&different_unicode, &u_entry)
2944 .unwrap();
2945 assert!(!is_valid, "Different Unicode password must not validate");
2946 }
2947
2948 #[test]
2951 fn test_r6_ue_entry_computation() {
2952 let handler = StandardSecurityHandler::aes_256_r6();
2953 let password = UserPassword("r6_ue_test".to_string());
2954 let encryption_key = EncryptionKey::new(vec![0xCD; 32]);
2955
2956 let u_entry = handler.compute_r6_user_hash(&password).unwrap();
2957 let ue_entry = handler
2958 .compute_r6_ue_entry(&password, &u_entry, &encryption_key)
2959 .unwrap();
2960
2961 assert_eq!(ue_entry.len(), 32, "R6 UE entry must be 32 bytes");
2962 }
2963
2964 #[test]
2965 fn test_r6_encryption_key_recovery() {
2966 let handler = StandardSecurityHandler::aes_256_r6();
2967 let password = UserPassword("r6_recovery_test".to_string());
2968 let original_key = EncryptionKey::new(vec![0xEF; 32]);
2969
2970 let u_entry = handler.compute_r6_user_hash(&password).unwrap();
2971 let ue_entry = handler
2972 .compute_r6_ue_entry(&password, &u_entry, &original_key)
2973 .unwrap();
2974
2975 let recovered_key = handler
2976 .recover_r6_encryption_key(&password, &u_entry, &ue_entry)
2977 .unwrap();
2978
2979 assert_eq!(
2980 recovered_key.as_bytes(),
2981 original_key.as_bytes(),
2982 "R6: Recovered key must match original"
2983 );
2984 }
2985
2986 #[test]
2989 fn test_r6_perms_entry_computation() {
2990 let handler = StandardSecurityHandler::aes_256_r6();
2991 let permissions = Permissions::all();
2992 let key = EncryptionKey::new(vec![0x42; 32]);
2993
2994 let perms = handler
2995 .compute_r6_perms_entry(permissions, &key, true)
2996 .unwrap();
2997
2998 assert_eq!(perms.len(), 16, "Perms entry must be 16 bytes");
2999 }
3000
3001 #[test]
3002 fn test_r6_perms_validation() {
3003 let handler = StandardSecurityHandler::aes_256_r6();
3004 let permissions = Permissions::new();
3005 let key = EncryptionKey::new(vec![0x55; 32]);
3006
3007 let perms = handler
3008 .compute_r6_perms_entry(permissions, &key, false)
3009 .unwrap();
3010
3011 let is_valid = handler
3012 .validate_r6_perms(&perms, &key, permissions)
3013 .unwrap();
3014 assert!(is_valid, "Perms validation must succeed with correct key");
3015 }
3016
3017 #[test]
3018 fn test_r6_perms_wrong_key_fails() {
3019 let handler = StandardSecurityHandler::aes_256_r6();
3020 let permissions = Permissions::all();
3021 let correct_key = EncryptionKey::new(vec![0xAA; 32]);
3022 let wrong_key = EncryptionKey::new(vec![0xBB; 32]);
3023
3024 let perms = handler
3025 .compute_r6_perms_entry(permissions, &correct_key, true)
3026 .unwrap();
3027
3028 let result = handler.validate_r6_perms(&perms, &wrong_key, permissions);
3030 assert!(result.is_ok()); assert!(!result.unwrap()); }
3033
3034 #[test]
3035 fn test_r6_perms_encrypt_metadata_flag() {
3036 let handler = StandardSecurityHandler::aes_256_r6();
3037 let permissions = Permissions::new();
3038 let key = EncryptionKey::new(vec![0x33; 32]);
3039
3040 let perms_true = handler
3041 .compute_r6_perms_entry(permissions, &key, true)
3042 .unwrap();
3043 let perms_false = handler
3044 .compute_r6_perms_entry(permissions, &key, false)
3045 .unwrap();
3046
3047 assert_ne!(
3049 perms_true, perms_false,
3050 "Different EncryptMetadata must produce different Perms"
3051 );
3052
3053 let flag_true = handler
3055 .extract_r6_encrypt_metadata(&perms_true, &key)
3056 .unwrap();
3057 assert_eq!(flag_true, Some(true));
3058
3059 let flag_false = handler
3060 .extract_r6_encrypt_metadata(&perms_false, &key)
3061 .unwrap();
3062 assert_eq!(flag_false, Some(false));
3063 }
3064
3065 #[test]
3066 fn test_r6_perms_invalid_length() {
3067 let handler = StandardSecurityHandler::aes_256_r6();
3068 let key = EncryptionKey::new(vec![0x44; 32]);
3069 let permissions = Permissions::new();
3070
3071 let invalid_perms = vec![0u8; 12]; let result = handler.validate_r6_perms(&invalid_perms, &key, permissions);
3073 assert!(result.is_err(), "Short Perms entry must fail");
3074 }
3075
3076 #[test]
3077 fn test_r6_full_workflow_with_perms() {
3078 let handler = StandardSecurityHandler::aes_256_r6();
3080 let password = UserPassword("r6_full_workflow".to_string());
3081 let permissions = Permissions::all();
3082 let encryption_key = EncryptionKey::new((0..32).map(|i| (i * 3) as u8).collect());
3083
3084 let u_entry = handler.compute_r6_user_hash(&password).unwrap();
3086 assert_eq!(u_entry.len(), 48);
3087
3088 assert!(handler
3090 .validate_r6_user_password(&password, &u_entry)
3091 .unwrap());
3092
3093 let ue_entry = handler
3095 .compute_r6_ue_entry(&password, &u_entry, &encryption_key)
3096 .unwrap();
3097 assert_eq!(ue_entry.len(), 32);
3098
3099 let perms = handler
3101 .compute_r6_perms_entry(permissions, &encryption_key, true)
3102 .unwrap();
3103 assert_eq!(perms.len(), 16);
3104
3105 let recovered_key = handler
3107 .recover_r6_encryption_key(&password, &u_entry, &ue_entry)
3108 .unwrap();
3109 assert_eq!(
3110 recovered_key.as_bytes(),
3111 encryption_key.as_bytes(),
3112 "Recovered key must match original"
3113 );
3114
3115 let perms_valid = handler
3117 .validate_r6_perms(&perms, &recovered_key, permissions)
3118 .unwrap();
3119 assert!(perms_valid, "Perms must validate with recovered key");
3120
3121 let encrypt_meta = handler
3123 .extract_r6_encrypt_metadata(&perms, &recovered_key)
3124 .unwrap();
3125 assert_eq!(encrypt_meta, Some(true), "EncryptMetadata must be true");
3126 }
3127
3128 #[test]
3131 fn test_r4_aes_object_key_is_16_bytes() {
3132 let handler = StandardSecurityHandler::aes_128_r4();
3133 let key = EncryptionKey::new(vec![0xAB; 16]);
3134 let obj_id = ObjectId::new(7, 0);
3135
3136 let obj_key = handler.compute_r4_aes_object_key(&key, &obj_id);
3137 assert_eq!(obj_key.len(), 16);
3138 }
3139
3140 #[test]
3141 fn test_r4_aes_object_key_includes_salt() {
3142 let handler_r4 = StandardSecurityHandler::aes_128_r4();
3144 let handler_rc4 = StandardSecurityHandler::rc4_128bit();
3145 let key = EncryptionKey::new(vec![0xCD; 16]);
3146 let obj_id = ObjectId::new(3, 0);
3147
3148 let aes_key = handler_r4.compute_r4_aes_object_key(&key, &obj_id);
3149 let rc4_key = handler_rc4.compute_object_key(&key, &obj_id);
3150
3151 assert_ne!(
3152 aes_key, rc4_key,
3153 "AES R4 key must differ from RC4 key due to sAlT"
3154 );
3155 }
3156
3157 #[test]
3158 fn test_r4_aes_object_key_deterministic() {
3159 let handler = StandardSecurityHandler::aes_128_r4();
3160 let key = EncryptionKey::new(vec![0x42; 16]);
3161 let obj_id = ObjectId::new(5, 2);
3162
3163 let key1 = handler.compute_r4_aes_object_key(&key, &obj_id);
3164 let key2 = handler.compute_r4_aes_object_key(&key, &obj_id);
3165 assert_eq!(key1, key2);
3166 }
3167
3168 #[test]
3169 fn test_r4_encrypt_decrypt_roundtrip() {
3170 let handler = StandardSecurityHandler::aes_128_r4();
3171 let key = EncryptionKey::new(vec![0x55; 16]);
3172 let obj_id = ObjectId::new(1, 0);
3173 let plaintext = b"Hello AES-128 R4 encryption!";
3174
3175 let encrypted = handler.encrypt_aes(plaintext, &key, &obj_id).unwrap();
3176 assert_ne!(&encrypted[16..], plaintext.as_slice()); assert!(encrypted.len() > 16); let decrypted = handler.decrypt_aes(&encrypted, &key, &obj_id).unwrap();
3180 assert_eq!(decrypted, plaintext);
3181 }
3182
3183 #[test]
3184 fn test_r4_encrypt_output_has_iv_prefix() {
3185 let handler = StandardSecurityHandler::aes_128_r4();
3186 let key = EncryptionKey::new(vec![0x77; 16]);
3187 let obj_id = ObjectId::new(2, 0);
3188 let data = b"test";
3189
3190 let encrypted = handler.encrypt_aes(data, &key, &obj_id).unwrap();
3191 assert!(encrypted.len() >= 32); assert_eq!((encrypted.len() - 16) % 16, 0);
3194 }
3195
3196 #[test]
3197 fn test_r4_decrypt_rejects_short_data() {
3198 let handler = StandardSecurityHandler::aes_128_r4();
3199 let key = EncryptionKey::new(vec![0x99; 16]);
3200 let obj_id = ObjectId::new(1, 0);
3201
3202 let short = vec![0u8; 10];
3203 assert!(handler.decrypt_aes(&short, &key, &obj_id).is_err());
3204 }
3205
3206 #[test]
3207 fn test_r4_inherent_encrypt_string_uses_aes() {
3208 let handler = StandardSecurityHandler::aes_128_r4();
3210 let key = EncryptionKey::new(vec![0x33; 16]);
3211 let obj_id = ObjectId::new(1, 0);
3212 let data = b"R4 string encryption";
3213
3214 let encrypted = handler.encrypt_string(data, &key, &obj_id);
3215 assert!(encrypted.len() >= 32);
3217
3218 let decrypted = handler.decrypt_string(&encrypted, &key, &obj_id);
3220 assert_eq!(decrypted, data);
3221 }
3222
3223 #[test]
3224 fn test_r4_inherent_stream_uses_aes() {
3225 let handler = StandardSecurityHandler::aes_128_r4();
3226 let key = EncryptionKey::new(vec![0x44; 16]);
3227 let obj_id = ObjectId::new(3, 0);
3228 let data = b"R4 stream content";
3229
3230 let encrypted = handler.encrypt_stream(data, &key, &obj_id);
3231 assert!(encrypted.len() >= 32);
3232
3233 let decrypted = handler.decrypt_stream(&encrypted, &key, &obj_id);
3234 assert_eq!(decrypted, data);
3235 }
3236}