arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
feat: new merge method for 2 digest with a domain separator

Signed-off-by: 0xKanekiKen <100861945+0xKanekiKen@users.noreply.github.com>
0xKanekiKen 100861945+0xKanekiKen@users.noreply.github.com
Mon, 23 Jan 2023 16:26:53 +0000
commit

bc6191b3fadd563b5a91c0b3b3f27c275be2fc21

parent

f51d6b78aa62bcc4b7e4a322f65d34404e330f58

1 files changed, 22 insertions(+), 0 deletions(-)

jump to
M src/hash/rpo/mod.rs → src/hash/rpo/mod.rs

@@ -294,6 +294,28 @@ pub fn hash_elements<E: FieldElement<BaseField = Felt>>(elements: &[E]) -> RpoDigest {

<Self as ElementHasher>::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 // --------------------------------------------------------------------------------------------