Skip to content

Commit fd2159d

Browse files
committed
fix(perform_duplex): fix perfome_duplex ignoring cache_size
1 parent 0880c37 commit fd2159d

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

src/poseidon2.nr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff 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

src/tests.nr

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
use super::{poseidon, poseidon2};
2+
use super::poseidon2::{Poseidon2, Poseidon2Hasher};
3+
use std::default::Default;
4+
use std::hash::Hasher;
25

36
#[test]
47
fn 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+
}

0 commit comments

Comments
 (0)