purify
C++ Purify implementation with native circuit and BPP support
Loading...
Searching...
No Matches
bppp.hpp
Go to the documentation of this file.
1// Copyright (c) 2026 Judica, Inc.
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or https://opensource.org/license/mit/.
4
9
10#pragma once
11
12#include <array>
13#include <cstddef>
14#include <memory>
15#include <span>
16#include <utility>
17#include <vector>
18
19#include "purify/api.hpp"
20
22
23namespace purify::bppp {
24
25namespace detail {
27}
28
30using ScalarBytes = std::array<unsigned char, 32>;
32using PointBytes = std::array<unsigned char, 33>;
34using GeneratorBytes = std::array<unsigned char, 33>;
35
46
55 const ScalarBytes& value,
56 purify_secp_context* secp_context);
57
68 const ScalarBytes& value,
69 purify_secp_context* secp_context,
70 const GeneratorBytes& value_gen,
71 const GeneratorBytes& blind_gen);
72
79 return value.to_bytes_be();
80}
81
87inline std::vector<ScalarBytes> scalar_bytes(const std::vector<FieldElement>& values) {
88 std::vector<ScalarBytes> out;
89 out.reserve(values.size());
90 for (const FieldElement& value : values) {
91 out.push_back(scalar_bytes(value));
92 }
93 return out;
94}
95
103 std::vector<PointBytes> generators;
104 std::vector<ScalarBytes> n_vec;
105 std::vector<ScalarBytes> l_vec;
106 std::vector<ScalarBytes> c_vec;
107};
108
111
115 std::vector<PointBytes> generators;
116 std::vector<ScalarBytes> c_vec;
117 std::size_t n_vec_len = 0;
121};
122
125public:
131
132protected:
134
135private:
137
138 [[nodiscard]] virtual std::shared_ptr<const void> find_public_data_impl(
139 const std::array<unsigned char, 32>& key) const = 0;
140 virtual void insert_public_data_impl(std::array<unsigned char, 32> key,
141 std::shared_ptr<const void> value) = 0;
142 [[nodiscard]] virtual purify_bppp_backend_resources* get_or_create_backend_resources_impl(
143 std::span<const PointBytes> generators,
144 purify_secp_context* secp_context) = 0;
145};
146
148namespace detail {
150 [[nodiscard]] static std::shared_ptr<const void> find_public_data(
151 const ExperimentalCircuitBackend* backend,
152 const std::array<unsigned char, 32>& key);
154 std::array<unsigned char, 32> key,
155 std::shared_ptr<const void> value);
158 std::span<const PointBytes> generators,
159 purify_secp_context* secp_context);
160};
161} // namespace detail
162
165public:
172
173 [[nodiscard]] bool empty() const noexcept;
174
175private:
176 struct Impl;
177 std::unique_ptr<Impl> impl_;
178
179 [[nodiscard]] std::shared_ptr<const void> find_public_data_impl(
180 const std::array<unsigned char, 32>& key) const override;
181 void insert_public_data_impl(std::array<unsigned char, 32> key,
182 std::shared_ptr<const void> value) override;
183 [[nodiscard]] purify_bppp_backend_resources* get_or_create_backend_resources_impl(
184 std::span<const PointBytes> generators,
185 purify_secp_context* secp_context) override;
186
188};
189
192public:
199
200 void clear();
201 [[nodiscard]] std::size_t size() const noexcept;
213 std::span<const PointBytes> generators) const;
215 [[nodiscard]] std::shared_ptr<const void> find_public_data(const std::array<unsigned char, 32>& key) const;
217 void insert_public_data(std::array<unsigned char, 32> key, std::shared_ptr<const void> value);
220 std::span<const PointBytes> generators,
221 purify_secp_context* secp_context);
222
223private:
224 struct Impl;
225 std::unique_ptr<Impl> impl_;
226
227 [[nodiscard]] std::shared_ptr<const void> find_public_data_impl(
228 const std::array<unsigned char, 32>& key) const override;
229 void insert_public_data_impl(std::array<unsigned char, 32> key,
230 std::shared_ptr<const void> value) override;
231 [[nodiscard]] purify_bppp_backend_resources* get_or_create_backend_resources_impl(
232 std::span<const PointBytes> generators,
233 purify_secp_context* secp_context) override;
234};
235
246 const PointBytes& commitment,
247 purify_secp_context* secp_context);
254bool verify_norm_arg(const NormArgProof& proof, purify_secp_context* secp_context);
255
261
270
279 const NativeBulletproofCircuit& circuit,
280 const BulletproofAssignmentData& assignment,
281 purify_secp_context* secp_context,
282 std::span<const unsigned char> statement_binding = {},
283 ExperimentalCircuitBackend* cache = nullptr);
284
292Result<ExperimentalCircuitNormArgProof> prove_experimental_circuit_norm_arg(
293 const NativeBulletproofCircuit& circuit,
294 const BulletproofAssignmentData& assignment,
295 purify_secp_context* secp_context,
296 std::span<const unsigned char> statement_binding = {},
297 ExperimentalCircuitBackend* cache = nullptr);
298
307Result<ExperimentalCircuitNormArgProof> prove_experimental_circuit_norm_arg_to_commitment(
308 const NativeBulletproofCircuit& circuit,
309 const BulletproofAssignmentData& assignment,
310 const PointBytes& witness_commitment,
311 purify_secp_context* secp_context,
312 std::span<const unsigned char> statement_binding = {},
313 ExperimentalCircuitBackend* cache = nullptr);
314
323 const NativeBulletproofCircuit& circuit,
324 const ExperimentalCircuitNormArgProof& proof,
325 purify_secp_context* secp_context,
326 std::span<const unsigned char> statement_binding = {},
327 ExperimentalCircuitBackend* cache = nullptr);
328
343Result<ExperimentalCircuitZkNormArgProof> prove_experimental_circuit_zk_norm_arg(
344 const NativeBulletproofCircuit& circuit,
345 const BulletproofAssignmentData& assignment,
346 const ScalarBytes& nonce,
347 purify_secp_context* secp_context,
348 std::span<const unsigned char> statement_binding = {},
349 ExperimentalCircuitBackend* cache = nullptr);
350
359 const NativeBulletproofCircuit& circuit,
360 const ExperimentalCircuitZkNormArgProof& proof,
361 purify_secp_context* secp_context,
362 std::span<const unsigned char> statement_binding = {},
363 ExperimentalCircuitBackend* cache = nullptr);
364
372Result<ExperimentalCircuitZkNormArgProof> prove_experimental_circuit_zk_norm_arg_with_public_commitments(
373 const NativeBulletproofCircuit& circuit,
374 const BulletproofAssignmentData& assignment,
375 const ScalarBytes& nonce,
376 std::span<const PointBytes> public_commitments,
377 purify_secp_context* secp_context,
378 std::span<const unsigned char> statement_binding = {},
379 ExperimentalCircuitBackend* cache = nullptr);
380
388 const NativeBulletproofCircuit& circuit,
389 const ExperimentalCircuitZkNormArgProof& proof,
390 std::span<const PointBytes> public_commitments,
391 purify_secp_context* secp_context,
392 std::span<const unsigned char> statement_binding = {},
393 ExperimentalCircuitBackend* cache = nullptr);
394
402
412 const ScalarBytes& blind,
413 purify_secp_context* secp_context);
414
426 const SecretKey& secret,
427 const ScalarBytes& blind,
428 purify_secp_context* secp_context,
429 const GeneratorBytes& value_gen,
430 const GeneratorBytes& blind_gen);
431
432} // namespace purify::bppp
High-level Purify key generation, evaluation, witness generation, and circuit helpers.
Field element modulo the backend scalar field used by this implementation.
Definition numeric.hpp:815
std::array< unsigned char, 32 > to_bytes_be() const
Serializes the field element in big-endian form.
Definition numeric.cpp:84
Move-only packed Purify secret stored in dedicated heap memory.
Definition secret.hpp:52
Common interface for reusable experimental BPPP backend state.
Definition bppp.hpp:124
ExperimentalCircuitBackend(const ExperimentalCircuitBackend &)=delete
ExperimentalCircuitBackend & operator=(const ExperimentalCircuitBackend &)=delete
ExperimentalCircuitBackend(ExperimentalCircuitBackend &&) noexcept=default
friend struct detail::ExperimentalCircuitBackendAccess
Definition bppp.hpp:136
Thread-local clone of one warmed experimental BPPP backend-resource line.
Definition bppp.hpp:164
ExperimentalCircuitCacheLine & operator=(const ExperimentalCircuitCacheLine &)=delete
ExperimentalCircuitCacheLine(const ExperimentalCircuitCacheLine &)=delete
ExperimentalCircuitCacheLine & operator=(ExperimentalCircuitCacheLine &&other) noexcept
ExperimentalCircuitCacheLine(ExperimentalCircuitCacheLine &&other) noexcept
ExperimentalCircuitCache & operator=(const ExperimentalCircuitCache &)=delete
ExperimentalCircuitCache(ExperimentalCircuitCache &&other) noexcept
Result< ExperimentalCircuitCacheLine > clone_line_for_thread(std::span< const PointBytes > generators) const
Clones one warmed backend-resource line for thread-local use.
Definition bppp.cpp:182
std::shared_ptr< const void > find_public_data(const std::array< unsigned char, 32 > &key) const
Looks up opaque cached reduction data by digest key.
Definition bppp.cpp:208
void insert_public_data(std::array< unsigned char, 32 > key, std::shared_ptr< const void > value)
Stores opaque cached reduction data by digest key.
Definition bppp.cpp:213
purify_bppp_backend_resources * get_or_create_backend_resources(std::span< const PointBytes > generators, purify_secp_context *secp_context)
Returns cached backend resources for this generator set, creating them on first use.
Definition bppp.cpp:220
ExperimentalCircuitCache & operator=(ExperimentalCircuitCache &&other) noexcept
std::size_t size() const noexcept
Definition bppp.cpp:176
ExperimentalCircuitCache(const ExperimentalCircuitCache &)=delete
Internal access helpers for experimental BPPP backend implementations.
Definition bppp.hpp:25
Result< NormArgProof > prove_norm_arg_to_commitment(const NormArgInputs &inputs, const PointBytes &commitment, purify_secp_context *secp_context)
Produces a standalone BPPP norm argument anchored to a caller-supplied public commitment.
Definition bppp.cpp:1292
Result< PointBytes > commit_experimental_circuit_witness(const NativeBulletproofCircuit &circuit, const BulletproofAssignmentData &assignment, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Commits to the reduced witness coordinates used by the experimental circuit-to-BPPP reduction.
Definition bppp.cpp:1303
Result< PointBytes > commit_norm_arg(const NormArgInputs &inputs, purify_secp_context *secp_context)
Computes the public BPPP commitment for a standalone norm-argument input bundle.
Definition bppp.cpp:1286
Result< bool > verify_experimental_circuit_norm_arg(const NativeBulletproofCircuit &circuit, const ExperimentalCircuitNormArgProof &proof, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Verifies an experimental transparent circuit proof produced by prove_experimental_circuit_norm_arg.
Definition bppp.cpp:1394
GeneratorBytes base_generator(purify_secp_context *secp_context)
Returns the serialized secp256k1 base generator used as the blind generator.
Definition bppp.cpp:1064
Result< bool > verify_experimental_circuit_zk_norm_arg_with_public_commitments(const NativeBulletproofCircuit &circuit, const ExperimentalCircuitZkNormArgProof &proof, std::span< const PointBytes > public_commitments, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Verifies an experimental masked circuit proof against explicit public commitment points.
Definition bppp.cpp:1770
bool verify_norm_arg(const NormArgProof &proof, purify_secp_context *secp_context)
Verifies a standalone BPPP norm argument.
Definition bppp.cpp:1298
Result< ExperimentalCircuitZkNormArgProof > prove_experimental_circuit_zk_norm_arg_with_public_commitments(const NativeBulletproofCircuit &circuit, const BulletproofAssignmentData &assignment, const ScalarBytes &nonce, std::span< const PointBytes > public_commitments, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Produces an experimental masked circuit proof bound to explicit public commitment points.
Definition bppp.cpp:1758
GeneratorBytes value_generator_h(purify_secp_context *secp_context)
Returns the serialized alternate generator used for committed values.
Definition bppp.cpp:1073
Result< CommittedPurifyWitness > commit_output_witness(const Bytes &message, const SecretKey &secret, const ScalarBytes &blind, purify_secp_context *secp_context)
Evaluates Purify, derives its witness, and commits to the output using Purify's default generators.
Definition bppp.cpp:1782
Result< NormArgProof > prove_norm_arg(const NormArgInputs &inputs, purify_secp_context *secp_context)
Produces a standalone BPPP norm argument.
Definition bppp.cpp:1180
Result< std::vector< PointBytes > > create_generators(std::size_t count, purify_secp_context *secp_context)
Expands the BPPP generator list.
Definition bppp.cpp:1083
std::array< unsigned char, 33 > PointBytes
Compressed 33-byte curve-point encoding.
Definition bppp.hpp:32
Result< bool > verify_experimental_circuit_zk_norm_arg(const NativeBulletproofCircuit &circuit, const ExperimentalCircuitZkNormArgProof &proof, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Verifies an experimental masked circuit proof produced by prove_experimental_circuit_zk_norm_arg.
Definition bppp.cpp:1747
std::array< unsigned char, 33 > GeneratorBytes
Serialized generator encoding used by the BPPP bridge.
Definition bppp.hpp:34
Result< PointBytes > pedersen_commit_char(const ScalarBytes &blind, const ScalarBytes &value, purify_secp_context *secp_context)
Computes a Pedersen commitment to an arbitrary 32-byte scalar value using Purify's default generators...
Definition bppp.cpp:1155
ScalarBytes scalar_bytes(const FieldElement &value)
Serializes a Purify field element into the scalar encoding expected by the BPPP bridge.
Definition bppp.hpp:78
Result< ExperimentalCircuitZkNormArgProof > prove_experimental_circuit_zk_norm_arg(const NativeBulletproofCircuit &circuit, const BulletproofAssignmentData &assignment, const ScalarBytes &nonce, purify_secp_context *secp_context, std::span< const unsigned char > statement_binding={}, ExperimentalCircuitBackend *cache=nullptr)
Produces an experimental masked circuit proof over the reduced BPPP relation.
Definition bppp.cpp:1737
std::array< unsigned char, 32 > ScalarBytes
Big-endian 32-byte scalar encoding.
Definition bppp.hpp:30
BigUInt< 8 > UInt512
512-bit unsigned integer used for private and packed public keys.
Definition numeric.hpp:802
Expected< T, Error > Result
Expected-returning convenience alias for Purify value-producing APIs.
Definition error.hpp:99
std::vector< unsigned char > Bytes
Dynamically sized byte string used for messages, serialized witnesses, and proofs.
Definition common.hpp:99
struct purify_secp_context purify_secp_context
Caller-owned reusable secp256k1 context handle shared across Purify C and C++ APIs.
Columnar witness assignment compatible with the native Bulletproof circuit layout.
Native in-memory representation of a Bulletproof-style arithmetic circuit.
Purify witness bundle together with a Pedersen commitment to the output.
Definition bppp.hpp:396
BulletproofAssignmentData assignment
Definition bppp.hpp:399
Experimental transparent circuit proof backed by the standalone BPPP norm argument.
Definition bppp.hpp:257
Experimental masked circuit proof that hides the reduced witness before the final BPPP argument.
Definition bppp.hpp:263
PointBytes a_commitment
Witness-only outer A commitment; verifiers re-anchor it to the public statement.
Definition bppp.hpp:265
Inputs for norm commitment computation and standalone BPPP proofs. Proving requires power-of-two vect...
Definition bppp.hpp:101
std::vector< ScalarBytes > l_vec
Definition bppp.hpp:105
std::vector< PointBytes > generators
Definition bppp.hpp:103
std::vector< ScalarBytes > n_vec
Definition bppp.hpp:104
std::vector< ScalarBytes > c_vec
Definition bppp.hpp:106
Standalone BPPP norm-argument proof bundle with all verifier-side inputs.
Definition bppp.hpp:113
std::vector< PointBytes > generators
Definition bppp.hpp:115
std::vector< ScalarBytes > c_vec
Definition bppp.hpp:116
PointBytes commitment
Finite compressed initial point; infinity is not accepted.
Definition bppp.hpp:119
static purify_bppp_backend_resources * get_or_create_backend_resources(ExperimentalCircuitBackend *backend, std::span< const PointBytes > generators, purify_secp_context *secp_context)
Definition bppp.cpp:91
static std::shared_ptr< const void > find_public_data(const ExperimentalCircuitBackend *backend, const std::array< unsigned char, 32 > &key)
Definition bppp.cpp:75
static void insert_public_data(ExperimentalCircuitBackend *backend, std::array< unsigned char, 32 > key, std::shared_ptr< const void > value)
Definition bppp.cpp:82