5#include <gtest/gtest.h>
14TEST(schnorr, verify_signature)
22 auto sig = schnorr_construct_signature<Fr, G1>(message_field, account);
23 bool result = schnorr_verify_signature<Fr, G1>(message_field, account.
public_key, sig);
28TEST(schnorr, verify_signature_failure_wrong_message)
37 auto sig = schnorr_construct_signature<Fr, G1>(message_field, account);
38 bool result = schnorr_verify_signature<Fr, G1>(wrong_message, account.
public_key, sig);
43TEST(schnorr, verify_signature_failure_wrong_key)
51 auto sig = schnorr_construct_signature<Fr, G1>(message_field, account);
54 bool result = schnorr_verify_signature<Fr, G1>(message_field, wrong_key, sig);
59TEST(schnorr, signatures_not_deterministic)
67 auto sig_a = schnorr_construct_signature<Fr, G1>(message_field, account);
68 auto sig_b = schnorr_construct_signature<Fr, G1>(message_field, account);
71 EXPECT_NE(sig_a.e, sig_b.e);
72 EXPECT_NE(sig_a.s, sig_b.s);
75 bool result_a = schnorr_verify_signature<Fr, G1>(message_field, account.
public_key, sig_a);
76 EXPECT_TRUE(result_a);
77 bool result_b = schnorr_verify_signature<Fr, G1>(message_field, account.
public_key, sig_b);
78 EXPECT_TRUE(result_b);
87TEST(schnorr, signature_internals_consistency)
90 Fr private_key =
Fr(12345);
94 Fq message_field =
Fq(67890);
96 auto sig = schnorr_construct_signature<Fr, G1>(message_field, account);
103 { compute_schnorr_challenge_dst<Fq>(), R.x, public_key.x, public_key.y, message_field });
106 std::array<uint8_t, 32> expected_e_buf;
111 EXPECT_EQ(sig.e, expected_e_scalar);
114 EXPECT_FALSE(R.is_point_at_infinity());
125TEST(schnorr, challenge_dst_pinned)
127 Fq derived = compute_schnorr_challenge_dst<Fq>();
128 EXPECT_EQ(derived,
Fq(std::string(
"0x024c76938ed06b8ec1d9094b1013d190baa4011372f0604643bda812a63b832e")));
137TEST(schnorr, cross_field_serialization_is_lossless)
139 for (
int i = 0; i < 100; i++) {
144 std::array<uint8_t, 32> buf;
151 std::array<uint8_t, 32> buf2;
155 EXPECT_EQ(buf, buf2);
165TEST(schnorr, bbapi_byte_interface_round_trip)
173 std::array<uint8_t, 32> message_bytes;
178 EXPECT_EQ(original_message, deserialized_message);
181 auto sig = schnorr_construct_signature<Fr, G1>(deserialized_message, account);
182 bool result = schnorr_verify_signature<Fr, G1>(original_message, public_key, sig);
194struct DeterministicSig {
203DeterministicSig build_deterministic_sig(
const Fr& private_key,
const Fr& nonce_k,
const Fq& message_field)
205 DeterministicSig out;
208 out.e_base = schnorr_generate_challenge<G1>(message_field, out.public_key, out.R);
209 std::array<uint8_t, 32> e_buf;
212 out.s = nonce_k - private_key * out.e_scalar;
214 out.sig.e = out.e_scalar;
218void dump_vector(
const char* label,
const Fr& private_key,
const Fr& nonce_k,
const Fq& message_field)
220 auto v = build_deterministic_sig(private_key, nonce_k, message_field);
221 info(
"=== ", label,
" ===");
222 info(
" private_key = ", private_key);
223 info(
" nonce_k = ", nonce_k);
224 info(
" message = ", message_field);
225 info(
" public_key.x = ", v.public_key.x);
226 info(
" public_key.y = ", v.public_key.y);
227 info(
" R.x = ", v.R.x);
228 info(
" R.y = ", v.R.y);
230 info(
" e = ", v.e_scalar);
242TEST(schnorr, pinned_test_vector_small)
244 Fr private_key(std::string(
"0x000000000000000000000000000000000000000000000000000000000000007b"));
245 Fr nonce_k(std::string(
"0x00000000000000000000000000000000000000000000000000000000000001c8"));
246 Fq message_field(std::string(
"0x00000000000000000000000000000000000000000000000000000000000002bc"));
248 auto v = build_deterministic_sig(private_key, nonce_k, message_field);
249 dump_vector(
"pinned_test_vector_small", private_key, nonce_k, message_field);
251 bool ok = schnorr_verify_signature<Fr, G1>(message_field, v.public_key, v.sig);
254 EXPECT_EQ(v.public_key.x,
Fq(std::string(
"0x2c39bbbde2d0ffcb5c4317dcbfa1771cf554a2f33c647446632fa707a5bf5f3f")));
255 EXPECT_EQ(v.public_key.y,
Fq(std::string(
"0x2b9c81935298af5ebe22f1a7279bb76781e6cadba3fb6c5c41ed942392dc687c")));
256 EXPECT_EQ(v.R.x,
Fq(std::string(
"0x2f410c5089a00d9a4664f262272dbc091b121acf58abdf919c1bc8b974fb720e")));
257 EXPECT_EQ(v.s,
Fr(std::string(
"0x281906862cdb4e0efec7226d757fe8035fd1ac0ad411110674830c54cb506212")));
258 EXPECT_EQ(v.e_scalar,
Fr(std::string(
"0x013f6a902c6c0efafdadbd4de409690d6c368959f958e525d761d06c47fd2ad6")));
264TEST(schnorr, pinned_test_vector_large)
266 Fr private_key(std::string(
"0x1f2e3d4c5b6a79880f1e2d3c4b5a69788f9e0d1c2b3a4958e7f6d5c4b3a29180"));
267 Fr nonce_k(std::string(
"0x2a1b3c4d5e6f78890a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f6071"));
268 Fq message_field(std::string(
"0x0123456789abcdef0fedcba9876543210123456789abcdef0fedcba987654321"));
270 auto v = build_deterministic_sig(private_key, nonce_k, message_field);
271 dump_vector(
"pinned_test_vector_large", private_key, nonce_k, message_field);
273 bool ok = schnorr_verify_signature<Fr, G1>(message_field, v.public_key, v.sig);
276 EXPECT_EQ(v.public_key.x,
Fq(std::string(
"0x065812e335a97c2108ea8cf4ccfe2f9dd6b117a0714f5e18461575be93f61da6")));
277 EXPECT_EQ(v.public_key.y,
Fq(std::string(
"0x1a915003e8ec534f9a15d926a7ded478e178468ccc4f28e236e67450a55ac622")));
278 EXPECT_EQ(v.R.x,
Fq(std::string(
"0x04e780bc3d2b86b5f41f3b8d2820c1f2c3164cd5efc607cd48c428495a8f47b7")));
279 EXPECT_EQ(v.s,
Fr(std::string(
"0x08599f379f0301dfefdbd0272554454df3bc3b7147acb9c621fd9f72dbf15ffa")));
280 EXPECT_EQ(v.e_scalar,
Fr(std::string(
"0x2ceaee87f45b7a417f0ffb05451a8c9297065383ebbbd76620398792bd259bc2")));
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
group_elements::affine_element< Fq, Fr, Params > affine_element
static constexpr element one
group_elements::element< Fq, Fr, Params > element
bb::group< bb::fr, bb::fq, G1Params > g1
Entry point for Barretenberg command-line interface.
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
G1::affine_element public_key
static field random_element(numeric::RNG *engine=nullptr) noexcept
static field serialize_from_buffer(const uint8_t *buffer)
static void serialize_to_buffer(const field &value, uint8_t *buffer)