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.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Nishat], commit: 8fb8b041d4c9179f62da56a9c7bbf22c40db46cc}
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
8#include "acir_format.hpp"
13
14#include <gtest/gtest.h>
15#include <vector>
16
17using namespace bb;
18using namespace acir_format;
19
20template <class BuilderType, bool IsInputConstant> class Blake3TestingFunctions {
21 public:
22 using Builder = BuilderType;
24 using FF = Builder::FF;
25
27 public:
28 enum class Target : uint8_t {
29 None,
30 Input, // Tamper with an input value
31 Output, // Tamper with an output value
32 };
33
35
36 static std::vector<std::string> get_labels() { return { "None", "Input", "Output" }; }
37 };
38
40
42 AcirConstraint constraint, WitnessVector& witness_values, const InvalidWitness::Target& invalid_witness_target)
43 {
44 switch (invalid_witness_target) {
46 // Tamper with the first input element
47 if constexpr (IsInputConstant) {
48 constraint.inputs[0] = WitnessOrConstant<FF>::from_constant(constraint.inputs[0].value + bb::fr(1));
49 } else {
50 witness_values[constraint.inputs[0].index] += bb::fr(1);
51 }
52 break;
53 }
55 // Tamper with the first output element
56 witness_values[constraint.result[0]] += bb::fr(1);
57 break;
58 }
60 break;
61 }
62
63 return { constraint, witness_values };
64 }
65
69 static void generate_constraints(Blake3Constraint& blake3_constraint, WitnessVector& witness_values)
70 {
71 // Helper to add a state: either as witness or constant
72 auto construct_state = [&](const std::vector<uint8_t>& state,
73 bool as_constant) -> std::vector<WitnessOrConstant<FF>> {
75 if (as_constant) {
76 for (const auto& byte : state) {
77 result.push_back(WitnessOrConstant<FF>::from_constant(FF(byte)));
78 }
79 return result;
80 }
81 auto indices = add_to_witness_and_track_indices(witness_values, state);
82 for (const auto& idx : indices) {
83 result.push_back(WitnessOrConstant<FF>::from_index(idx));
84 }
85 return result;
86 };
87
88 // Input: 64-byte message
89 std::vector<uint8_t> input_state(64);
90
91 // Expected Blake3s hash output
92 std::vector<uint8_t> output_state = blake3::blake3s(input_state);
93
94 // Create the constraint
95 blake3_constraint.inputs.reserve(input_state.size());
96 for (const auto& state : construct_state(input_state, IsInputConstant)) {
97 blake3_constraint.inputs.push_back(state);
98 }
99
100 // Add output state to witness
101 auto output_indices = add_to_witness_and_track_indices(witness_values, output_state);
102 // Add output indices to constraint
103 for (auto [blake_result, output_idx] : zip_view(blake3_constraint.result, output_indices)) {
104 blake_result = output_idx;
105 }
106 }
107};
108
109template <class Builder>
110class Blake3ConstraintsTestInputConstant : public ::testing::Test,
111 public TestClass<Blake3TestingFunctions<Builder, true>> {
112 protected:
114};
115
116using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
117
120{
122 TestFixture::template test_vk_independence<Flavor>();
123}
124
126{
127 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
128}
129
130template <class Builder>
131class Blake3ConstraintsTestInputWitness : public ::testing::Test,
132 public TestClass<Blake3TestingFunctions<Builder, false>> {
133 protected:
135};
136
137using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
138
141{
143 TestFixture::template test_vk_independence<Flavor>();
144}
145
147{
148 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
149}
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)
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:174
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)