5454 }
5555}
5656
57+ fn assert_standard_family_decode_error_surface_matches_scalar < A , const PAD : bool > ( input : & [ u8 ] )
58+ where
59+ A : Alphabet ,
60+ {
61+ let engine = Engine :: < A , PAD > :: new ( ) ;
62+ let mut slice_output = [ 0x55 ; 512 ] ;
63+ let mut clear_tail_output = [ 0xaa ; 512 ] ;
64+ let mut scalar_output = [ 0xcc ; 512 ] ;
65+
66+ let scalar_err = scalar:: scalar_reference_decode_slice :: < A , PAD > ( input, & mut scalar_output)
67+ . expect_err ( "malformed fixture must fail through the scalar reference" ) ;
68+ let slice_err = engine
69+ . decode_slice ( input, & mut slice_output)
70+ . expect_err ( "malformed fixture must fail through decode_slice" ) ;
71+ let clear_tail_err = engine
72+ . decode_slice_clear_tail ( input, & mut clear_tail_output)
73+ . expect_err ( "malformed fixture must fail through decode_slice_clear_tail" ) ;
74+ let buffer_err = engine
75+ . decode_buffer :: < 512 > ( input)
76+ . expect_err ( "malformed fixture must fail through decode_buffer" ) ;
77+
78+ assert_eq ! ( slice_err, scalar_err) ;
79+ assert_eq ! ( clear_tail_err, scalar_err) ;
80+ assert_eq ! ( buffer_err, scalar_err) ;
81+ assert ! (
82+ clear_tail_output. iter( ) . all( |byte| * byte == 0 ) ,
83+ "decode_slice_clear_tail must wipe the caller buffer on error"
84+ ) ;
85+
86+ #[ cfg( feature = "alloc" ) ]
87+ {
88+ let vec_err = engine
89+ . decode_vec ( input)
90+ . expect_err ( "malformed fixture must fail through decode_vec" ) ;
91+ let secret_err = engine
92+ . decode_secret ( input)
93+ . expect_err ( "malformed fixture must fail through decode_secret" ) ;
94+
95+ assert_eq ! ( vec_err, scalar_err) ;
96+ assert_eq ! ( secret_err, scalar_err) ;
97+ }
98+ }
99+
57100#[ test]
58101fn standard_family_decode_surfaces_cover_tails_and_padding ( ) {
59102 let mut input = [ 0 ; 193 ] ;
@@ -68,3 +111,29 @@ fn standard_family_decode_surfaces_cover_tails_and_padding() {
68111 assert_standard_family_decode_surface_matches_scalar :: < UrlSafe , false > ( input) ;
69112 }
70113}
114+
115+ #[ test]
116+ fn standard_family_decode_error_surfaces_match_scalar ( ) {
117+ for input in [
118+ b"!!!!" . as_slice ( ) ,
119+ b"AAAA!" ,
120+ b"AA=A" ,
121+ b"Zh==" ,
122+ b"Zm9v$g==" ,
123+ b"AAAA====" ,
124+ ] {
125+ assert_standard_family_decode_error_surface_matches_scalar :: < Standard , true > ( input) ;
126+ }
127+
128+ for input in [ b"Z" . as_slice ( ) , b"Zg=" , b"Zg==" , b"Zm9v$g" , b"Zh" ] {
129+ assert_standard_family_decode_error_surface_matches_scalar :: < Standard , false > ( input) ;
130+ }
131+
132+ for input in [ b"AA+A" . as_slice ( ) , b"AA/A" , b"AA=A" , b"Zh==" , b"AAAA!" ] {
133+ assert_standard_family_decode_error_surface_matches_scalar :: < UrlSafe , true > ( input) ;
134+ }
135+
136+ for input in [ b"Z" . as_slice ( ) , b"AA+A" , b"AA/A" , b"Zg=" , b"Zh" ] {
137+ assert_standard_family_decode_error_surface_matches_scalar :: < UrlSafe , false > ( input) ;
138+ }
139+ }
0 commit comments