Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
pedersen.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#include "./pedersen.hpp"
8#include "../pedersen_commitment/pedersen.hpp"
9
10namespace bb::crypto {
11
22template <typename Curve>
24{
25 const size_t num_bytes = input.size();
26 const size_t bytes_per_element = 31;
27 size_t num_elements = static_cast<size_t>(num_bytes % bytes_per_element != 0) + (num_bytes / bytes_per_element);
28
29 const auto slice = [](const std::vector<uint8_t>& data, const size_t start, const size_t slice_size) {
30 uint256_t result(0);
31 for (size_t i = 0; i < slice_size; ++i) {
32 result = (result << uint256_t(8));
33 result += uint256_t(data[i + start]);
34 }
35 return Fq(result);
36 };
37
38 std::vector<Fq> elements;
39 for (size_t i = 0; i < num_elements - 1; ++i) {
40 size_t bytes_to_slice = bytes_per_element;
41 Fq element = slice(input, i * bytes_per_element, bytes_to_slice);
42 elements.emplace_back(element);
43 }
44 size_t bytes_to_slice = num_bytes - ((num_elements - 1) * bytes_per_element);
45 Fq element = slice(input, (num_elements - 1) * bytes_per_element, bytes_to_slice);
46 elements.emplace_back(element);
47 return elements;
48}
49
77template <typename Curve>
79{
80 Element result = length_generator * Fr(inputs.size());
81 return (result + pedersen_commitment_base<Curve>::commit_native(inputs, context)).normalize().x;
82}
83
87template <typename Curve>
88typename Curve::BaseField pedersen_hash_base<Curve>::hash_buffer(const std::vector<uint8_t>& input,
90{
91 std::vector<Fq> converted = convert_buffer(input);
92
93 if (converted.size() < 2) {
94 return hash(converted, context);
95 }
96 auto result = hash({ converted[0], converted[1] }, context);
97 for (size_t i = 2; i < converted.size(); ++i) {
98 result = hash({ result, converted[i] }, context);
99 }
100 return result;
101}
102
104} // namespace bb::crypto
Performs pedersen commitments!
Definition pedersen.hpp:27
Performs pedersen hashes!
Definition pedersen.hpp:30
typename crypto::GeneratorContext< Curve > GeneratorContext
Definition pedersen.hpp:37
typename Curve::BaseField Fq
Definition pedersen.hpp:34
static std::vector< Fq > convert_buffer(const std::vector< uint8_t > &input)
Converts input uint8_t buffers into vector of field elements. Used to hash the Transcript in a SNARK-...
Definition pedersen.cpp:23
static Fq hash_buffer(const std::vector< uint8_t > &input, GeneratorContext context={})
Given an arbitrary length of bytes, convert them to fields and hash the result using the default gene...
Definition pedersen.cpp:88
typename Curve::Element Element
Definition pedersen.hpp:33
static Fq hash(const std::vector< Fq > &inputs, GeneratorContext context={})
Given a vector of fields, generate a pedersen hash using generators from context.
Definition pedersen.cpp:78
const std::vector< FF > data
StrictMock< MockContext > context
void hash(State &state) noexcept
C slice(C const &container, size_t start)
Definition container.hpp:9
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Curve::ScalarField Fr
bb::fq Fq