From bc6191b3fadd563b5a91c0b3b3f27c275be2fc21 Mon Sep 17 00:00:00 2001 From: 0xKanekiKen <100861945+0xKanekiKen@users.noreply.github.com> Date: Mon, 23 Jan 2023 16:26:53 +0000 Subject: [PATCH] feat: new merge method for 2 digest with a domain separator Signed-off-by: 0xKanekiKen <100861945+0xKanekiKen@users.noreply.github.com> --- src/hash/rpo/mod.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/hash/rpo/mod.rs b/src/hash/rpo/mod.rs index 735461b..c85c13c 100644 --- a/src/hash/rpo/mod.rs +++ b/src/hash/rpo/mod.rs @@ -294,6 +294,28 @@ impl Rpo256 { ::hash_elements(elements) } + // DOMAIN IDENTIFIER + // -------------------------------------------------------------------------------------------- + + /// Returns a hash of two digests and a domain separator. + pub fn merge_in_domain(values: &[RpoDigest; 2], domain: Felt) -> RpoDigest { + // initialize the state by copying the digest elements into the rate portion of the state + // (8 total elements), and set the capacity elements to 0. + let mut state = [ZERO; STATE_WIDTH]; + let it = RpoDigest::digests_as_elements(values.iter()); + for (i, v) in it.enumerate() { + state[RATE_RANGE.start + i] = *v; + } + + // set the second capacity element to the domain value. The first capacity element is used + // for padding purposes. + state[CAPACITY_RANGE.start + 1] = domain; + + // apply the RPO permutation and return the first four elements of the state + Self::apply_permutation(&mut state); + RpoDigest::new(state[DIGEST_RANGE].try_into().unwrap()) + } + // RESCUE PERMUTATION // --------------------------------------------------------------------------------------------