Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
blake3_constraint.test.cpp
Go to the documentation of this file.
2#include "acir_format.hpp"
7
8#include <gtest/gtest.h>
9#include <vector>
10
11using namespace bb;
12using namespace acir_format;
13
14template <class BuilderType, bool IsInputConstant> class Blake3TestingFunctions {
15 public:
16 using Builder = BuilderType;
18 using FF = Builder::FF;
19
21 public:
22 enum class Target : uint8_t {
23 None,
24 Input, // Tamper with an input value
25 Output, // Tamper with an output value
26 };
27
29
30 static std::vector<std::string> get_labels() { return { "None", "Input", "Output" }; }
31 };
32
34
36 AcirConstraint constraint, WitnessVector& witness_values, const InvalidWitness::Target& invalid_witness_target)
37 {
38 switch (invalid_witness_target) {
40 // Tamper with the first input element
41 if constexpr (IsInputConstant) {
42 constraint.inputs[0] = WitnessOrConstant<FF>::from_constant(constraint.inputs[0].value + bb::fr(1));
43 } else {
44 witness_values[constraint.inputs[0].index] += bb::fr(1);
45 }
46 break;
47 }
49 // Tamper with the first output element
50 witness_values[constraint.result[0]] += bb::fr(1);
51 break;
52 }
54 break;
55 }
56
57 return { constraint, witness_values };
58 }
59
63 static void generate_constraints(Blake3Constraint& blake3_constraint, WitnessVector& witness_values)
64 {
65 // Helper to add a state: either as witness or constant
66 auto construct_state = [&](const std::vector<uint8_t>& state,
67 bool as_constant) -> std::vector<WitnessOrConstant<FF>> {
69 if (as_constant) {
70 for (const auto& byte : state) {
71 result.push_back(WitnessOrConstant<FF>::from_constant(FF(byte)));
72 }
73 return result;
74 }
75 auto indices = add_to_witness_and_track_indices(witness_values, state);
76 for (const auto& idx : indices) {
77 result.push_back(WitnessOrConstant<FF>::from_index(idx));
78 }
79 return result;
80 };
81
82 // Input: 64-byte message
83 std::vector<uint8_t> input_state(64);
84
85 // Expected Blake3s hash output
86 std::vector<uint8_t> output_state = blake3::blake3s(input_state);
87
88 // Create the constraint
89 blake3_constraint.inputs.reserve(input_state.size());
90 for (const auto& state : construct_state(input_state, IsInputConstant)) {
91 blake3_constraint.inputs.push_back(state);
92 }
93
94 // Add output state to witness
95 auto output_indices = add_to_witness_and_track_indices(witness_values, output_state);
96 // Add output indices to constraint
97 for (auto [blake_result, output_idx] : zip_view(blake3_constraint.result, output_indices)) {
98 blake_result = output_idx;
99 }
100 }
101};
102
103template <class Builder>
104class Blake3ConstraintsTestInputConstant : public ::testing::Test,
105 public TestClass<Blake3TestingFunctions<Builder, true>> {
106 protected:
108};
109
110using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
111
114{
116 TestFixture::template test_vk_independence<Flavor>();
117}
118
120{
121 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
122}
123
124template <class Builder>
125class Blake3ConstraintsTestInputWitness : public ::testing::Test,
126 public TestClass<Blake3TestingFunctions<Builder, false>> {
127 protected:
129};
130
131using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
132
135{
137 TestFixture::template test_vk_independence<Flavor>();
138}
139
141{
142 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
143}
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(Blake3Constraint &blake3_constraint, WitnessVector &witness_values)
Generate a valid Blake3Constraint with correct witness values.
std::vector< bb::fr > WitnessVector
std::vector< uint32_t > add_to_witness_and_track_indices(std::vector< bb::fr > &witness, const T &input)
Append values to a witness vector and track their indices.
Definition utils.hpp:90
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
field< Bn254FrParams > fr
Definition fr.hpp:155
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
std::vector< uint8_t > blake3s(std::vector< uint8_t > const &input)
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()
std::array< uint32_t, 32 > result
std::vector< WitnessOrConstant< bb::fr > > inputs
Metadata required to create a circuit.
static WitnessOrConstant from_constant(FF value)