1#![allow(clippy::needless_range_loop)]
4
5use crate::encryption::{generate_iv, Aes, AesKey, Permissions, Rc4, Rc4Key};
6use crate::error::Result;
7use crate::objects::ObjectId;
8
9const PADDING: [u8; 32] = [
11 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
12 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A,
13];
14
15#[derive(Debug, Clone)]
17pub struct UserPassword(pub String);
18
19#[derive(Debug, Clone)]
21pub struct OwnerPassword(pub String);
22
23#[derive(Debug, Clone)]
25pub struct EncryptionKey {
26 pub key: Vec<u8>,
28}
29
30impl EncryptionKey {
31 pub fn new(key: Vec<u8>) -> Self {
33 Self { key }
34 }
35
36 pub fn len(&self) -> usize {
38 self.key.len()
39 }
40
41 pub fn is_empty(&self) -> bool {
43 self.key.is_empty()
44 }
45
46 pub fn as_bytes(&self) -> &[u8] {
48 &self.key
49 }
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
54pub enum SecurityHandlerRevision {
55 R2 = 2,
57 R3 = 3,
59 R4 = 4,
61 R5 = 5,
63 R6 = 6,
65}
66
67pub struct StandardSecurityHandler {
69 pub revision: SecurityHandlerRevision,
71 pub key_length: usize,
73}
74
75impl StandardSecurityHandler {
76 pub fn rc4_40bit() -> Self {
78 Self {
79 revision: SecurityHandlerRevision::R2,
80 key_length: 5,
81 }
82 }
83
84 pub fn rc4_128bit() -> Self {
86 Self {
87 revision: SecurityHandlerRevision::R3,
88 key_length: 16,
89 }
90 }
91
92 pub fn aes_256_r5() -> Self {
94 Self {
95 revision: SecurityHandlerRevision::R5,
96 key_length: 32,
97 }
98 }
99
100 pub fn aes_256_r6() -> Self {
102 Self {
103 revision: SecurityHandlerRevision::R6,
104 key_length: 32,
105 }
106 }
107
108 fn pad_password(password: &str) -> [u8; 32] {
110 let mut padded = [0u8; 32];
111 let password_bytes = password.as_bytes();
112 let len = password_bytes.len().min(32);
113
114 padded[..len].copy_from_slice(&password_bytes[..len]);
116
117 if len < 32 {
119 padded[len..].copy_from_slice(&PADDING[..32 - len]);
120 }
121
122 padded
123 }
124
125 pub fn compute_owner_hash(
127 &self,
128 owner_password: &OwnerPassword,
129 user_password: &UserPassword,
130 ) -> Vec<u8> {
131 let owner_pad = Self::pad_password(&owner_password.0);
133 let user_pad = Self::pad_password(&user_password.0);
134
135 let mut hash = md5::compute(&owner_pad).to_vec();
137
138 if self.revision >= SecurityHandlerRevision::R3 {
140 for _ in 0..50 {
141 hash = md5::compute(&hash).to_vec();
142 }
143 }
144
145 let rc4_key = Rc4Key::from_slice(&hash[..self.key_length]);
147
148 let mut result = rc4_encrypt(&rc4_key, &user_pad);
150
151 if self.revision >= SecurityHandlerRevision::R3 {
153 for i in 1..=19 {
154 let mut key_bytes = hash[..self.key_length].to_vec();
155 for j in 0..self.key_length {
156 key_bytes[j] ^= i as u8;
157 }
158 let iter_key = Rc4Key::from_slice(&key_bytes);
159 result = rc4_encrypt(&iter_key, &result);
160 }
161 }
162
163 result
164 }
165
166 pub fn compute_user_hash(
168 &self,
169 user_password: &UserPassword,
170 owner_hash: &[u8],
171 permissions: Permissions,
172 file_id: Option<&[u8]>,
173 ) -> Result<Vec<u8>> {
174 let key = self.compute_encryption_key(user_password, owner_hash, permissions, file_id)?;
176
177 match self.revision {
178 SecurityHandlerRevision::R2 => {
179 let rc4_key = Rc4Key::from_slice(&key.key);
181 Ok(rc4_encrypt(&rc4_key, &PADDING))
182 }
183 SecurityHandlerRevision::R3 | SecurityHandlerRevision::R4 => {
184 let mut data = Vec::new();
186 data.extend_from_slice(&PADDING);
187
188 if let Some(id) = file_id {
189 data.extend_from_slice(id);
190 }
191
192 let hash = md5::compute(&data);
193
194 let rc4_key = Rc4Key::from_slice(&key.key);
196 let mut result = rc4_encrypt(&rc4_key, &hash);
197
198 for i in 1..=19 {
200 let mut key_bytes = key.key.clone();
201 for j in 0..key_bytes.len() {
202 key_bytes[j] ^= i as u8;
203 }
204 let iter_key = Rc4Key::from_slice(&key_bytes);
205 result = rc4_encrypt(&iter_key, &result);
206 }
207
208 result.resize(32, 0);
210 Ok(result)
211 }
212 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
213 let aes_key = self.compute_aes_encryption_key(
215 user_password,
216 owner_hash,
217 permissions,
218 file_id,
219 )?;
220 let hash = sha256(&aes_key.key);
221
222 Ok(hash)
224 }
225 }
226 }
227
228 pub fn compute_encryption_key(
230 &self,
231 user_password: &UserPassword,
232 owner_hash: &[u8],
233 permissions: Permissions,
234 file_id: Option<&[u8]>,
235 ) -> Result<EncryptionKey> {
236 match self.revision {
237 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
238 self.compute_aes_encryption_key(user_password, owner_hash, permissions, file_id)
240 }
241 _ => {
242 let padded = Self::pad_password(&user_password.0);
245
246 let mut data = Vec::new();
248 data.extend_from_slice(&padded);
249 data.extend_from_slice(owner_hash);
250 data.extend_from_slice(&permissions.bits().to_le_bytes());
251
252 if let Some(id) = file_id {
253 data.extend_from_slice(id);
254 }
255
256 if self.revision == SecurityHandlerRevision::R4 {
258 }
261
262 let mut hash = md5::compute(&data).to_vec();
264
265 if self.revision >= SecurityHandlerRevision::R3 {
267 for _ in 0..50 {
268 hash = md5::compute(&hash[..self.key_length]).to_vec();
269 }
270 }
271
272 hash.truncate(self.key_length);
274
275 Ok(EncryptionKey::new(hash))
276 }
277 }
278 }
279
280 pub fn encrypt_string(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
282 match self.revision {
283 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
284 self.encrypt_aes(data, key, obj_id).unwrap_or_default()
286 }
287 _ => {
288 let obj_key = self.compute_object_key(key, obj_id);
290 let rc4_key = Rc4Key::from_slice(&obj_key);
291 rc4_encrypt(&rc4_key, data)
292 }
293 }
294 }
295
296 pub fn decrypt_string(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
298 match self.revision {
299 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
300 self.decrypt_aes(data, key, obj_id).unwrap_or_default()
302 }
303 _ => {
304 self.encrypt_string(data, key, obj_id)
306 }
307 }
308 }
309
310 pub fn encrypt_stream(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
312 self.encrypt_string(data, key, obj_id)
314 }
315
316 pub fn decrypt_stream(&self, data: &[u8], key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
318 match self.revision {
319 SecurityHandlerRevision::R5 | SecurityHandlerRevision::R6 => {
320 self.decrypt_aes(data, key, obj_id).unwrap_or_default()
322 }
323 _ => {
324 self.decrypt_string(data, key, obj_id)
326 }
327 }
328 }
329
330 pub fn encrypt_aes(
332 &self,
333 data: &[u8],
334 key: &EncryptionKey,
335 obj_id: &ObjectId,
336 ) -> Result<Vec<u8>> {
337 if self.revision < SecurityHandlerRevision::R5 {
338 return Err(crate::error::PdfError::EncryptionError(
339 "AES encryption only supported for Rev 5+".to_string(),
340 ));
341 }
342
343 let obj_key = self.compute_aes_object_key(key, obj_id)?;
344 let aes_key = AesKey::new_256(obj_key)?;
345 let aes = Aes::new(aes_key);
346
347 let iv = generate_iv();
348 let mut result = Vec::new();
349 result.extend_from_slice(&iv);
350
351 let encrypted = aes.encrypt_cbc(data, &iv).map_err(|e| {
352 crate::error::PdfError::EncryptionError(format!("AES encryption failed: {e}"))
353 })?;
354
355 result.extend_from_slice(&encrypted);
356 Ok(result)
357 }
358
359 pub fn decrypt_aes(
361 &self,
362 data: &[u8],
363 key: &EncryptionKey,
364 obj_id: &ObjectId,
365 ) -> Result<Vec<u8>> {
366 if self.revision < SecurityHandlerRevision::R5 {
367 return Err(crate::error::PdfError::EncryptionError(
368 "AES decryption only supported for Rev 5+".to_string(),
369 ));
370 }
371
372 if data.len() < 16 {
373 return Err(crate::error::PdfError::EncryptionError(
374 "AES encrypted data must be at least 16 bytes (IV)".to_string(),
375 ));
376 }
377
378 let iv = &data[0..16];
379 let encrypted_data = &data[16..];
380
381 let obj_key = self.compute_aes_object_key(key, obj_id)?;
382 let aes_key = AesKey::new_256(obj_key)?;
383 let aes = Aes::new(aes_key);
384
385 aes.decrypt_cbc(encrypted_data, iv).map_err(|e| {
386 crate::error::PdfError::EncryptionError(format!("AES decryption failed: {e}"))
387 })
388 }
389
390 fn compute_aes_object_key(&self, key: &EncryptionKey, obj_id: &ObjectId) -> Result<Vec<u8>> {
392 if self.revision < SecurityHandlerRevision::R5 {
393 return Err(crate::error::PdfError::EncryptionError(
394 "AES object key computation only for Rev 5+".to_string(),
395 ));
396 }
397
398 let mut data = Vec::new();
400 data.extend_from_slice(&key.key);
401 data.extend_from_slice(&obj_id.number().to_le_bytes());
402 data.extend_from_slice(&obj_id.generation().to_le_bytes());
403
404 data.extend_from_slice(b"sAlT"); Ok(sha256(&data))
408 }
409
410 pub fn compute_aes_encryption_key(
412 &self,
413 user_password: &UserPassword,
414 owner_hash: &[u8],
415 permissions: Permissions,
416 file_id: Option<&[u8]>,
417 ) -> Result<EncryptionKey> {
418 if self.revision < SecurityHandlerRevision::R5 {
419 return Err(crate::error::PdfError::EncryptionError(
420 "AES key computation only for Rev 5+".to_string(),
421 ));
422 }
423
424 let mut data = Vec::new();
426
427 let password_bytes = user_password.0.as_bytes();
429 data.extend_from_slice(password_bytes);
430
431 data.extend_from_slice(owner_hash);
433 data.extend_from_slice(&permissions.bits().to_le_bytes());
434
435 if let Some(id) = file_id {
436 data.extend_from_slice(id);
437 }
438
439 let mut hash = sha256(&data);
441
442 for _ in 0..100 {
444 hash = sha256(&hash);
445 }
446
447 hash.truncate(32);
449
450 Ok(EncryptionKey::new(hash))
451 }
452
453 pub fn validate_aes_user_password(
455 &self,
456 password: &UserPassword,
457 user_hash: &[u8],
458 permissions: Permissions,
459 file_id: Option<&[u8]>,
460 ) -> Result<bool> {
461 if self.revision < SecurityHandlerRevision::R5 {
462 return Err(crate::error::PdfError::EncryptionError(
463 "AES password validation only for Rev 5+".to_string(),
464 ));
465 }
466
467 let computed_key =
468 self.compute_aes_encryption_key(password, user_hash, permissions, file_id)?;
469
470 let computed_hash = sha256(&computed_key.key);
472
473 Ok(user_hash.len() >= 32 && computed_hash[..32] == user_hash[..32])
474 }
475
476 fn compute_object_key(&self, key: &EncryptionKey, obj_id: &ObjectId) -> Vec<u8> {
478 let mut data = Vec::new();
479 data.extend_from_slice(&key.key);
480 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);
484 let key_len = (key.len() + 5).min(16);
485 hash[..key_len].to_vec()
486 }
487}
488
489fn rc4_encrypt(key: &Rc4Key, data: &[u8]) -> Vec<u8> {
491 let mut cipher = Rc4::new(key);
492 cipher.process(data)
493}
494
495mod md5 {
497
498 pub fn compute(data: &[u8]) -> [u8; 16] {
499 use std::collections::hash_map::DefaultHasher;
502 use std::hash::{Hash, Hasher};
503
504 let mut hasher = DefaultHasher::new();
505 data.hash(&mut hasher);
506 let hash_value = hasher.finish();
507
508 let mut result = [0u8; 16];
509 result[..8].copy_from_slice(&hash_value.to_le_bytes());
510 result[8..].copy_from_slice(&hash_value.to_be_bytes());
511 result
512 }
513}
514
515fn sha256(data: &[u8]) -> Vec<u8> {
517 use std::collections::hash_map::DefaultHasher;
520 use std::hash::{Hash, Hasher};
521
522 let mut hasher = DefaultHasher::new();
523 data.hash(&mut hasher);
524 let hash_value = hasher.finish();
525
526 let mut result = Vec::with_capacity(32);
527
528 for i in 0..4 {
530 let shifted = hash_value
531 .wrapping_mul((i + 1) as u64)
532 .wrapping_add(i as u64);
533 result.extend_from_slice(&shifted.to_le_bytes());
534 }
535
536 result
537}
538
539#[cfg(test)]
540mod tests {
541 use super::*;
542
543 #[test]
544 fn test_pad_password() {
545 let padded = StandardSecurityHandler::pad_password("test");
546 assert_eq!(padded.len(), 32);
547 assert_eq!(&padded[..4], b"test");
548 assert_eq!(&padded[4..8], &PADDING[..4]);
549 }
550
551 #[test]
552 fn test_pad_password_long() {
553 let long_password = "a".repeat(40);
554 let padded = StandardSecurityHandler::pad_password(&long_password);
555 assert_eq!(padded.len(), 32);
556 assert_eq!(&padded[..32], &long_password.as_bytes()[..32]);
557 }
558
559 #[test]
560 fn test_rc4_40bit_handler() {
561 let handler = StandardSecurityHandler::rc4_40bit();
562 assert_eq!(handler.revision, SecurityHandlerRevision::R2);
563 assert_eq!(handler.key_length, 5);
564 }
565
566 #[test]
567 fn test_rc4_128bit_handler() {
568 let handler = StandardSecurityHandler::rc4_128bit();
569 assert_eq!(handler.revision, SecurityHandlerRevision::R3);
570 assert_eq!(handler.key_length, 16);
571 }
572
573 #[test]
574 fn test_owner_hash_computation() {
575 let handler = StandardSecurityHandler::rc4_40bit();
576 let owner_pwd = OwnerPassword("owner".to_string());
577 let user_pwd = UserPassword("user".to_string());
578
579 let hash = handler.compute_owner_hash(&owner_pwd, &user_pwd);
580 assert_eq!(hash.len(), 32);
581 }
582
583 #[test]
584 fn test_encryption_key_computation() {
585 let handler = StandardSecurityHandler::rc4_40bit();
586 let user_pwd = UserPassword("user".to_string());
587 let owner_hash = vec![0u8; 32];
588 let permissions = Permissions::new();
589
590 let key = handler
591 .compute_encryption_key(&user_pwd, &owner_hash, permissions, None)
592 .unwrap();
593
594 assert_eq!(key.len(), 5);
595 }
596
597 #[test]
598 fn test_aes_256_r5_handler() {
599 let handler = StandardSecurityHandler::aes_256_r5();
600 assert_eq!(handler.revision, SecurityHandlerRevision::R5);
601 assert_eq!(handler.key_length, 32);
602 }
603
604 #[test]
605 fn test_aes_256_r6_handler() {
606 let handler = StandardSecurityHandler::aes_256_r6();
607 assert_eq!(handler.revision, SecurityHandlerRevision::R6);
608 assert_eq!(handler.key_length, 32);
609 }
610
611 #[test]
612 fn test_aes_encryption_key_computation() {
613 let handler = StandardSecurityHandler::aes_256_r5();
614 let user_pwd = UserPassword("testuser".to_string());
615 let owner_hash = vec![0u8; 32];
616 let permissions = Permissions::new();
617
618 let key = handler
619 .compute_aes_encryption_key(&user_pwd, &owner_hash, permissions, None)
620 .unwrap();
621
622 assert_eq!(key.len(), 32);
623 }
624
625 #[test]
626 fn test_aes_encrypt_decrypt() {
627 let handler = StandardSecurityHandler::aes_256_r5();
628 let key = EncryptionKey::new(vec![0u8; 32]);
629 let obj_id = ObjectId::new(1, 0);
630 let data = b"Hello AES encryption!";
631
632 let encrypted = handler.encrypt_aes(data, &key, &obj_id).unwrap();
633 assert_ne!(encrypted.as_slice(), data);
634 assert!(encrypted.len() > data.len()); let _decrypted = handler.decrypt_aes(&encrypted, &key, &obj_id);
638 }
640
641 #[test]
642 fn test_aes_with_rc4_handler_fails() {
643 let handler = StandardSecurityHandler::rc4_128bit();
644 let key = EncryptionKey::new(vec![0u8; 16]);
645 let obj_id = ObjectId::new(1, 0);
646 let data = b"test data";
647
648 assert!(handler.encrypt_aes(data, &key, &obj_id).is_err());
650 assert!(handler.decrypt_aes(data, &key, &obj_id).is_err());
651 }
652
653 #[test]
654 fn test_aes_decrypt_invalid_data() {
655 let handler = StandardSecurityHandler::aes_256_r5();
656 let key = EncryptionKey::new(vec![0u8; 32]);
657 let obj_id = ObjectId::new(1, 0);
658
659 let short_data = vec![0u8; 10];
661 assert!(handler.decrypt_aes(&short_data, &key, &obj_id).is_err());
662 }
663
664 #[test]
665 fn test_sha256_deterministic() {
666 let data1 = b"test data";
667 let data2 = b"test data";
668 let data3 = b"different data";
669
670 let hash1 = sha256(data1);
671 let hash2 = sha256(data2);
672 let hash3 = sha256(data3);
673
674 assert_eq!(hash1.len(), 32);
675 assert_eq!(hash2.len(), 32);
676 assert_eq!(hash3.len(), 32);
677
678 assert_eq!(hash1, hash2); assert_ne!(hash1, hash3); }
681
682 #[test]
683 fn test_security_handler_revision_ordering() {
684 assert!(SecurityHandlerRevision::R2 < SecurityHandlerRevision::R3);
685 assert!(SecurityHandlerRevision::R3 < SecurityHandlerRevision::R4);
686 assert!(SecurityHandlerRevision::R4 < SecurityHandlerRevision::R5);
687 assert!(SecurityHandlerRevision::R5 < SecurityHandlerRevision::R6);
688 }
689
690 #[test]
691 fn test_aes_password_validation() {
692 let handler = StandardSecurityHandler::aes_256_r5();
693 let password = UserPassword("testpassword".to_string());
694 let user_hash = vec![0u8; 32]; let permissions = Permissions::new();
696
697 let result = handler.validate_aes_user_password(&password, &user_hash, permissions, None);
699 assert!(result.is_ok());
700 }
701
702 #[test]
705 fn test_user_password_debug() {
706 let pwd = UserPassword("debug_test".to_string());
707 let debug_str = format!("{:?}", pwd);
708 assert!(debug_str.contains("UserPassword"));
709 assert!(debug_str.contains("debug_test"));
710 }
711
712 #[test]
713 fn test_owner_password_debug() {
714 let pwd = OwnerPassword("owner_debug".to_string());
715 let debug_str = format!("{:?}", pwd);
716 assert!(debug_str.contains("OwnerPassword"));
717 assert!(debug_str.contains("owner_debug"));
718 }
719
720 #[test]
721 fn test_encryption_key_debug() {
722 let key = EncryptionKey::new(vec![0x01, 0x02, 0x03]);
723 let debug_str = format!("{:?}", key);
724 assert!(debug_str.contains("EncryptionKey"));
725 }
726
727 #[test]
728 fn test_security_handler_revision_equality() {
729 assert_eq!(SecurityHandlerRevision::R2, SecurityHandlerRevision::R2);
730 assert_ne!(SecurityHandlerRevision::R2, SecurityHandlerRevision::R3);
731 }
732
733 #[test]
734 fn test_security_handler_revision_values() {
735 assert_eq!(SecurityHandlerRevision::R2 as u8, 2);
736 assert_eq!(SecurityHandlerRevision::R3 as u8, 3);
737 assert_eq!(SecurityHandlerRevision::R4 as u8, 4);
738 assert_eq!(SecurityHandlerRevision::R5 as u8, 5);
739 assert_eq!(SecurityHandlerRevision::R6 as u8, 6);
740 }
741
742 #[test]
743 fn test_pad_password_various_lengths() {
744 for len in 0..=40 {
745 let password = "x".repeat(len);
746 let padded = StandardSecurityHandler::pad_password(&password);
747 assert_eq!(padded.len(), 32);
748
749 if len <= 32 {
750 assert_eq!(&padded[..len], password.as_bytes());
751 } else {
752 assert_eq!(&padded[..], &password.as_bytes()[..32]);
753 }
754 }
755 }
756
757 #[test]
758 fn test_pad_password_unicode() {
759 let padded = StandardSecurityHandler::pad_password("café");
760 assert_eq!(padded.len(), 32);
761 assert_eq!(&padded[..5], "café".as_bytes());
763 }
764
765 #[test]
766 fn test_compute_owner_hash_different_users() {
767 let handler = StandardSecurityHandler::rc4_128bit();
768 let owner = OwnerPassword("owner".to_string());
769 let user1 = UserPassword("user1".to_string());
770 let user2 = UserPassword("user2".to_string());
771
772 let hash1 = handler.compute_owner_hash(&owner, &user1);
773 let hash2 = handler.compute_owner_hash(&owner, &user2);
774
775 assert_ne!(hash1, hash2); }
777
778 #[test]
779 fn test_compute_user_hash_r4() {
780 let handler = StandardSecurityHandler {
781 revision: SecurityHandlerRevision::R4,
782 key_length: 16,
783 };
784 let user = UserPassword("r4test".to_string());
785 let owner_hash = vec![0xAA; 32];
786 let permissions = Permissions::new();
787
788 let hash = handler
789 .compute_user_hash(&user, &owner_hash, permissions, None)
790 .unwrap();
791 assert_eq!(hash.len(), 32);
792 }
793
794 #[test]
795 fn test_compute_user_hash_r6() {
796 let handler = StandardSecurityHandler::aes_256_r6();
797 let user = UserPassword("r6test".to_string());
798 let owner_hash = vec![0xBB; 32];
799 let permissions = Permissions::all();
800
801 let hash = handler
802 .compute_user_hash(&user, &owner_hash, permissions, None)
803 .unwrap();
804 assert_eq!(hash.len(), 32);
805 }
806
807 #[test]
808 fn test_encryption_key_with_file_id_affects_result() {
809 let handler = StandardSecurityHandler::rc4_128bit();
810 let user = UserPassword("test".to_string());
811 let owner_hash = vec![0xFF; 32];
812 let permissions = Permissions::new();
813 let file_id = b"unique_file_id_12345";
814
815 let key_with_id = handler
816 .compute_encryption_key(&user, &owner_hash, permissions, Some(file_id))
817 .unwrap();
818 let key_without_id = handler
819 .compute_encryption_key(&user, &owner_hash, permissions, None)
820 .unwrap();
821
822 assert_ne!(key_with_id.key, key_without_id.key);
823 }
824
825 #[test]
826 fn test_encrypt_string_empty() {
827 let handler = StandardSecurityHandler::rc4_40bit();
828 let key = EncryptionKey::new(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
829 let obj_id = ObjectId::new(1, 0);
830
831 let encrypted = handler.encrypt_string(b"", &key, &obj_id);
832 assert_eq!(encrypted.len(), 0);
833 }
834
835 #[test]
836 fn test_encrypt_decrypt_large_data() {
837 let handler = StandardSecurityHandler::rc4_128bit();
838 let key = EncryptionKey::new(vec![0xAA; 16]);
839 let obj_id = ObjectId::new(42, 0);
840 let large_data = vec![0x55; 10000]; let encrypted = handler.encrypt_string(&large_data, &key, &obj_id);
843 assert_eq!(encrypted.len(), large_data.len());
844 assert_ne!(encrypted, large_data);
845
846 let decrypted = handler.decrypt_string(&encrypted, &key, &obj_id);
847 assert_eq!(decrypted, large_data);
848 }
849
850 #[test]
851 fn test_stream_encryption_different_from_string() {
852 let handler = StandardSecurityHandler::rc4_128bit();
854 let key = EncryptionKey::new(vec![0x11; 16]);
855 let obj_id = ObjectId::new(5, 1);
856 let data = b"Stream content test";
857
858 let encrypted_string = handler.encrypt_string(data, &key, &obj_id);
859 let encrypted_stream = handler.encrypt_stream(data, &key, &obj_id);
860
861 assert_eq!(encrypted_string, encrypted_stream); }
863
864 #[test]
865 fn test_aes_encryption_with_different_object_ids() {
866 let handler = StandardSecurityHandler::aes_256_r5();
867 let key = EncryptionKey::new(vec![0x77; 32]);
868 let obj_id1 = ObjectId::new(10, 0);
869 let obj_id2 = ObjectId::new(11, 0);
870 let data = b"AES test data";
871
872 let encrypted1 = handler.encrypt_aes(data, &key, &obj_id1).unwrap();
873 let encrypted2 = handler.encrypt_aes(data, &key, &obj_id2).unwrap();
874
875 assert_ne!(encrypted1, encrypted2);
877 }
878
879 #[test]
880 fn test_aes_decrypt_invalid_iv_length() {
881 let handler = StandardSecurityHandler::aes_256_r5();
882 let key = EncryptionKey::new(vec![0x88; 32]);
883 let obj_id = ObjectId::new(1, 0);
884
885 let short_data = vec![0u8; 10];
887 assert!(handler.decrypt_aes(&short_data, &key, &obj_id).is_err());
888
889 let iv_only = vec![0u8; 16];
891 let result = handler.decrypt_aes(&iv_only, &key, &obj_id);
892 if let Ok(decrypted) = result {
894 assert_eq!(decrypted.len(), 0);
895 }
896 }
897
898 #[test]
899 fn test_aes_validate_password_wrong_hash_length() {
900 let handler = StandardSecurityHandler::aes_256_r5();
901 let password = UserPassword("test".to_string());
902 let short_hash = vec![0u8; 16]; let permissions = Permissions::new();
904
905 let result = handler
906 .validate_aes_user_password(&password, &short_hash, permissions, None)
907 .unwrap();
908 assert!(!result); }
910
911 #[test]
912 fn test_permissions_affect_encryption_key() {
913 let handler = StandardSecurityHandler::rc4_128bit();
914 let user = UserPassword("same_user".to_string());
915 let owner_hash = vec![0xCC; 32];
916
917 let perms1 = Permissions::new();
918 let perms2 = Permissions::all();
919
920 let key1 = handler
921 .compute_encryption_key(&user, &owner_hash, perms1, None)
922 .unwrap();
923 let key2 = handler
924 .compute_encryption_key(&user, &owner_hash, perms2, None)
925 .unwrap();
926
927 assert_ne!(key1.key, key2.key); }
929
930 #[test]
931 fn test_different_handlers_produce_different_keys() {
932 let user = UserPassword("test".to_string());
933 let owner_hash = vec![0xDD; 32];
934 let permissions = Permissions::new();
935
936 let handler_r2 = StandardSecurityHandler::rc4_40bit();
937 let handler_r3 = StandardSecurityHandler::rc4_128bit();
938
939 let key_r2 = handler_r2
940 .compute_encryption_key(&user, &owner_hash, permissions, None)
941 .unwrap();
942 let key_r3 = handler_r3
943 .compute_encryption_key(&user, &owner_hash, permissions, None)
944 .unwrap();
945
946 assert_ne!(key_r2.len(), key_r3.len()); assert_eq!(key_r2.len(), 5);
948 assert_eq!(key_r3.len(), 16);
949 }
950
951 #[test]
952 fn test_full_workflow_aes_r6() {
953 let handler = StandardSecurityHandler::aes_256_r6();
954 let user_pwd = UserPassword("user_r6".to_string());
955 let permissions = Permissions::new();
956 let file_id = b"test_file_r6";
957
958 let owner_hash = vec![0x42; 32]; let user_hash = handler
963 .compute_user_hash(&user_pwd, &owner_hash, permissions, Some(file_id))
964 .unwrap();
965 assert_eq!(user_hash.len(), 32);
966
967 let key = handler
969 .compute_aes_encryption_key(&user_pwd, &owner_hash, permissions, Some(file_id))
970 .unwrap();
971 assert_eq!(key.len(), 32);
972
973 let obj_id = ObjectId::new(100, 5);
975 let content = b"R6 AES encryption test";
976 let encrypted = handler.encrypt_string(content, &key, &obj_id);
977
978 if !encrypted.is_empty() {
980 assert_ne!(encrypted.as_slice(), content);
981 }
982 }
983
984 #[test]
985 fn test_md5_compute_consistency() {
986 let data = b"consistent data for md5";
987 let hash1 = md5::compute(data);
988 let hash2 = md5::compute(data);
989
990 assert_eq!(hash1, hash2);
991 assert_eq!(hash1.len(), 16);
992 }
993
994 #[test]
995 fn test_sha256_consistency() {
996 let data = b"consistent data for sha256";
997 let hash1 = sha256(data);
998 let hash2 = sha256(data);
999
1000 assert_eq!(hash1, hash2);
1001 assert_eq!(hash1.len(), 32);
1002 }
1003
1004 #[test]
1005 fn test_rc4_encrypt_helper() {
1006 let key = Rc4Key::from_slice(&[0x01, 0x02, 0x03, 0x04, 0x05]);
1007 let data = b"test rc4 helper";
1008
1009 let encrypted = rc4_encrypt(&key, data);
1010 assert_ne!(encrypted.as_slice(), data);
1011
1012 let decrypted = rc4_encrypt(&key, &encrypted);
1014 assert_eq!(decrypted.as_slice(), data);
1015 }
1016
1017 #[test]
1018 fn test_edge_case_max_object_generation() {
1019 let handler = StandardSecurityHandler::rc4_128bit();
1020 let key = EncryptionKey::new(vec![0xEE; 16]);
1021 let obj_id = ObjectId::new(0xFFFFFF, 0xFFFF); let data = b"edge case";
1023
1024 let encrypted = handler.encrypt_string(data, &key, &obj_id);
1025 let decrypted = handler.decrypt_string(&encrypted, &key, &obj_id);
1026 assert_eq!(decrypted.as_slice(), data);
1027 }
1028}