Skip to content

Commit 21e0573

Browse files
authored
feat: pedersen hasher type (#684)
1 parent 8755b68 commit 21e0573

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

starknet-crypto/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ mod test_utils;
3333

3434
pub use starknet_types_core::felt::Felt;
3535

36-
pub use pedersen_hash::pedersen_hash;
36+
pub use pedersen_hash::{pedersen_hash, PedersenHasher};
3737

3838
pub use poseidon_hash::{
3939
poseidon_hash, poseidon_hash_many, poseidon_hash_single, poseidon_permute_comp, PoseidonHasher,

starknet-crypto/src/pedersen_hash/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use starknet_types_core::felt::Felt;
2+
13
#[cfg(not(feature = "pedersen_no_lookup"))]
24
mod default;
35
#[cfg(not(feature = "pedersen_no_lookup"))]
@@ -8,6 +10,31 @@ mod no_lookup;
810
#[cfg(feature = "pedersen_no_lookup")]
911
pub use no_lookup::pedersen_hash;
1012

13+
/// A stateful hasher for Starknet Pedersen hash.
14+
#[derive(Debug, Default)]
15+
pub struct PedersenHasher {
16+
hash: Felt,
17+
len: usize,
18+
}
19+
20+
impl PedersenHasher {
21+
/// Creates a new [`PedersenHasher`].
22+
pub fn new() -> Self {
23+
Self::default()
24+
}
25+
26+
/// Absorbs message into the hash.
27+
pub fn update(&mut self, msg: Felt) {
28+
self.hash = pedersen_hash(&self.hash, &msg);
29+
self.len += 1;
30+
}
31+
32+
/// Finishes and returns hash.
33+
pub fn finalize(&self) -> Felt {
34+
pedersen_hash(&self.hash, &self.len.into())
35+
}
36+
}
37+
1138
#[cfg(test)]
1239
mod tests {
1340
use super::*;

0 commit comments

Comments
 (0)