Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
c_bind.cpp
Go to the documentation of this file.
1#include "c_bind.hpp"
2#include "multisig.hpp"
3#include "schnorr.hpp"
4
5using namespace bb;
6using namespace bb::crypto;
7
11
12WASM_EXPORT void schnorr_compute_public_key(uint8_t const* private_key, uint8_t* public_key_buf)
13{
14 auto priv_key = from_buffer<grumpkin::fr>(private_key);
16 write(public_key_buf, pub_key);
17}
18
19WASM_EXPORT void schnorr_negate_public_key(uint8_t const* public_key_buffer, uint8_t* output)
20{
21 // Negate the public key (effectively negating the y-coordinate of the public key) and return the resulting public
22 // key.
23 auto account_public_key = from_buffer<grumpkin::g1::affine_element>(public_key_buffer);
24 write(output, -account_public_key);
25}
26
27WASM_EXPORT void schnorr_construct_signature(uint8_t const* message_buf,
28 uint8_t const* private_key,
29 uint8_t* s,
30 uint8_t* e)
31{
32 auto message = from_buffer<std::string>(message_buf);
33 auto priv_key = from_buffer<grumpkin::fr>(private_key);
35 crypto::schnorr_key_pair<grumpkin::fr, grumpkin::g1> key_pair = { priv_key, pub_key };
36 auto sig = crypto::schnorr_construct_signature<Blake2sHasher, grumpkin::fq>(message, key_pair);
37 write(s, sig.s);
38 write(e, sig.e);
39}
40
42 uint8_t const* message_buf, uint8_t const* pub_key, uint8_t const* sig_s, uint8_t const* sig_e, bool* result)
43{
44 auto pubk = from_buffer<grumpkin::g1::affine_element>(pub_key);
45 auto message = from_buffer<std::string>(message_buf);
46 std::array<uint8_t, 32> s;
47 std::array<uint8_t, 32> e;
48 std::copy(sig_s, sig_s + 32, s.begin());
49 std::copy(sig_e, sig_e + 32, e.begin());
50 crypto::schnorr_signature sig = { s, e };
51 *result =
52 crypto::schnorr_verify_signature<Blake2sHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message, pubk, sig);
53}
54
55WASM_EXPORT void schnorr_multisig_create_multisig_public_key(uint8_t const* private_key, uint8_t* multisig_pubkey_buf)
56{
59 auto priv_key = from_buffer<grumpkin::fr>(private_key);
61 crypto::schnorr_key_pair<grumpkin::fr, grumpkin::g1> key_pair = { priv_key, pub_key };
62
63 auto agg_pubkey = multisig_public_key(key_pair);
64
65 serialize::write(multisig_pubkey_buf, agg_pubkey);
66}
67
69 affine_element::out_buf combined_key_buf,
70 bool* success)
71{
73 auto pubkeys = from_buffer<std::vector<multisig::MultiSigPublicKey>>(signer_pubkey_buf);
74
75 auto combined_key = multisig::validate_and_combine_signer_pubkeys(pubkeys);
76
77 if (combined_key) {
78 write(combined_key_buf, *combined_key);
79 *success = true;
80 } else {
81 write(combined_key_buf, affine_element::one());
82 *success = false;
83 }
84}
85
86WASM_EXPORT void schnorr_multisig_construct_signature_round_1(uint8_t* round_one_public_output_buf,
87 uint8_t* round_one_private_output_buf)
88{
90
91 auto [public_output, private_output] = multisig::construct_signature_round_1();
92 serialize::write(round_one_public_output_buf, public_output);
93 serialize::write(round_one_private_output_buf, private_output);
94}
95
97 uint8_t const* private_key,
98 uint8_t const* signer_round_one_private_buf,
99 uint8_t const* signer_pubkeys_buf,
100 uint8_t const* round_one_public_buf,
101 uint8_t* round_two_buf,
102 bool* success)
103{
105 auto message = from_buffer<std::string>(message_buf);
106 auto priv_key = from_buffer<grumpkin::fr>(private_key);
108 crypto::schnorr_key_pair<grumpkin::fr, grumpkin::g1> key_pair = { priv_key, pub_key };
109
110 auto signer_pubkeys = from_buffer<std::vector<multisig::MultiSigPublicKey>>(signer_pubkeys_buf);
111 auto round_one_outputs = from_buffer<std::vector<multisig::RoundOnePublicOutput>>(round_one_public_buf);
112
113 auto round_one_private = from_buffer<multisig::RoundOnePrivateOutput>(signer_round_one_private_buf);
114 auto round_two_output =
115 multisig::construct_signature_round_2(message, key_pair, round_one_private, signer_pubkeys, round_one_outputs);
116
117 if (round_two_output.has_value()) {
118 write(round_two_buf, *round_two_output);
119 *success = true;
120 } else {
121 *success = false;
122 }
123}
124
125WASM_EXPORT void schnorr_multisig_combine_signatures(uint8_t const* message_buf,
126 uint8_t const* signer_pubkeys_buf,
127 uint8_t const* round_one_buf,
128 uint8_t const* round_two_buf,
129 uint8_t* s,
130 uint8_t* e,
131 bool* success)
132{
134
135 auto message = from_buffer<std::string>(message_buf);
136 auto signer_pubkeys = from_buffer<std::vector<multisig::MultiSigPublicKey>>(signer_pubkeys_buf);
137 auto round_one_outputs = from_buffer<std::vector<multisig::RoundOnePublicOutput>>(round_one_buf);
138 auto round_two_outputs = from_buffer<std::vector<multisig::RoundTwoPublicOutput>>(round_two_buf);
139
140 auto sig = multisig::combine_signatures(message, signer_pubkeys, round_one_outputs, round_two_outputs);
141
142 if (sig.has_value()) {
143 write(s, (*sig).s);
144 write(e, (*sig).e);
145 *success = true;
146 } else {
147 *success = false;
148 }
149}
Implements the SpeedyMuSig protocol; a secure 2-round interactive multisignature scheme whose signatu...
Definition multisig.hpp:28
static std::optional< schnorr_signature > combine_signatures(const std::string &message, const std::vector< MultiSigPublicKey > &signer_pubkeys, const std::vector< RoundOnePublicOutput > &round_1_nonces, const std::vector< RoundTwoPublicOutput > &round_2_signature_shares)
the final step in the SpeedyMuSig multisig scheme. Can be computed by an untrusted 3rd party....
Definition multisig.hpp:394
static std::pair< RoundOnePublicOutput, RoundOnePrivateOutput > construct_signature_round_1()
First round of SpeedyMuSig. Signers generate random nonce keypairs R = {r, [R]}, S = {s,...
Definition multisig.hpp:311
static std::optional< RoundTwoPublicOutput > construct_signature_round_2(const std::string &message, const key_pair &signer, const RoundOnePrivateOutput &signer_round_1_private_output, const std::vector< MultiSigPublicKey > &signer_pubkeys, const std::vector< RoundOnePublicOutput > &round_1_nonces)
Second round of SpeedyMuSig. Given the signer pubkeys and the output of round 1, round 2 has each sig...
Definition multisig.hpp:342
static std::optional< affine_element > validate_and_combine_signer_pubkeys(const std::vector< MultiSigPublicKey > &signer_pubkeys)
Computes the sum of all signer pubkeys. Output is the public key of the public-facing schnorr multisi...
Definition multisig.hpp:265
static constexpr affine_element one() noexcept
group_elements::affine_element< Fq, Fr, Params > affine_element
Definition group.hpp:42
static constexpr element one
Definition group.hpp:46
WASM_EXPORT void schnorr_multisig_construct_signature_round_2(uint8_t const *message_buf, uint8_t const *private_key, uint8_t const *signer_round_one_private_buf, uint8_t const *signer_pubkeys_buf, uint8_t const *round_one_public_buf, uint8_t *round_two_buf, bool *success)
Definition c_bind.cpp:96
WASM_EXPORT void schnorr_negate_public_key(uint8_t const *public_key_buffer, uint8_t *output)
Definition c_bind.cpp:19
WASM_EXPORT void schnorr_multisig_combine_signatures(uint8_t const *message_buf, uint8_t const *signer_pubkeys_buf, uint8_t const *round_one_buf, uint8_t const *round_two_buf, uint8_t *s, uint8_t *e, bool *success)
Definition c_bind.cpp:125
WASM_EXPORT void schnorr_verify_signature(uint8_t const *message_buf, uint8_t const *pub_key, uint8_t const *sig_s, uint8_t const *sig_e, bool *result)
Definition c_bind.cpp:41
WASM_EXPORT void schnorr_multisig_construct_signature_round_1(uint8_t *round_one_public_output_buf, uint8_t *round_one_private_output_buf)
Definition c_bind.cpp:86
WASM_EXPORT void schnorr_compute_public_key(uint8_t const *private_key, uint8_t *public_key_buf)
Definition c_bind.cpp:12
WASM_EXPORT void schnorr_multisig_validate_and_combine_signer_pubkeys(uint8_t const *signer_pubkey_buf, affine_element::out_buf combined_key_buf, bool *success)
Definition c_bind.cpp:68
WASM_EXPORT void schnorr_construct_signature(uint8_t const *message_buf, uint8_t const *private_key, uint8_t *s, uint8_t *e)
Definition c_bind.cpp:27
typename multisig::MultiSigPublicKey multisig_public_key
Definition c_bind.cpp:10
WASM_EXPORT void schnorr_multisig_create_multisig_public_key(uint8_t const *private_key, uint8_t *multisig_pubkey_buf)
Definition c_bind.cpp:55
void write(B &buf, SchnorrProofOfPossession< G1, Hash > const &proof_of_possession)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
void write(auto &buf, const msgpack_concepts::HasMsgPack auto &obj)
Automatically derived write for any object that defines .msgpack() (implicitly defined by MSGPACK_FIE...
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
MultiSigPublicKey wraps a signer's public key g1::affine_element along with a proof of posession: a s...
Definition multisig.hpp:51
#define WASM_EXPORT