Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
sha256_constraint.test.cpp
Go to the documentation of this file.
2#include "acir_format.hpp"
7
8#include <gtest/gtest.h>
9
10using namespace bb;
11using namespace acir_format;
12
13template <class BuilderType, bool IsInputConstant> class Sha256TestingFunctions {
14 public:
15 using Builder = BuilderType;
17 using FF = Builder::FF;
18
20 public:
21 enum class Target : uint8_t {
22 None,
23 Input, // Tamper with an input value
24 HashValue, // Tamper with a previous hash state value
25 Output, // Tamper with an output value
26 };
27
32
33 static std::vector<std::string> get_labels() { return { "None", "Input", "HashValue", "Output" }; }
34 };
35
37
39 AcirConstraint constraint, WitnessVector witness_values, const InvalidWitness::Target& invalid_witness_target)
40 {
41 switch (invalid_witness_target) {
43 if constexpr (IsInputConstant) {
44 constraint.inputs[0] = WitnessOrConstant<FF>::from_constant(constraint.inputs[0].value + FF(1));
45 } else {
46 witness_values[constraint.inputs[0].index] += FF(1);
47 }
48 break;
49 }
51 if constexpr (IsInputConstant) {
52 constraint.hash_values[0] =
53 WitnessOrConstant<FF>::from_constant(constraint.hash_values[0].value + FF(1));
54 } else {
55 witness_values[constraint.hash_values[0].index] += FF(1);
56 }
57 break;
58 }
60 witness_values[constraint.result[0]] += FF(1);
61 break;
62 }
64 break;
65 }
66
67 return { constraint, witness_values };
68 }
69
73 static void generate_constraints(Sha256Compression& sha256_constraint, WitnessVector& witness_values)
74 {
75 // Helper to create WitnessOrConstant from a value
76 auto make_witness_or_constant = [&](uint32_t value) -> WitnessOrConstant<FF> {
77 if constexpr (IsInputConstant) {
79 } else {
80 uint32_t idx = static_cast<uint32_t>(witness_values.size());
81 witness_values.emplace_back(FF(value));
83 }
84 };
85
86 // Input: 16 words of zeros (512-bit message block)
87 std::array<uint32_t, 16> input_block = { 0 };
88
89 // Initial hash state (SHA-256 IV)
90 std::array<uint32_t, 8> hash_values = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
91 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
92
93 // Compute expected output using native SHA-256 compression
94 std::array<uint32_t, 8> result = crypto::sha256_block(hash_values, input_block);
95
96 // Build the constraint
97 for (size_t i = 0; i < 16; ++i) {
98 sha256_constraint.inputs[i] = make_witness_or_constant(input_block[i]);
99 }
100 for (size_t i = 0; i < 8; ++i) {
101 sha256_constraint.hash_values[i] = make_witness_or_constant(hash_values[i]);
102 }
103
104 // Add output values to witness and set result indices
105 for (size_t i = 0; i < 8; ++i) {
106 sha256_constraint.result[i] = static_cast<uint32_t>(witness_values.size());
107 witness_values.emplace_back(FF(result[i]));
108 }
109 }
110};
111
112// Test with constant inputs
113template <class Builder>
114class Sha256ConstraintsTestInputConstant : public ::testing::Test,
115 public TestClass<Sha256TestingFunctions<Builder, true>> {
116 protected:
118};
119
120using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
121
123
125{
127 TestFixture::template test_vk_independence<Flavor>();
128}
129
131{
132 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
133}
134
135// Test with witness inputs
136template <class Builder>
137class Sha256ConstraintsTestInputWitness : public ::testing::Test,
138 public TestClass<Sha256TestingFunctions<Builder, false>> {
139 protected:
141};
142
144
146{
148 TestFixture::template test_vk_independence<Flavor>();
149}
150
152{
153 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
154}
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void generate_constraints(Sha256Compression &sha256_constraint, WitnessVector &witness_values)
Generate a valid Sha256Compression constraint with correct witness values.
std::vector< bb::fr > WitnessVector
std::array< uint32_t, 8 > sha256_block(const std::array< uint32_t, 8 > &h_init, const std::array< uint32_t, 16 > &input)
SHA-256 compression function (FIPS 180-4 Section 6.2.2)
Definition sha256.cpp:73
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
static std::vector< std::string > get_labels()
Metadata required to create a circuit.
std::array< WitnessOrConstant< bb::fr >, 8 > hash_values
std::array< uint32_t, 8 > result
std::array< WitnessOrConstant< bb::fr >, 16 > inputs
static WitnessOrConstant from_index(uint32_t index)
static WitnessOrConstant from_constant(FF value)