Skip to content

Commit 502cfd5

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

1 file changed

Lines changed: 41 additions & 5 deletions

File tree

pvm/tests/test_outbox_proofs.rs

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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
179206
fn 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]
206237
fn test_outbox_proofs_dummy_kernel() {
207238
test_outbox_proofs(&DUMMY)
@@ -217,3 +248,8 @@ fn test_tampered_oversize_message_dummy_kernel() {
217248
fn 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

Comments
 (0)