Skip to content

Commit fdb2cfd

Browse files
committed
test(tasm_object): Verify failure on manipulated size indicators in struct with named fields
1 parent 5d13924 commit fdb2cfd

File tree

1 file changed

+63
-8
lines changed

1 file changed

+63
-8
lines changed

tasm-lib/src/structure/tasm_object.rs

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -431,13 +431,13 @@ mod test {
431431
TupleStruct::arbitrary(&mut unstructured).unwrap()
432432
}
433433

434-
/// Verify correct field-getter behavior when the dynamically-sized
435-
/// field of the `Vec<BFieldElement>`, 2nd to last field in
436-
/// `[TupleStruct]` gets a malicious size-indicator.
437-
fn prop_negative_test_messed_up_size_indicators(
434+
/// Verify correct field-getter behavior when a size-indicator gets
435+
/// manipulated to illegal values.
436+
fn prop_negative_test_messed_up_size_indicators<T: BFieldCodec>(
438437
program: &Program,
439-
tuple_struct: &TupleStruct,
438+
tuple_struct: &T,
440439
obj_pointer: BFieldElement,
440+
offset_for_manipulated_si: BFieldElement,
441441
expected_stack: &[BFieldElement],
442442
) {
443443
// No-messed works
@@ -455,9 +455,11 @@ mod test {
455455
assert_eq!(expected_stack, actual_stack);
456456

457457
// Messed-up encoding fails: Too big but still u32
458-
const POINTER_TO_MESSED_UP_SI: BFieldElement = BFieldElement::new(5);
459458
let mut messed_up_memory = no_messed_memory.clone();
460-
messed_up_memory.insert(POINTER_TO_MESSED_UP_SI, bfe!(TupleStruct::MAX_OFFSET + 1));
459+
messed_up_memory.insert(
460+
obj_pointer + offset_for_manipulated_si,
461+
bfe!(TupleStruct::MAX_OFFSET + 1),
462+
);
461463
let messed_up_nd_0 = NonDeterminism::default().with_ram(messed_up_memory.clone());
462464
let mut vm_state_fail0 =
463465
VMState::new(program, PublicInput::default(), messed_up_nd_0.clone());
@@ -467,7 +469,7 @@ mod test {
467469
// Messed-up encoding fails: Negative sizes banned
468470
let negative_number = bfe!(-42);
469471
messed_up_memory = no_messed_memory;
470-
messed_up_memory.insert(POINTER_TO_MESSED_UP_SI, negative_number);
472+
messed_up_memory.insert(obj_pointer + offset_for_manipulated_si, negative_number);
471473
let messed_up_nd_1 = NonDeterminism::default().with_ram(messed_up_memory.clone());
472474
let mut vm_state_fail1 =
473475
VMState::new(program, PublicInput::default(), messed_up_nd_1.clone());
@@ -478,6 +480,56 @@ mod test {
478480
);
479481
}
480482

483+
#[test]
484+
fn mess_with_size_indicator_field_getter_named_fields_negative_test() {
485+
#[derive(BFieldCodec, TasmObject, PartialEq, Eq, Clone, Debug, Arbitrary)]
486+
struct WithNamedFields {
487+
a: Vec<Digest>,
488+
b: Vec<BFieldElement>,
489+
c: Digest,
490+
d: Vec<XFieldElement>,
491+
}
492+
493+
fn prepare_random_object(seed: [u8; 32]) -> WithNamedFields {
494+
let mut rng: StdRng = SeedableRng::from_seed(seed);
495+
let mut randomness = [0u8; 100000];
496+
rng.fill_bytes(&mut randomness);
497+
let mut unstructured = Unstructured::new(&randomness);
498+
WithNamedFields::arbitrary(&mut unstructured).unwrap()
499+
}
500+
501+
const START_OF_OBJ: BFieldElement = BFieldElement::new(800);
502+
let random_object = prepare_random_object(random());
503+
let third_to_last_field = field!(WithNamedFields::c);
504+
let code_using_field_getter = triton_asm!(
505+
// _
506+
507+
push {START_OF_OBJ}
508+
// _ *with_named_fields
509+
510+
{&third_to_last_field}
511+
// _ *digest
512+
513+
addi {Digest::LEN - 1}
514+
read_mem {Digest::LEN}
515+
pop 1
516+
// _ [digest]
517+
518+
halt
519+
);
520+
521+
let program = Program::new(&code_using_field_getter);
522+
let expected_stack_benign = random_object.c.values();
523+
let offset_for_manipulated_si = bfe!(0);
524+
prop_negative_test_messed_up_size_indicators(
525+
&program,
526+
&random_object,
527+
START_OF_OBJ,
528+
offset_for_manipulated_si,
529+
&expected_stack_benign,
530+
);
531+
}
532+
481533
#[test]
482534
fn mess_with_size_indicators_total_size_negative_test() {
483535
const START_OF_OBJ: BFieldElement = BFieldElement::ZERO;
@@ -500,6 +552,7 @@ mod test {
500552
&program,
501553
&random_object,
502554
START_OF_OBJ,
555+
bfe!(Digest::LEN as u64),
503556
&expected_stack_benign_nd,
504557
);
505558
}
@@ -535,6 +588,7 @@ mod test {
535588
&program,
536589
&random_object,
537590
START_OF_OBJ,
591+
bfe!(Digest::LEN as u64),
538592
&expected_stack_benign_nd,
539593
);
540594
}
@@ -567,6 +621,7 @@ mod test {
567621
&program,
568622
&random_object,
569623
START_OF_OBJ,
624+
bfe!(Digest::LEN as u64),
570625
&expected_output_benign_nd,
571626
);
572627
}

0 commit comments

Comments
 (0)