Skip to content

Commit a766f9a

Browse files
author
Ryan Tan
committed
test(outbox): add tampered size outbox proof test
1 parent e5cc01a commit a766f9a

1 file changed

Lines changed: 42 additions & 4 deletions

File tree

pvm/tests/test_outbox_proofs.rs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ fn test_tampered_oversize_message(inputs: &TestConfig) {
158158
tampered_outbox_proof.expect_err("Should fail deserialisation");
159159
}
160160

161+
161162
fn 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
179208
fn 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]
206239
fn test_outbox_proofs_dummy_kernel() {
207240
test_outbox_proofs(&DUMMY)
@@ -217,3 +250,8 @@ fn test_tampered_oversize_message_dummy_kernel() {
217250
fn 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

Comments
 (0)