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: Complete, auditors: [Nishat], commit: 8c1bc925461f1ed6f3f53824646c6e971b8c6af6 }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
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 if (inputs.empty()) {
81 throw_or_abort("pedersen hash: empty input");
82 }
83
84 Element result = length_generator * Fr(inputs.size());
85 return (result + pedersen_commitment_base<Curve>::commit_native(inputs, context)).normalize().x;
86}
87
91template <typename Curve>
92typename Curve::BaseField pedersen_hash_base<Curve>::hash_buffer(const std::vector<uint8_t>& input,
94{
95 if (input.empty()) {
96 throw_or_abort("pedersen hash_buffer: empty input");
97 }
98
99 std::vector<Fq> converted = convert_buffer(input);
100
101 if (converted.size() < 2) {
102 return hash(converted, context);
103 }
104 auto result = hash({ converted[0], converted[1] }, context);
105 for (size_t i = 2; i < converted.size(); ++i) {
106 result = hash({ result, converted[i] }, context);
107 }
108 return result;
109}
110
112} // namespace bb::crypto
Performs pedersen commitments!
Definition pedersen.hpp:25
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:92
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< MemoryValue > data
StrictMock< MockContext > context
AvmProvingInputs inputs
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
grumpkin::fq Fq
void throw_or_abort(std::string const &err)