File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -25,9 +25,9 @@ impl Poseidon2 {
2525
2626 fn perform_duplex (&mut self ) {
2727 // add the cache into sponge state
28- self .state [0 ] += self .cache [0 ];
29- self .state [1 ] += self .cache [1 ];
30- self .state [2 ] += self .cache [2 ];
28+ self .state [0 ] += self .cache [0 ] * (( 0 < self . cache_size ) as Field ) ;
29+ self .state [1 ] += self .cache [1 ] * (( 1 < self . cache_size ) as Field ) ;
30+ self .state [2 ] += self .cache [2 ] * (( 2 < self . cache_size ) as Field ) ;
3131 self .state = crate ::poseidon2_permutation (self .state );
3232 }
3333
Original file line number Diff line number Diff line change 11use super:: {poseidon , poseidon2 };
2+ use super::poseidon2:: {Poseidon2 , Poseidon2Hasher };
3+ use std::default::Default ;
4+ use std::hash::Hasher ;
25
36#[test]
47fn reference_impl_test_vectors () {
@@ -89,3 +92,15 @@ fn test_poseidon2_3() {
8992 let expected = 0x0f1badcd0d52ced816fb6e6826fdf66ada038135d53cbb993f320ca6529223cd ;
9093 assert_eq (hash , expected );
9194}
95+
96+ #[test]
97+ fn test_regression_perform_duplex_stale_cache () {
98+ let a = [1 , 2 , 3 , 4 ];
99+ let h_hash = Poseidon2 ::hash (a , 4 );
100+ let mut hasher : Poseidon2Hasher = Default ::default ();
101+ for x in a {
102+ hasher .write (x );
103+ }
104+ let h_finish = hasher .finish ();
105+ assert_eq (h_hash , h_finish );
106+ }
You can’t perform that action at this time.
0 commit comments