Skip to content

Commit de2aa55

Browse files
authored
der: simplify SetOfVec sorting test (#2367)
1 parent cb02c0f commit de2aa55

1 file changed

Lines changed: 7 additions & 29 deletions

File tree

der/src/asn1/set_of.rs

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,12 +1021,12 @@ mod tests {
10211021
#[cfg(feature = "alloc")]
10221022
#[test]
10231023
fn der_sort_matches_reference_ordering() {
1024-
let mut state = 0x2319_u64;
1024+
let mut rng_state = 0x2319_u64;
10251025

10261026
// Randomized inputs of varied sizes. The narrow value range forces
10271027
// frequent duplicates so duplicate handling is exercised.
10281028
for &len in &[0usize, 1, 2, 5, 17, 64, 257, 1000] {
1029-
let original: Vec<u16> = (0..len).map(|_| lcg_next(&mut state) % 50).collect();
1029+
let original: Vec<u16> = (0..len).map(|_| lcg_next(&mut rng_state) % 50).collect();
10301030

10311031
let mut via_new = original.clone();
10321032
super::der_sort(&mut via_new).unwrap();
@@ -1067,41 +1067,19 @@ mod tests {
10671067
let n = 4000u16;
10681068
let elements: Vec<u16> = (0..n).rev().collect();
10691069

1070-
let mut body = Vec::new();
1071-
for v in &elements {
1072-
let mut buf = vec![0u8; v.encoded_len().unwrap().try_into().unwrap()];
1073-
let mut w = SliceWriter::new(&mut buf);
1074-
v.encode(&mut w).unwrap();
1075-
body.extend_from_slice(w.finish().unwrap());
1076-
}
1077-
1078-
// SET tag (0x31) + definite length + reverse-sorted body.
1079-
let mut der = Vec::new();
1080-
der.push(0x31);
1081-
let body_len = body.len();
1082-
if body_len < 0x80 {
1083-
// Guarded by `< 0x80`, so this always fits in a u8.
1084-
der.push(u8::try_from(body_len).expect("short form length < 0x80"));
1085-
} else {
1086-
let len_bytes = body_len.to_be_bytes();
1087-
let first = len_bytes.iter().position(|&b| b != 0).unwrap();
1088-
let trimmed = &len_bytes[first..];
1089-
// `trimmed.len()` is the count of significant length bytes (<= 8),
1090-
// so the conversion cannot truncate.
1091-
der.push(0x80 | u8::try_from(trimmed.len()).expect("length byte count <= 8"));
1092-
der.extend_from_slice(trimmed);
1093-
}
1094-
der.extend_from_slice(&body);
1070+
let mut encoded = elements.to_der().unwrap();
1071+
// Trick: change SEQUENCE tag 0x30 to SET 0x31
1072+
encoded[0] = 0x31;
10951073

10961074
// Decoder accepts the non-canonical input and sorts it at decode time.
1097-
let set = SetOfVec::<u16>::from_der(&der).unwrap();
1075+
let set = SetOfVec::<u16>::from_der(&encoded).unwrap();
10981076
assert_eq!(set.len(), n as usize);
10991077
assert!(set.iter().copied().eq(0..n));
11001078
assert_der_sorted(set.as_ref());
11011079

11021080
// Re-encoding yields canonical (sorted) DER, distinct from the input.
11031081
let reencoded = set.to_der().unwrap();
1104-
assert_ne!(reencoded, der, "expected canonicalization on re-encode");
1082+
assert_ne!(reencoded, encoded, "expected canonicalization on re-encode");
11051083
// And the canonical form round-trips unchanged.
11061084
let reparsed = SetOfVec::<u16>::from_der(&reencoded).unwrap();
11071085
assert!(reparsed.iter().copied().eq(0..n));

0 commit comments

Comments
 (0)