Skip to content

Commit ad125a3

Browse files
Merge branch 'main' into main
2 parents 86e617c + ae310ba commit ad125a3

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

crates/starknet-types-core/src/hash/pedersen.rs

+34
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ impl StarkHash for Pedersen {
1717

1818
/// Computes the Pedersen hash of an array of Felts, as defined
1919
/// in <https://docs.starknet.io/documentation/architecture_and_concepts/Hashing/hash-functions/#array_hashing.>
20+
///
21+
/// Warning: there is room for collision as:
22+
/// Pedersen::hash_array([value]) and Pedersen::hash(Pedersen::hash(0, value), 1) will return the same values
2023
fn hash_array(felts: &[Felt]) -> Felt {
2124
let data_len = Felt::from(felts.len());
2225
let current_hash: FieldElement<Stark252PrimeField> = felts
@@ -26,12 +29,43 @@ impl StarkHash for Pedersen {
2629
});
2730
Felt(PedersenStarkCurve::hash(&current_hash, &data_len.0))
2831
}
32+
33+
/// Computes the Pedersen hash of a single Felt
34+
///
35+
/// Warning: there is room for collision as:
36+
/// Pedersen::hash_single(value) and Pedersen::hash(value, 0) will return the same values
37+
fn hash_single(felt: &Felt) -> Felt {
38+
Felt(PedersenStarkCurve::hash(&felt.0, &Felt::from(0).0))
39+
}
2940
}
3041

3142
#[cfg(test)]
3243
mod tests {
3344
use super::*;
3445

46+
#[test]
47+
fn test_pedersen_hash_single() {
48+
let x =
49+
Felt::from_hex("0x03d937c035c878245caf64531a5756109c53068da139362728feb561405371cb")
50+
.unwrap();
51+
assert_eq!(
52+
Pedersen::hash_single(&x),
53+
Felt::from_hex("0x460ded9dacd215bcfc43f1b30b2a02690378e00f82a2283617d47d948c7b7f1")
54+
.unwrap()
55+
)
56+
}
57+
58+
#[test]
59+
fn test_pedersen_hash_collision() {
60+
let x =
61+
Felt::from_hex("0x03d937c035c878245caf64531a5756109c53068da139362728feb561405371cb")
62+
.unwrap();
63+
assert_eq!(
64+
Pedersen::hash_single(&x),
65+
Pedersen::hash(&x, &Felt::from(0))
66+
)
67+
}
68+
3569
#[test]
3670
fn test_pedersen_hash() {
3771
let x =

crates/starknet-types-core/src/hash/poseidon.rs

+15
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ impl StarkHash for Poseidon {
2828
)
2929
}))
3030
}
31+
32+
fn hash_single(felt: &Felt) -> Felt {
33+
Felt(PoseidonCairoStark252::hash_single(&felt.0))
34+
}
3135
}
3236

3337
impl Poseidon {
@@ -46,6 +50,17 @@ impl Poseidon {
4650
mod tests {
4751
use super::*;
4852

53+
#[test]
54+
fn test_poseidon_single() {
55+
let x = Felt::from_hex("0x9").unwrap();
56+
57+
assert_eq!(
58+
Poseidon::hash_single(&x),
59+
Felt::from_hex("0x3bb3b91c714cb47003947f36dadc98326176963c434cd0a10320b8146c948b3")
60+
.unwrap()
61+
);
62+
}
63+
4964
#[test]
5065
fn test_poseidon_hash() {
5166
let x =

crates/starknet-types-core/src/hash/traits.rs

+2
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ pub trait StarkHash {
77
/// Computes the hash of an array of Felts,
88
/// as defined in <https://docs.starknet.io/documentation/architecture_and_concepts/Hashing/hash-functions/#array_hashing.>
99
fn hash_array(felts: &[Felt]) -> Felt;
10+
11+
fn hash_single(felt: &Felt) -> Felt;
1012
}

0 commit comments

Comments
 (0)