Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
blake2s_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 Blake2sTestingFunctions {
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].blackbox_input =
43 WitnessOrConstant<FF>::from_constant(constraint.inputs[0].blackbox_input.value + bb::fr(1));
44 } else {
45 witness_values[constraint.inputs[0].blackbox_input.index] += bb::fr(1);
46 }
47 break;
48 }
50 // Tamper with the first output element
51 witness_values[constraint.result[0]] += bb::fr(1);
52 break;
53 }
55 break;
56 }
57
58 return { constraint, witness_values };
59 }
60
64 static void generate_constraints(Blake2sConstraint& blake2s_constraint, WitnessVector& witness_values)
65 {
66 // Helper to add a state: either as witness or constant
67 auto construct_state = [&](const std::vector<uint8_t>& state,
68 bool as_constant) -> std::vector<WitnessOrConstant<FF>> {
70 if (as_constant) {
71 for (const auto& byte : state) {
72 result.push_back(WitnessOrConstant<FF>::from_constant(FF(byte)));
73 }
74 return result;
75 }
76 auto indices = add_to_witness_and_track_indices(witness_values, state);
77 for (const auto& idx : indices) {
78 result.push_back(WitnessOrConstant<FF>::from_index(idx));
79 }
80 return result;
81 };
82
83 // Input: 64-byte message
84 std::vector<uint8_t> input_state(64);
85
86 // Expected Blake2s hash output
87 std::array<uint8_t, 32> output_state = crypto::blake2s(input_state);
88
89 // Create the constraint
90 blake2s_constraint.inputs.reserve(input_state.size());
91 for (const auto& state : construct_state(input_state, IsInputConstant)) {
92 Blake2sInput input{ .blackbox_input = state, .num_bits = 8 };
93 blake2s_constraint.inputs.push_back(input);
94 }
95
96 // Add output state to witness
97 auto output_indices = add_to_witness_and_track_indices(witness_values, output_state);
98 // Add output indices to constraint
99 for (auto [blake_result, output_idx] : zip_view(blake2s_constraint.result, output_indices)) {
100 blake_result = output_idx;
101 }
102 }
103};
104
105template <class Builder>
106class Blake2sConstraintsTestInputConstant : public ::testing::Test,
107 public TestClass<Blake2sTestingFunctions<Builder, true>> {
108 protected:
110};
111
112using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
113
116{
118 TestFixture::template test_vk_independence<Flavor>();
119}
120
122{
123 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
124}
125
126template <class Builder>
127class Blake2sConstraintsTestInputWitness : public ::testing::Test,
128 public TestClass<Blake2sTestingFunctions<Builder, false>> {
129 protected:
131};
132
133using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
134
137{
139 TestFixture::template test_vk_independence<Flavor>();
140}
141
143{
144 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
145}
static void generate_constraints(Blake2sConstraint &blake2s_constraint, WitnessVector &witness_values)
Generate a valid Blake2sConstraint with correct witness values.
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static ProgramMetadata generate_metadata()
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::array< uint8_t, BLAKE2S_OUTBYTES > blake2s(std::vector< uint8_t > const &input)
Definition blake2s.cpp:232
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(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()
std::vector< Blake2sInput > inputs
std::array< uint32_t, 32 > result
WitnessOrConstant< bb::fr > blackbox_input
Metadata required to create a circuit.
static WitnessOrConstant from_constant(FF value)