@@ -173,16 +173,40 @@ fn test_tampered_zero_sized_message(inputs: &TestConfig) {
173173 assert ! ( verify_outbox_proof( & tampered_outbox_proof) . is_ok( ) ) ;
174174}
175175
176+ fn test_tampered_size ( inputs : & TestConfig ) {
177+ let make_stepper = make_stepper_factory :: < M64M > ( inputs, Some ( ROLLUP_ADDRESS ) ) ;
178+ let mut stepper = make_stepper ( ) ;
179+ let _result = stepper. step_max ( Bound :: Unbounded ) ;
180+ let level = stepper. level ( ) . unwrap ( ) ;
181+ let outbox_proof = stepper
182+ . produce_outbox_proof ( OutputInfo { level, index : 0 } )
183+ . expect ( "Outbox proof should be valid" ) ;
184+
185+ let proof_bytes = OutboxProof :: serialise ( & outbox_proof) ;
186+ let message_size = 4096 ;
187+ let message_pos = find_message_pos ( message_size, proof_bytes. as_slice ( ) ) ;
188+ let len_pos = message_pos - 8 ;
189+
190+ let mut zero_sized = proof_bytes. clone ( ) ;
191+ zero_sized[ len_pos..len_pos + 8 ] . copy_from_slice ( & 0usize . to_le_bytes ( ) ) ;
192+ OutboxProof :: deserialise ( zero_sized. as_slice ( ) ) . expect_err ( "Should fail to deserialise" ) ;
193+
194+ let mut incoherent_size = proof_bytes. clone ( ) ;
195+ incoherent_size[ len_pos..len_pos + 8 ] . copy_from_slice ( & 2000usize . to_le_bytes ( ) ) ;
196+ OutboxProof :: deserialise ( incoherent_size. as_slice ( ) ) . expect_err ( "Should fail to deserialise" ) ;
197+
198+ let mut oversized = proof_bytes. clone ( ) ;
199+ oversized[ len_pos..len_pos + 8 ] . copy_from_slice ( & 8192usize . to_le_bytes ( ) ) ;
200+ OutboxProof :: deserialise ( oversized. as_slice ( ) ) . expect_err ( "Should fail to deserialise" ) ;
201+ }
202+
176203/// Returns a serialized [OutboxProof] with the outbox message
177204/// portion set to [message]. The original outbox proof message
178205/// is expected to be 4096 B
179206fn replace_outbox_message_of_proof ( proof : & OutboxProof , message : & [ u8 ] ) -> Vec < u8 > {
180- let proof_bytes = OutboxProof :: serialise ( & proof) ;
207+ let proof_bytes = OutboxProof :: serialise ( proof) ;
181208 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" ) ;
209+ let message_pos = find_message_pos ( message_size, proof_bytes. as_slice ( ) ) ;
186210 let len_pos = message_pos - 8 ;
187211
188212 // Sanity check that the length prefix is correct
@@ -202,6 +226,13 @@ fn replace_outbox_message_of_proof(proof: &OutboxProof, message: &[u8]) -> Vec<u
202226 tampered
203227}
204228
229+ fn find_message_pos ( message_size : usize , proof_bytes : & [ u8 ] ) -> usize {
230+ proof_bytes
231+ . windows ( message_size)
232+ . position ( |w| w. iter ( ) . all ( |& b| b == 0x01 ) )
233+ . expect ( "Message content should be present in serialized proof" )
234+ }
235+
205236#[ test]
206237fn test_outbox_proofs_dummy_kernel ( ) {
207238 test_outbox_proofs ( & DUMMY )
@@ -217,3 +248,8 @@ fn test_tampered_oversize_message_dummy_kernel() {
217248fn test_zero_sized_message_dummy_kernel ( ) {
218249 test_tampered_zero_sized_message ( & DUMMY )
219250}
251+
252+ #[ test]
253+ fn test_tampered_size_dummy_kernel ( ) {
254+ test_tampered_size ( & DUMMY ) ;
255+ }
0 commit comments