@@ -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