2#include "../../primitives/plookup/plookup.hpp"
6#include <gtest/gtest.h>
20TEST(stdlib_keccak, keccak_format_input_table)
24 for (
size_t i = 0; i < 25; ++i) {
31 EXPECT_EQ(proof_result,
true);
34TEST(stdlib_keccak, keccak_format_output_table)
38 for (
size_t i = 0; i < 25; ++i) {
45 EXPECT_EQ(proof_result,
true);
48TEST(stdlib_keccak, keccak_theta_output_table)
52 for (
size_t i = 0; i < 25; ++i) {
54 for (
size_t j = 0; j < 8; ++j) {
55 extended_native *= 11;
57 extended_native += base_value;
63 EXPECT_EQ(proof_result,
true);
66TEST(stdlib_keccak, keccak_rho_output_table)
69 GTEST_SKIP() <<
"Bug in constant case?";
72 constexpr_for<0, 25, 1>([&]<
size_t i> {
75 for (
size_t j = 0; j < 64; ++j) {
76 extended_native *= 11;
77 binary_native = binary_native << 1;
79 extended_native += base_value;
80 binary_native += (base_value & 1);
83 const size_t right_bits = 64 - left_bits;
84 const uint256_t left = binary_native >> right_bits;
85 const uint256_t right = binary_native - (left << right_bits);
86 const uint256_t binary_rotated = left + (right << left_bits);
90 const uint256_t expected_msb = (binary_native >> 63);
98 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
100 EXPECT_EQ(proof_result,
true);
103TEST(stdlib_keccak, keccak_chi_output_table)
105 static constexpr uint64_t chi_normalization_table[5]{
111 for (
size_t i = 0; i < 25; ++i) {
115 for (
size_t j = 0; j < 8; ++j) {
116 extended_native *= 11;
117 normalized_native *= 11;
118 binary_native = binary_native << 1;
120 extended_native += base_value;
121 normalized_native += chi_normalization_table[base_value];
122 binary_native += chi_normalization_table[base_value];
125 const auto accumulators =
128 field_ct normalized = accumulators[plookup::ColumnIdx::C2][0];
129 field_ct msb = accumulators[plookup::ColumnIdx::C3][accumulators[plookup::ColumnIdx::C3].size() - 1];
134 info(
"num gates = n",
builder.get_estimated_num_finalized_gates());
136 EXPECT_EQ(proof_result,
true);
139TEST(stdlib_keccak, test_format_input_lanes)
141 GTEST_SKIP() <<
"Unneeded?";
145 for (
size_t i = 543; i < 544; ++i) {
148 for (
size_t j = 0; j < i; ++j) {
153 std::vector<uint8_t> input_v(input.begin(), input.end());
154 const size_t excess_zeroes = i % 543;
155 std::vector<uint8_t> input_padded_v(input.begin(), input.end());
156 for (
size_t k = 0; k < excess_zeroes; ++k) {
157 input_padded_v.push_back(0);
165 EXPECT_GT(result.size(), expected.size() - 1);
167 for (
size_t j = 0; j < expected.size(); ++j) {
168 EXPECT_EQ(result[j].get_value(), expected[j].get_value());
170 for (
size_t j = expected.size(); j < result.size(); ++j) {
171 EXPECT_EQ(result[j].get_value(), 0);
176 EXPECT_EQ(proof_result,
true);
179TEST(stdlib_keccak, test_single_block)
182 std::string input =
"abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01";
183 std::vector<uint8_t> input_v(input.begin(), input.end());
192 builder.print_num_estimated_finalized_gates();
195 EXPECT_EQ(proof_result,
true);
198TEST(stdlib_keccak, test_double_block)
201 GTEST_SKIP() <<
"Bug in constant case?";
204 std::string input =
"";
205 for (
size_t i = 0; i < 200; ++i) {
208 std::vector<uint8_t> input_v(input.begin(), input.end());
217 builder.print_num_estimated_finalized_gates();
220 EXPECT_EQ(proof_result,
true);
223TEST(stdlib_keccak, test_permutation_opcode_single_block)
226 std::string input =
"abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01";
227 std::vector<uint8_t> input_v(input.begin(), input.end());
236 builder.print_num_estimated_finalized_gates();
239 EXPECT_EQ(proof_result,
true);
242TEST(stdlib_keccak, test_permutation_opcode_double_block)
245 std::string input =
"";
246 for (
size_t i = 0; i < 200; ++i) {
249 std::vector<uint8_t> input_v(input.begin(), input.end());
258 builder.print_num_estimated_finalized_gates();
261 EXPECT_EQ(proof_result,
true);
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
virtual uint64_t get_random_uint64()=0
Represents a dynamic array of bytes in-circuit.
std::vector< uint8_t > get_value() const
A helper converting a byte_array into the vector of its uint8_t values.
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
static std::vector< field_ct > format_input_lanes(byte_array_ct &input)
Convert the input buffer into 8-bit keccak lanes in little-endian form. Additionally,...
static std::vector< uint8_t > hash_native(const std::vector< uint8_t > &data)
static byte_array_ct hash_using_permutation_opcode(byte_array_ct &input)
static byte_array_ct hash(byte_array_ct &input)
static constexpr uint256_t convert_to_sparse(uint256_t input)
Convert a binary integer into a base11 integer.
static plookup::ReadData< field_pt > get_lookup_accumulators(const plookup::MultiTableId id, const field_pt &key_a, const field_pt &key_b=0, const bool is_2_to_1_lookup=false)
static field_pt read_from_1_to_2_table(const plookup::MultiTableId id, const field_pt &key_a)
stdlib::witness_t< Builder > witness_ct
UltraCircuitBuilder Builder
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
TEST(MegaCircuitBuilder, CopyConstructor)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept