@@ -431,13 +431,13 @@ mod test {
431
431
TupleStruct :: arbitrary ( & mut unstructured) . unwrap ( )
432
432
}
433
433
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 > (
438
437
program : & Program ,
439
- tuple_struct : & TupleStruct ,
438
+ tuple_struct : & T ,
440
439
obj_pointer : BFieldElement ,
440
+ offset_for_manipulated_si : BFieldElement ,
441
441
expected_stack : & [ BFieldElement ] ,
442
442
) {
443
443
// No-messed works
@@ -455,9 +455,11 @@ mod test {
455
455
assert_eq ! ( expected_stack, actual_stack) ;
456
456
457
457
// Messed-up encoding fails: Too big but still u32
458
- const POINTER_TO_MESSED_UP_SI : BFieldElement = BFieldElement :: new ( 5 ) ;
459
458
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
+ ) ;
461
463
let messed_up_nd_0 = NonDeterminism :: default ( ) . with_ram ( messed_up_memory. clone ( ) ) ;
462
464
let mut vm_state_fail0 =
463
465
VMState :: new ( program, PublicInput :: default ( ) , messed_up_nd_0. clone ( ) ) ;
@@ -467,7 +469,7 @@ mod test {
467
469
// Messed-up encoding fails: Negative sizes banned
468
470
let negative_number = bfe ! ( -42 ) ;
469
471
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) ;
471
473
let messed_up_nd_1 = NonDeterminism :: default ( ) . with_ram ( messed_up_memory. clone ( ) ) ;
472
474
let mut vm_state_fail1 =
473
475
VMState :: new ( program, PublicInput :: default ( ) , messed_up_nd_1. clone ( ) ) ;
@@ -478,6 +480,56 @@ mod test {
478
480
) ;
479
481
}
480
482
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
+
481
533
#[ test]
482
534
fn mess_with_size_indicators_total_size_negative_test ( ) {
483
535
const START_OF_OBJ : BFieldElement = BFieldElement :: ZERO ;
@@ -500,6 +552,7 @@ mod test {
500
552
& program,
501
553
& random_object,
502
554
START_OF_OBJ ,
555
+ bfe ! ( Digest :: LEN as u64 ) ,
503
556
& expected_stack_benign_nd,
504
557
) ;
505
558
}
@@ -535,6 +588,7 @@ mod test {
535
588
& program,
536
589
& random_object,
537
590
START_OF_OBJ ,
591
+ bfe ! ( Digest :: LEN as u64 ) ,
538
592
& expected_stack_benign_nd,
539
593
) ;
540
594
}
@@ -567,6 +621,7 @@ mod test {
567
621
& program,
568
622
& random_object,
569
623
START_OF_OBJ ,
624
+ bfe ! ( Digest :: LEN as u64 ) ,
570
625
& expected_output_benign_nd,
571
626
) ;
572
627
}
0 commit comments