From 306f49d66d21a4ac6efe3f05f10234700a543cd5 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sat, 12 Oct 2024 08:09:25 +1100 Subject: [PATCH 1/5] message/tests: check MessageType (de)serialization --- stun-types/src/message.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stun-types/src/message.rs b/stun-types/src/message.rs index 9cd0ab5..710b714 100644 --- a/stun-types/src/message.rs +++ b/stun-types/src/message.rs @@ -1841,6 +1841,9 @@ mod tests { let mtype = MessageType::from_class_method(c, m); assert_eq!(mtype.class(), c); assert_eq!(mtype.method(), m); + let bytes = mtype.to_bytes(); + let ptype = MessageType::from_bytes(&bytes).unwrap(); + assert_eq!(mtype, ptype); } } } From 5f84ef421ac2370c1f5c4a0bbb1d1d4301e52983 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sat, 12 Oct 2024 08:13:36 +1100 Subject: [PATCH 2/5] message/test: test for invalid MessageType value --- stun-types/src/message.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/stun-types/src/message.rs b/stun-types/src/message.rs index 710b714..7633939 100644 --- a/stun-types/src/message.rs +++ b/stun-types/src/message.rs @@ -1848,6 +1848,14 @@ mod tests { } } + #[test] + fn msg_type_not_stun() { + assert!(matches!( + MessageType::from_bytes(&[0xc0, 0x00]), + Err(StunParseError::NotStun) + )); + } + #[test] fn msg_roundtrip() { let _log = crate::tests::test_init_log(); From 0f7f11aa15e8597e5573badd86c7279d5a3c8be6 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sat, 12 Oct 2024 08:13:59 +1100 Subject: [PATCH 3/5] message/test: add test for writing into a short destination buffer --- stun-types/src/message.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/stun-types/src/message.rs b/stun-types/src/message.rs index 7633939..d54d781 100644 --- a/stun-types/src/message.rs +++ b/stun-types/src/message.rs @@ -1948,6 +1948,22 @@ mod tests { } } + #[test] + fn write_into_short_destination() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + let software = Software::new("s").unwrap(); + msg.add_attribute(&software).unwrap(); + let len = msg.byte_len(); + let mut dest = vec![0; len - 1]; + assert!( + matches!(msg.write_into(&mut dest), Err(StunWriteError::TooSmall { + expected, + actual, + }) if expected == len && actual == len - 1) + ); + } + #[test] fn add_duplicate_integrity() { let _log = crate::tests::test_init_log(); From 3885a30009284941ee4a017e9bc9497f379405c9 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sat, 12 Oct 2024 08:20:45 +1100 Subject: [PATCH 4/5] message/test: add checks for add_raw_attribute() Mimicking the add_attribute() tests --- stun-types/src/message.rs | 66 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/stun-types/src/message.rs b/stun-types/src/message.rs index d54d781..f60b050 100644 --- a/stun-types/src/message.rs +++ b/stun-types/src/message.rs @@ -2020,6 +2020,22 @@ mod tests { } } + #[test] + fn add_raw_attribute_after_integrity() { + let _log = crate::tests::test_init_log(); + for algorithm in [IntegrityAlgorithm::Sha1, IntegrityAlgorithm::Sha256] { + let credentials = ShortTermCredentials::new("secret".to_owned()).into(); + let mut msg = Message::builder_request(BINDING); + msg.add_message_integrity(&credentials, algorithm).unwrap(); + let software = Software::new("s").unwrap(); + let raw = software.to_raw(); + assert!(matches!( + msg.add_raw_attribute(raw), + Err(StunWriteError::MessageIntegrityExists) + )); + } + } + #[test] fn add_integrity_after_fingerprint() { let _log = crate::tests::test_init_log(); @@ -2159,6 +2175,19 @@ mod tests { )); } + #[test] + fn add_raw_attribute_after_fingerprint() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + msg.add_fingerprint().unwrap(); + let software = Software::new("s").unwrap(); + let raw = software.to_raw(); + assert!(matches!( + msg.add_raw_attribute(raw), + Err(StunWriteError::FingerprintExists) + )); + } + #[test] fn parse_truncated_message_header() { let _log = crate::tests::test_init_log(); @@ -2290,6 +2319,17 @@ mod tests { msg.add_attribute(&integrity).unwrap(); } + #[test] + #[should_panic(expected = "Use add_message_integrity() instead")] + fn builder_add_raw_attribute_integrity_panic() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + let hmac = [2; 20]; + let integrity = MessageIntegrity::new(hmac); + let raw = integrity.to_raw(); + msg.add_raw_attribute(raw).unwrap(); + } + #[test] #[should_panic(expected = "Use add_message_integrity() instead")] fn builder_add_attribute_integrity_sha256_panic() { @@ -2300,14 +2340,36 @@ mod tests { msg.add_attribute(&integrity).unwrap(); } + #[test] + #[should_panic(expected = "Use add_message_integrity() instead")] + fn builder_add_raw_attribute_integrity_sha256_panic() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + let hmac = [2; 16]; + let integrity = MessageIntegritySha256::new(&hmac).unwrap(); + let raw = integrity.to_raw(); + msg.add_raw_attribute(raw).unwrap(); + } + #[test] #[should_panic(expected = "Use add_fingerprint() instead")] fn builder_add_attribute_fingerprint_panic() { let _log = crate::tests::test_init_log(); let mut msg = Message::builder_request(BINDING); let fingerprint = [2; 4]; - let integrity = Fingerprint::new(fingerprint); - msg.add_attribute(&integrity).unwrap(); + let fingerprint = Fingerprint::new(fingerprint); + msg.add_attribute(&fingerprint).unwrap(); + } + + #[test] + #[should_panic(expected = "Use add_fingerprint() instead")] + fn builder_add_raw_attribute_fingerprint_panic() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + let fingerprint = [2; 4]; + let fingerprint = Fingerprint::new(fingerprint); + let raw = fingerprint.to_raw(); + msg.add_raw_attribute(raw).unwrap(); } #[test] From 4c8e863dfe43073490414a3a2975aa77d6968d30 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sat, 12 Oct 2024 08:26:02 +1100 Subject: [PATCH 5/5] message/test: add test for adding duplicate attributes --- stun-types/src/message.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/stun-types/src/message.rs b/stun-types/src/message.rs index f60b050..7d69362 100644 --- a/stun-types/src/message.rs +++ b/stun-types/src/message.rs @@ -2050,6 +2050,31 @@ mod tests { } } + #[test] + fn duplicate_add_attribute() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + let software = Software::new("s").unwrap(); + msg.add_attribute(&software).unwrap(); + assert!(matches!( + msg.add_attribute(&software), + Err(StunWriteError::AttributeExists(ty)) if ty == Software::TYPE + )); + } + + #[test] + fn duplicate_add_raw_attribute() { + let _log = crate::tests::test_init_log(); + let mut msg = Message::builder_request(BINDING); + let software = Software::new("s").unwrap(); + let raw = software.to_raw(); + msg.add_raw_attribute(raw.clone()).unwrap(); + assert!(matches!( + msg.add_raw_attribute(raw), + Err(StunWriteError::AttributeExists(ty)) if ty == Software::TYPE + )); + } + #[test] fn duplicate_fingerprint() { let _log = crate::tests::test_init_log();