From b86ce0d064e5a450d5d7312f668aa284b2c5e460 Mon Sep 17 00:00:00 2001 From: dishmaker <141624503+dishmaker@users.noreply.github.com> Date: Sat, 10 May 2025 21:07:16 +0200 Subject: [PATCH 1/5] der: add test for `SetOf::value_cmp` --- der/src/asn1/set_of.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/der/src/asn1/set_of.rs b/der/src/asn1/set_of.rs index c3c1581b8..5b40290c4 100644 --- a/der/src/asn1/set_of.rs +++ b/der/src/asn1/set_of.rs @@ -478,7 +478,7 @@ mod tests { use super::SetOf; #[cfg(feature = "alloc")] use super::SetOfVec; - use crate::ErrorKind; + use crate::{DerOrd, ErrorKind}; #[test] fn setof_tryfrom_array() { @@ -494,6 +494,17 @@ mod tests { assert_eq!(err.kind(), ErrorKind::SetDuplicate); } + #[test] + fn setof_valueord() { + use core::cmp::Ordering; + + let arr1 = [3u16, 2, 1, 5, 0]; + let arr2 = [3u16, 2, 1, 4, 0]; + let set1 = SetOf::try_from(arr1).unwrap(); + let set2 = SetOf::try_from(arr2).unwrap(); + assert_eq!(set1.der_cmp(&set2), Ok(Ordering::Greater)); + } + #[cfg(feature = "alloc")] #[test] fn setofvec_tryfrom_array() { From 6252045eedfa7d598353f5793359c39b52749ebd Mon Sep 17 00:00:00 2001 From: dishmaker <141624503+dishmaker@users.noreply.github.com> Date: Mon, 12 May 2025 10:14:48 +0200 Subject: [PATCH 2/5] der: fix `Iterator::size_hint` --- der/src/asn1/bit_string.rs | 4 ++++ der/src/asn1/sequence_of.rs | 28 ++++++++++++++++++++++++++++ der/src/asn1/set_of.rs | 6 +++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/der/src/asn1/bit_string.rs b/der/src/asn1/bit_string.rs index 1104d2bf4..6ed17af17 100644 --- a/der/src/asn1/bit_string.rs +++ b/der/src/asn1/bit_string.rs @@ -472,6 +472,10 @@ impl Iterator for BitStringIter<'_> { self.position = self.position.checked_add(1)?; Some(byte & bit != 0) } + fn size_hint(&self) -> (usize, Option) { + let len = self.bit_string.bit_len().saturating_sub(self.position); + (len, Some(len)) + } } impl ExactSizeIterator for BitStringIter<'_> { diff --git a/der/src/asn1/sequence_of.rs b/der/src/asn1/sequence_of.rs index eeae99fef..d955abb1c 100644 --- a/der/src/asn1/sequence_of.rs +++ b/der/src/asn1/sequence_of.rs @@ -125,6 +125,9 @@ impl<'a, T> Iterator for SequenceOfIter<'a, T> { fn next(&mut self) -> Option<&'a T> { self.inner.next() } + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } } impl ExactSizeIterator for SequenceOfIter<'_, T> {} @@ -239,3 +242,28 @@ where iter_cmp(self.iter(), other.iter()) } } + +#[cfg(test)] +mod tests { + use crate::asn1::SequenceOf; + use crate::ord::DerOrd; + + #[test] + fn setof_valueord_value_cmp() { + use core::cmp::Ordering; + + let arr1 = { + let mut arr: SequenceOf = SequenceOf::new(); + arr.add(0u16).expect("element to be added"); + arr.add(2u16).expect("element to be added"); + arr + }; + let arr2 = { + let mut arr: SequenceOf = SequenceOf::new(); + arr.add(0u16).expect("element to be added"); + arr.add(1u16).expect("element to be added"); + arr + }; + assert_eq!(arr1.der_cmp(&arr2), Ok(Ordering::Greater)); + } +} diff --git a/der/src/asn1/set_of.rs b/der/src/asn1/set_of.rs index 5b40290c4..2eb07cff4 100644 --- a/der/src/asn1/set_of.rs +++ b/der/src/asn1/set_of.rs @@ -191,6 +191,10 @@ impl<'a, T> Iterator for SetOfIter<'a, T> { fn next(&mut self) -> Option<&'a T> { self.inner.next() } + + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } } impl ExactSizeIterator for SetOfIter<'_, T> {} @@ -495,7 +499,7 @@ mod tests { } #[test] - fn setof_valueord() { + fn setof_valueord_value_cmp() { use core::cmp::Ordering; let arr1 = [3u16, 2, 1, 5, 0]; From 30dcab454571594a4a8b5e7309e2827bbbe49abd Mon Sep 17 00:00:00 2001 From: dishmaker <141624503+dishmaker@users.noreply.github.com> Date: Mon, 12 May 2025 10:19:19 +0200 Subject: [PATCH 3/5] der: add test bitstring_valueord_value_cmp --- der/src/asn1/bit_string.rs | 11 +++++++++++ der/src/asn1/sequence_of.rs | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/der/src/asn1/bit_string.rs b/der/src/asn1/bit_string.rs index 6ed17af17..3432e6a65 100644 --- a/der/src/asn1/bit_string.rs +++ b/der/src/asn1/bit_string.rs @@ -573,6 +573,8 @@ where #[cfg(test)] #[allow(clippy::unwrap_used)] mod tests { + use core::cmp::Ordering; + use super::{BitStringRef, Result, Tag}; use crate::asn1::AnyRef; use hex_literal::hex; @@ -620,4 +622,13 @@ mod tests { Tag::BitString.value_error().kind() ) } + + #[test] + fn bitstring_valueord_value_cmp() { + use crate::ord::DerOrd; + + let bs1 = parse_bitstring(&hex!("00010204")).unwrap(); + let bs2 = parse_bitstring(&hex!("00010203")).unwrap(); + assert_eq!(bs1.der_cmp(&bs2), Ok(Ordering::Greater)); + } } diff --git a/der/src/asn1/sequence_of.rs b/der/src/asn1/sequence_of.rs index d955abb1c..fe9046967 100644 --- a/der/src/asn1/sequence_of.rs +++ b/der/src/asn1/sequence_of.rs @@ -249,7 +249,7 @@ mod tests { use crate::ord::DerOrd; #[test] - fn setof_valueord_value_cmp() { + fn sequenceof_valueord_value_cmp() { use core::cmp::Ordering; let arr1 = { From d39425a97692724f6c394ee86f0f13e452672704 Mon Sep 17 00:00:00 2001 From: Arthur Gautier Date: Mon, 12 May 2025 08:56:06 -0700 Subject: [PATCH 4/5] fixup style --- der/src/asn1/bit_string.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/der/src/asn1/bit_string.rs b/der/src/asn1/bit_string.rs index 3432e6a65..488229b96 100644 --- a/der/src/asn1/bit_string.rs +++ b/der/src/asn1/bit_string.rs @@ -472,6 +472,7 @@ impl Iterator for BitStringIter<'_> { self.position = self.position.checked_add(1)?; Some(byte & bit != 0) } + fn size_hint(&self) -> (usize, Option) { let len = self.bit_string.bit_len().saturating_sub(self.position); (len, Some(len)) From e7259d9fd09af089a968396ed30a845004490629 Mon Sep 17 00:00:00 2001 From: Arthur Gautier Date: Mon, 12 May 2025 08:56:38 -0700 Subject: [PATCH 5/5] fixup style --- der/src/asn1/sequence_of.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/der/src/asn1/sequence_of.rs b/der/src/asn1/sequence_of.rs index fe9046967..10eda349c 100644 --- a/der/src/asn1/sequence_of.rs +++ b/der/src/asn1/sequence_of.rs @@ -125,6 +125,7 @@ impl<'a, T> Iterator for SequenceOfIter<'a, T> { fn next(&mut self) -> Option<&'a T> { self.inner.next() } + fn size_hint(&self) -> (usize, Option) { self.inner.size_hint() }