Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
sha256_constraint.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
10#include "round.hpp"
11
12namespace acir_format {
13
14template <typename Builder>
16{
18
20 std::array<field_ct, 8> hash_inputs;
21
22 // Get the witness assignment for each witness index
23 // Note that we do not range-check the inputs, which should be 32 bits,
24 // because of the lookup-tables.
25 size_t i = 0;
26 for (const auto& witness_index_num_bits : constraint.inputs) {
27 inputs[i] = to_field_ct(witness_index_num_bits, builder);
28 ++i;
29 }
30 i = 0;
31 for (const auto& witness_index_num_bits : constraint.hash_values) {
32 hash_inputs[i] = to_field_ct(witness_index_num_bits, builder);
33 ++i;
34 }
35
36 // Compute sha256 compression
37 auto output_bytes = bb::stdlib::SHA256<Builder>::sha256_block(hash_inputs, inputs);
38
39 for (size_t i = 0; i < 8; ++i) {
40 auto normalised_output = output_bytes[i].normalize();
41 if (normalised_output.is_constant()) {
42 builder.fix_witness(constraint.result[i], normalised_output.get_value());
43 } else {
44 bb::poly_triple assert_equal{
45 .a = normalised_output.witness_index,
46 .b = constraint.result[i],
47 .c = 0,
48 .q_m = 0,
49 .q_l = 1,
50 .q_r = -1,
51 .q_o = 0,
52 .q_c = 0,
53 };
54 builder.create_poly_gate(assert_equal);
55 }
56 }
57}
58
60 const Sha256Compression& constraint);
62 const Sha256Compression& constraint);
63
64} // namespace acir_format
static std::array< field_ct, 8 > sha256_block(const std::array< field_ct, 8 > &h_init, const std::array< field_ct, 16 > &input)
Definition sha256.cpp:237
AluTraceBuilder builder
Definition alu.test.cpp:123
template void create_sha256_compression_constraints< bb::MegaCircuitBuilder >(bb::MegaCircuitBuilder &builder, const Sha256Compression &constraint)
void create_sha256_compression_constraints(Builder &builder, const Sha256Compression &constraint)
template void create_sha256_compression_constraints< bb::UltraCircuitBuilder >(bb::UltraCircuitBuilder &builder, const Sha256Compression &constraint)
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< FF > &input, Builder &builder)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::array< WitnessOrConstant< bb::fr >, 8 > hash_values
std::array< uint32_t, 8 > result
std::array< WitnessOrConstant< bb::fr >, 16 > inputs