Prepares the top of the stack with the hasher initial state.
This procedures does not handle padding, therefore, the user is expected to
consume an amount of data which is a multiple of the rate (2 words).
Input: []
Ouptut: [PERM, PERM, PERM, ...]
Cycles: 12
## std::crypto::hashes::rpo
| Procedure | Description |
| ----------- | ------------- |
| squeeze_digest | Given the hasher state, returns the hash output.
Input: [C, B, A, ...]
Ouptut: [HASH, ...]
where: For the native RPO hasher HASH is B.
Cycles: 9
|
| absorb_double_words_from_memory | Hashes the memory `start_addr` to `end_addr` given an RPO state specified by 3 words.
This requires that `end_addr=start_addr + 2n + 1`, otherwise the procedure will enter an infinite
loop. `end_addr` is not inclusive.
Stack transition:
Input: [C, B, A, start_addr, end_addr, ...]
Output: [C', B', A', end_addr, end_addr ...]
Cycles: 4 + 3 * words, where `words` is the `start_addr - end_addr - 1`
Where `A` is the capacity word that will be used by the hashing function, and `B'` the hash output.
|
| hash_memory_words | Hashes the memory `start_addr` to `end_addr`, handles odd number of elements.
Requires `start_addr < end_addr`, `end_addr` is not inclusive.
Stack transition:
Input: [start_addr, end_addr, ...]
Output: [H, ...]
Cycles:
even words: 49 cycles + 3 * words
odd words: 61 cycles + 3 * words
|
| hash_memory | Computes hash of Felt values starting at the specified memory address.
This procedure divides the hashing process into two parts: hashing pairs of words using
`absorb_double_words_from_memory` procedure and hashing the remaining values using the `hperm`
instruction.
Inputs: [ptr, num_elements]
Outputs: [HASH]
Cycles:
- If number of elements divides by 8: 47 cycles + 3 * words
- Else: 180 cycles + 3 * words
Panics if number of inputs equals 0.
|