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// === 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 "ecdsa.hpp"
10
11using namespace bb;
12using namespace bb::crypto;
13
14template <typename fr, typename g1> void ecdsa__compute_public_key(uint8_t const* private_key, uint8_t* public_key_buf)
15{
16 auto priv_key = from_buffer<fr>(private_key);
17 typename g1::affine_element pub_key = g1::one * priv_key;
18 write(public_key_buf, pub_key);
19}
20
21WASM_EXPORT void ecdsa__compute_public_key(uint8_t const* private_key, uint8_t* public_key_buf)
22{
23 ecdsa__compute_public_key<secp256k1::fr, secp256k1::g1>(private_key, public_key_buf);
24}
25
26WASM_EXPORT void ecdsa_r_compute_public_key(uint8_t const* private_key, uint8_t* public_key_buf)
27{
28 ecdsa__compute_public_key<secp256r1::fr, secp256r1::g1>(private_key, public_key_buf);
29}
30
31template <typename fr, typename fq, typename g1>
32void ecdsa__construct_signature(uint8_t const* message,
33 size_t msg_len,
34 uint8_t const* private_key,
35 uint8_t* output_sig_r,
36 uint8_t* output_sig_s,
37 uint8_t* output_sig_v)
38{
39 using serialize::write;
40 auto priv_key = from_buffer<fr>(private_key);
41 auto pub_key = g1::one * priv_key;
42 ecdsa_key_pair<fr, g1> key_pair = { priv_key, pub_key };
43
44 auto sig = ecdsa_construct_signature<Sha256Hasher, fq, fr, g1>(std::string((char*)message, msg_len), key_pair);
45 write(output_sig_r, sig.r);
46 write(output_sig_s, sig.s);
47 write(output_sig_v, sig.v);
48}
49
50WASM_EXPORT void ecdsa__construct_signature(uint8_t const* message,
51 size_t msg_len,
52 uint8_t const* private_key,
53 uint8_t* output_sig_r,
54 uint8_t* output_sig_s,
55 uint8_t* output_sig_v)
56{
57 ecdsa__construct_signature<secp256k1::fr, secp256k1::fq, secp256k1::g1>(
58 message, msg_len, private_key, output_sig_r, output_sig_s, output_sig_v);
59}
60
61WASM_EXPORT void ecdsa_r_construct_signature(uint8_t const* message,
62 size_t msg_len,
63 uint8_t const* private_key,
64 uint8_t* output_sig_r,
65 uint8_t* output_sig_s,
66 uint8_t* output_sig_v)
67{
68 ecdsa__construct_signature<secp256r1::fr, secp256r1::fq, secp256r1::g1>(
69 message, msg_len, private_key, output_sig_r, output_sig_s, output_sig_v);
70}
71
72template <typename fr, typename fq, typename g1>
73void ecdsa__construct_signature_(uint8_t const* message_buf,
74 uint8_t const* private_key,
75 uint8_t* output_sig_r,
76 uint8_t* output_sig_s,
77 uint8_t* output_sig_v)
78{
79 using serialize::write;
80 auto priv_key = from_buffer<fr>(private_key);
81 auto pub_key = g1::one * priv_key;
82 ecdsa_key_pair<fr, g1> key_pair = { priv_key, pub_key };
83
84 auto message = from_buffer<std::string>(message_buf);
85
86 auto sig = ecdsa_construct_signature<Sha256Hasher, fq, fr, g1>(message, key_pair);
87 write(output_sig_r, sig.r);
88 write(output_sig_s, sig.s);
89 write(output_sig_v, sig.v);
90}
91
92WASM_EXPORT void ecdsa__construct_signature_(uint8_t const* message_buf,
93 uint8_t const* private_key,
94 uint8_t* output_sig_r,
95 uint8_t* output_sig_s,
96 uint8_t* output_sig_v)
97{
98 ecdsa__construct_signature_<secp256k1::fr, secp256k1::fq, secp256k1::g1>(
99 message_buf, private_key, output_sig_r, output_sig_s, output_sig_v);
100}
101
102WASM_EXPORT void ecdsa_r_construct_signature_(uint8_t const* message_buf,
103 uint8_t const* private_key,
104 uint8_t* output_sig_r,
105 uint8_t* output_sig_s,
106 uint8_t* output_sig_v)
107{
108 ecdsa__construct_signature_<secp256r1::fr, secp256r1::fq, secp256r1::g1>(
109 message_buf, private_key, output_sig_r, output_sig_s, output_sig_v);
110}
111
112template <typename fr, typename fq, typename g1>
114 size_t msg_len,
115 uint8_t const* sig_r,
116 uint8_t const* sig_s,
117 uint8_t* sig_v,
118 uint8_t* output_pub_key)
119{
120 std::array<uint8_t, 32> r, s;
121 std::copy(sig_r, sig_r + 32, r.begin());
122 std::copy(sig_s, sig_s + 32, s.begin());
123 const uint8_t v = *sig_v;
124
125 ecdsa_signature sig = { r, s, v };
126 auto recovered_pub_key =
127 ecdsa_recover_public_key<Sha256Hasher, fq, fr, g1>(std::string((char*)message, msg_len), sig);
128 write(output_pub_key, recovered_pub_key);
129}
130
132 size_t msg_len,
133 uint8_t const* sig_r,
134 uint8_t const* sig_s,
135 uint8_t* sig_v,
136 uint8_t* output_pub_key)
137{
138 ecdsa__recover_public_key_from_signature<secp256k1::fr, secp256k1::fq, secp256k1::g1>(
139 message, msg_len, sig_r, sig_s, sig_v, output_pub_key);
140}
141
143 size_t msg_len,
144 uint8_t const* sig_r,
145 uint8_t const* sig_s,
146 uint8_t* sig_v,
147 uint8_t* output_pub_key)
148{
149 ecdsa__recover_public_key_from_signature<secp256r1::fr, secp256r1::fq, secp256r1::g1>(
150 message, msg_len, sig_r, sig_s, sig_v, output_pub_key);
151}
152
153template <typename fr, typename fq, typename g1>
155 uint8_t const* message_buf, uint8_t const* sig_r, uint8_t const* sig_s, uint8_t* sig_v, uint8_t* output_pub_key)
156{
157 std::array<uint8_t, 32> r, s;
158 std::copy(sig_r, sig_r + 32, r.begin());
159 std::copy(sig_s, sig_s + 32, s.begin());
160 const uint8_t v = *sig_v;
161
162 auto message = from_buffer<std::string>(message_buf);
163 ecdsa_signature sig = { r, s, v };
164 auto recovered_pub_key = ecdsa_recover_public_key<Sha256Hasher, fq, fr, g1>(message, sig);
165 write(output_pub_key, recovered_pub_key);
166}
167
169 uint8_t const* message_buf, uint8_t const* sig_r, uint8_t const* sig_s, uint8_t* sig_v, uint8_t* output_pub_key)
170{
171 ecdsa__recover_public_key_from_signature_<secp256k1::fr, secp256k1::fq, secp256k1::g1>(
172 message_buf, sig_r, sig_s, sig_v, output_pub_key);
173}
174
176 uint8_t const* message_buf, uint8_t const* sig_r, uint8_t const* sig_s, uint8_t* sig_v, uint8_t* output_pub_key)
177{
178 ecdsa__recover_public_key_from_signature_<secp256r1::fr, secp256r1::fq, secp256r1::g1>(
179 message_buf, sig_r, sig_s, sig_v, output_pub_key);
180}
181
182template <typename fr, typename fq, typename g1>
183bool ecdsa__verify_signature(uint8_t const* message,
184 size_t msg_len,
185 uint8_t const* pub_key,
186 uint8_t const* sig_r,
187 uint8_t const* sig_s,
188 uint8_t const* sig_v)
189{
190 auto pubk = from_buffer<typename g1::affine_element>(pub_key);
191 std::array<uint8_t, 32> r, s;
192 std::copy(sig_r, sig_r + 32, r.begin());
193 std::copy(sig_s, sig_s + 32, s.begin());
194 const uint8_t v = *sig_v;
195
196 ecdsa_signature sig = { r, s, v };
197 return ecdsa_verify_signature<Sha256Hasher, fq, fr, g1>(std::string((char*)message, msg_len), pubk, sig);
198}
199
200WASM_EXPORT bool ecdsa__verify_signature(uint8_t const* message,
201 size_t msg_len,
202 uint8_t const* pub_key,
203 uint8_t const* sig_r,
204 uint8_t const* sig_s,
205 uint8_t const* sig_v)
206{
207 return ecdsa__verify_signature<secp256k1::fr, secp256k1::fq, secp256k1::g1>(
208 message, msg_len, pub_key, sig_r, sig_s, sig_v);
209}
210
211WASM_EXPORT bool ecdsa_r_verify_signature(uint8_t const* message,
212 size_t msg_len,
213 uint8_t const* pub_key,
214 uint8_t const* sig_r,
215 uint8_t const* sig_s,
216 uint8_t const* sig_v)
217{
218 return ecdsa__verify_signature<secp256r1::fr, secp256r1::fq, secp256r1::g1>(
219 message, msg_len, pub_key, sig_r, sig_s, sig_v);
220}
221
222template <typename fr, typename fq, typename g1>
223void ecdsa__verify_signature_(uint8_t const* message_buf,
224 uint8_t const* pub_key,
225 uint8_t const* sig_r,
226 uint8_t const* sig_s,
227 uint8_t const* sig_v,
228 bool* result)
229{
230 auto pubk = from_buffer<typename g1::affine_element>(pub_key);
231 std::array<uint8_t, 32> r, s;
232 std::copy(sig_r, sig_r + 32, r.begin());
233 std::copy(sig_s, sig_s + 32, s.begin());
234 const uint8_t v = *sig_v;
235
236 auto message = from_buffer<std::string>(message_buf);
237 ecdsa_signature sig = { r, s, v };
238 *result = ecdsa_verify_signature<Sha256Hasher, fq, fr, g1>(message, pubk, sig);
239}
240
241WASM_EXPORT void ecdsa__verify_signature_(uint8_t const* message,
242 uint8_t const* pub_key,
243 uint8_t const* sig_r,
244 uint8_t const* sig_s,
245 uint8_t const* sig_v,
246 bool* result)
247{
248 ecdsa__verify_signature_<secp256k1::fr, secp256k1::fq, secp256k1::g1>(
249 message, pub_key, sig_r, sig_s, sig_v, result);
250}
251
252WASM_EXPORT void ecdsa_r_verify_signature_(uint8_t const* message,
253 uint8_t const* pub_key,
254 uint8_t const* sig_r,
255 uint8_t const* sig_s,
256 uint8_t const* sig_v,
257 bool* result)
258{
259 ecdsa__verify_signature_<secp256r1::fr, secp256r1::fq, secp256r1::g1>(
260 message, pub_key, sig_r, sig_s, sig_v, result);
261}
static constexpr element one
Definition group.hpp:46
WASM_EXPORT void ecdsa_r_recover_public_key_from_signature_(uint8_t const *message_buf, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t *sig_v, uint8_t *output_pub_key)
Definition c_bind.cpp:175
bool ecdsa__verify_signature(uint8_t const *message, size_t msg_len, uint8_t const *pub_key, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t const *sig_v)
Definition c_bind.cpp:183
WASM_EXPORT bool ecdsa_r_verify_signature(uint8_t const *message, size_t msg_len, uint8_t const *pub_key, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t const *sig_v)
Definition c_bind.cpp:211
WASM_EXPORT void ecdsa_r_compute_public_key(uint8_t const *private_key, uint8_t *public_key_buf)
Definition c_bind.cpp:26
WASM_EXPORT void ecdsa_r_construct_signature_(uint8_t const *message_buf, uint8_t const *private_key, uint8_t *output_sig_r, uint8_t *output_sig_s, uint8_t *output_sig_v)
Definition c_bind.cpp:102
void ecdsa__construct_signature(uint8_t const *message, size_t msg_len, uint8_t const *private_key, uint8_t *output_sig_r, uint8_t *output_sig_s, uint8_t *output_sig_v)
Definition c_bind.cpp:32
void ecdsa__recover_public_key_from_signature(uint8_t const *message, size_t msg_len, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t *sig_v, uint8_t *output_pub_key)
Definition c_bind.cpp:113
WASM_EXPORT void ecdsa_r_construct_signature(uint8_t const *message, size_t msg_len, uint8_t const *private_key, uint8_t *output_sig_r, uint8_t *output_sig_s, uint8_t *output_sig_v)
Definition c_bind.cpp:61
void ecdsa__recover_public_key_from_signature_(uint8_t const *message_buf, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t *sig_v, uint8_t *output_pub_key)
Definition c_bind.cpp:154
void ecdsa__compute_public_key(uint8_t const *private_key, uint8_t *public_key_buf)
Definition c_bind.cpp:14
WASM_EXPORT void ecdsa_r_recover_public_key_from_signature(uint8_t const *message, size_t msg_len, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t *sig_v, uint8_t *output_pub_key)
Definition c_bind.cpp:142
WASM_EXPORT void ecdsa_r_verify_signature_(uint8_t const *message, uint8_t const *pub_key, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t const *sig_v, bool *result)
Definition c_bind.cpp:252
void ecdsa__construct_signature_(uint8_t const *message_buf, uint8_t const *private_key, uint8_t *output_sig_r, uint8_t *output_sig_s, uint8_t *output_sig_v)
Definition c_bind.cpp:73
void ecdsa__verify_signature_(uint8_t const *message_buf, uint8_t const *pub_key, uint8_t const *sig_r, uint8_t const *sig_s, uint8_t const *sig_v, bool *result)
Definition c_bind.cpp:223
void write(B &buf, SchnorrProofOfPossession< G1, Hash > const &proof_of_possession)
Entry point for Barretenberg command-line interface.
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
#define WASM_EXPORT