Skip to content

Commit

Permalink
feat: optimize constraints in sha256 (#6145)
Browse files Browse the repository at this point in the history
# Description

## Problem\*

Resolves <!-- Link to GitHub Issue -->

## Summary\*

We can optimize the sha256 implementation rolling the if-statement
condition into the values being constrained manually. This allows us to
have a single constraint rather than 2 with opposite predicates.

## Additional Context



## Documentation\*

Check one:
- [x] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[For Experimental Features]** Documentation to be submitted in a
separate PR.

# PR Checklist\*

- [x] I have tested the changes locally.
- [x] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
TomAFrench authored Sep 24, 2024
1 parent b1d0619 commit 164d29e
Showing 1 changed file with 7 additions and 8 deletions.
15 changes: 7 additions & 8 deletions noir_stdlib/src/hash/sha256.nr
Original file line number Diff line number Diff line change
Expand Up @@ -186,18 +186,18 @@ pub fn sha256_var<let N: u32>(msg: [u8; N], message_size: u64) -> [u8; 32] {

if !crate::runtime::is_unconstrained() {
for i in 0..56 {
if i < msg_byte_ptr {
assert_eq(msg_block[i], last_block[i]);
} else {
assert_eq(msg_block[i], zero);
}
let predicate = (i < msg_byte_ptr) as u8;
let expected_byte = predicate * last_block[i];
assert_eq(msg_block[i], expected_byte);
}

// We verify the message length was inserted correctly by reversing the byte decomposition.
let len = 8 * message_size;
let len_bytes: [u8; 8] = (len as Field).to_be_bytes();
let mut reconstructed_len: Field = 0;
for i in 56..64 {
assert_eq(msg_block[i], len_bytes[i - 56]);
reconstructed_len = 256 * reconstructed_len + msg_block[i] as Field;
}
assert_eq(reconstructed_len, len as Field);
}

hash_final_block(msg_block, h)
Expand Down Expand Up @@ -254,4 +254,3 @@ fn hash_final_block(msg_block: [u8; 64], mut state: [u32; 8]) -> [u8; 32] {

out_h
}

0 comments on commit 164d29e

Please sign in to comment.