1 use super::*; 2 use crate::agent::TransactionId; 3 use crate::attributes::ATTR_SOFTWARE; 4 use crate::fingerprint::FINGERPRINT; 5 use crate::textattrs::TextAttribute; 6 7 #[test] 8 fn test_message_integrity_add_to_simple() -> Result<()> { 9 let i = MessageIntegrity::new_long_term_integrity( 10 "user".to_owned(), 11 "realm".to_owned(), 12 "pass".to_owned(), 13 ); 14 let expected = vec![ 15 0x84, 0x93, 0xfb, 0xc5, 0x3b, 0xa5, 0x82, 0xfb, 0x4c, 0x04, 0x4c, 0x45, 0x6b, 0xdc, 0x40, 16 0xeb, 17 ]; 18 assert_eq!(expected, i.0, "{}", Error::ErrIntegrityMismatch); 19 20 //"Check" 21 { 22 let mut m = Message::new(); 23 m.write_header(); 24 i.add_to(&mut m)?; 25 let a = TextAttribute { 26 attr: ATTR_SOFTWARE, 27 text: "software".to_owned(), 28 }; 29 a.add_to(&mut m)?; 30 m.write_header(); 31 32 let mut d_m = Message::new(); 33 d_m.raw = m.raw.clone(); 34 d_m.decode()?; 35 i.check(&mut d_m)?; 36 37 d_m.raw[24] += 12; // HMAC now invalid 38 d_m.decode()?; 39 let result = i.check(&mut d_m); 40 assert!(result.is_err(), "should be invalid"); 41 } 42 43 Ok(()) 44 } 45 46 #[test] 47 fn test_message_integrity_with_fingerprint() -> Result<()> { 48 let mut m = Message::new(); 49 m.transaction_id = TransactionId([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0]); 50 m.write_header(); 51 let a = TextAttribute { 52 attr: ATTR_SOFTWARE, 53 text: "software".to_owned(), 54 }; 55 a.add_to(&mut m)?; 56 57 let i = MessageIntegrity::new_short_term_integrity("pwd".to_owned()); 58 assert_eq!(i.to_string(), "KEY: 0x[70, 77, 64]", "bad string {}", i); 59 let result = i.check(&mut m); 60 assert!(result.is_err(), "should error"); 61 62 i.add_to(&mut m)?; 63 FINGERPRINT.add_to(&mut m)?; 64 i.check(&mut m)?; 65 m.raw[24] = 33; 66 m.decode()?; 67 let result = i.check(&mut m); 68 assert!(result.is_err(), "mismatch expected"); 69 70 Ok(()) 71 } 72 73 #[test] 74 fn test_message_integrity() -> Result<()> { 75 let mut m = Message::new(); 76 let i = MessageIntegrity::new_short_term_integrity("password".to_owned()); 77 m.write_header(); 78 i.add_to(&mut m)?; 79 m.get(ATTR_MESSAGE_INTEGRITY)?; 80 Ok(()) 81 } 82 83 #[test] 84 fn test_message_integrity_before_fingerprint() -> Result<()> { 85 let mut m = Message::new(); 86 m.write_header(); 87 FINGERPRINT.add_to(&mut m)?; 88 let i = MessageIntegrity::new_short_term_integrity("password".to_owned()); 89 let result = i.add_to(&mut m); 90 assert!(result.is_err(), "should error"); 91 92 Ok(()) 93 } 94