@@ -158,6 +158,7 @@ fn test_tampered_oversize_message(inputs: &TestConfig) {
158158 tampered_outbox_proof. expect_err ( "Should fail deserialisation" ) ;
159159}
160160
161+
161162fn test_tampered_zero_sized_message ( inputs : & TestConfig ) {
162163 let make_stepper = make_stepper_factory :: < M64M > ( inputs, Some ( ROLLUP_ADDRESS ) ) ;
163164 let mut stepper = make_stepper ( ) ;
@@ -173,16 +174,41 @@ fn test_tampered_zero_sized_message(inputs: &TestConfig) {
173174 assert ! ( verify_outbox_proof( & tampered_outbox_proof) . is_ok( ) ) ;
174175}
175176
177+ fn test_tampered_size ( inputs : & TestConfig ) {
178+ let make_stepper = make_stepper_factory :: < M64M > ( inputs, Some ( ROLLUP_ADDRESS ) ) ;
179+ let mut stepper = make_stepper ( ) ;
180+ let _result = stepper. step_max ( Bound :: Unbounded ) ;
181+ let level = stepper. level ( ) . unwrap ( ) ;
182+ let outbox_proof = stepper
183+ . produce_outbox_proof ( OutputInfo { level, index : 0 } )
184+ . expect ( "Outbox proof should be valid" ) ;
185+
186+ let proof_bytes = OutboxProof :: serialise ( & outbox_proof) ;
187+ let message_size = 4096 ;
188+ let message_pos = find_message_pos ( message_size, proof_bytes. as_slice ( ) ) ;
189+ let len_pos = message_pos - 8 ;
190+
191+ let mut zero_sized = proof_bytes. clone ( ) ;
192+ zero_sized[ len_pos..len_pos + 8 ] . copy_from_slice ( & 0usize . to_le_bytes ( ) ) ;
193+ OutboxProof :: deserialise ( zero_sized. as_slice ( ) ) . expect_err ( "Should fail to deserialise" ) ;
194+
195+ let mut incoherent_size = proof_bytes. clone ( ) ;
196+ incoherent_size[ len_pos..len_pos + 8 ] . copy_from_slice ( & 2000usize . to_le_bytes ( ) ) ;
197+ OutboxProof :: deserialise ( incoherent_size. as_slice ( ) ) . expect_err ( "Should fail to deserialise" ) ;
198+
199+ let mut oversized = proof_bytes. clone ( ) ;
200+ oversized[ len_pos..len_pos + 8 ] . copy_from_slice ( & 8192usize . to_le_bytes ( ) ) ;
201+ OutboxProof :: deserialise ( oversized. as_slice ( ) ) . expect_err ( "Should fail to deserialise" ) ;
202+
203+ }
204+
176205/// Returns a serialized [OutboxProof] with the outbox message
177206/// portion set to [message]. The original outbox proof message
178207/// is expected to be 4096 B
179208fn replace_outbox_message_of_proof ( proof : & OutboxProof , message : & [ u8 ] ) -> Vec < u8 > {
180209 let proof_bytes = OutboxProof :: serialise ( & proof) ;
181210 let message_size = 4096 ;
182- let message_pos = proof_bytes
183- . windows ( message_size)
184- . position ( |w| w. iter ( ) . all ( |& b| b == 0x01 ) )
185- . expect ( "Message content should be present in serialized proof" ) ;
211+ let message_pos = find_message_pos ( message_size, proof_bytes. as_slice ( ) ) ;
186212 let len_pos = message_pos - 8 ;
187213
188214 // Sanity check that the length prefix is correct
@@ -202,6 +228,13 @@ fn replace_outbox_message_of_proof(proof: &OutboxProof, message: &[u8]) -> Vec<u
202228 tampered
203229}
204230
231+ fn find_message_pos ( message_size : usize , proof_bytes : & [ u8 ] ) -> usize {
232+ proof_bytes
233+ . windows ( message_size)
234+ . position ( |w| w. iter ( ) . all ( |& b| b == 0x01 ) )
235+ . expect ( "Message content should be present in serialized proof" )
236+ }
237+
205238#[ test]
206239fn test_outbox_proofs_dummy_kernel ( ) {
207240 test_outbox_proofs ( & DUMMY )
@@ -217,3 +250,8 @@ fn test_tampered_oversize_message_dummy_kernel() {
217250fn test_zero_sized_message_dummy_kernel ( ) {
218251 test_tampered_zero_sized_message ( & DUMMY )
219252}
253+
254+ #[ test]
255+ fn test_tampered_size_dummy_kernel ( ) {
256+ test_tampered_size ( & DUMMY ) ;
257+ }
0 commit comments