Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
schnorr.test.cpp
Go to the documentation of this file.
1#include "schnorr.hpp"
3#include <gtest/gtest.h>
4
5using namespace bb;
6using namespace bb::crypto;
7
15
16TEST(schnorr, verify_signature_keccak256)
17{
18 std::string message = "The quick brown fox jumped over the lazy dog.";
19
22 account.public_key = grumpkin::g1::one * account.private_key;
23
25 crypto::schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message, account);
26
27 bool result = crypto::schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
28 message, account.public_key, signature);
29
30 EXPECT_EQ(result, true);
31}
32
33TEST(schnorr, verify_signature_sha256)
34{
35 std::string message = "The quick brown dog jumped over the lazy fox.";
36
39 account.public_key = grumpkin::g1::one * account.private_key;
40
42 crypto::schnorr_construct_signature<Sha256Hasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message, account);
43
44 bool result = crypto::schnorr_verify_signature<Sha256Hasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
45 message, account.public_key, signature);
46
47 EXPECT_EQ(result, true);
48}
49
50TEST(schnorr, verify_signature_blake2s)
51{
52 std::string message = "The quick brown dog jumped over the lazy fox.";
53
55 // account.private_key = grumpkin::fr::random_element();
56 account.private_key = { 0x55555555, 0x55555555, 0x55555555, 0x55555555 };
57 account.public_key = grumpkin::g1::one * account.private_key;
58
60 crypto::schnorr_construct_signature<Blake2sHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message, account);
61
62 bool result = crypto::schnorr_verify_signature<Blake2sHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
63 message, account.public_key, signature);
64
65 EXPECT_EQ(result, true);
66}
67
68TEST(schnorr, hmac_signature_consistency)
69{
70 std::string message_a = "The quick brown fox jumped over the lazy dog.";
71 std::string message_b = "The quick brown dog jumped over the lazy fox.";
72
73 auto account_a = generate_signature();
74 auto account_b = generate_signature();
75
76 ASSERT_NE(account_a.private_key, account_b.private_key);
77 ASSERT_NE(account_a.public_key, account_b.public_key);
78
79 // k is no longer identical, so signatures should be different.
80 auto signature_a =
81 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_a, account_a);
82 auto signature_b =
83 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_a, account_a);
84
85 ASSERT_NE(signature_a.e, signature_b.e);
86 ASSERT_NE(signature_a.s, signature_b.s);
87
88 // same message, different accounts should give different sigs!
89 auto signature_c =
90 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_a, account_a);
91 auto signature_d =
92 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_a, account_b);
93
94 ASSERT_NE(signature_c.e, signature_d.e);
95 ASSERT_NE(signature_c.s, signature_d.s);
96
97 // different message, same accounts should give different sigs!
98 auto signature_e =
99 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_a, account_a);
100 auto signature_f =
101 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_b, account_a);
102
103 ASSERT_NE(signature_e.e, signature_f.e);
104 ASSERT_NE(signature_e.s, signature_f.s);
105
106 // different message, different accounts should give different sigs!!
107 auto signature_g =
108 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_a, account_a);
109 auto signature_h =
110 schnorr_construct_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(message_b, account_b);
111
112 ASSERT_NE(signature_g.e, signature_h.e);
113 ASSERT_NE(signature_g.s, signature_h.s);
114
115 bool res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
116 message_a, account_a.public_key, signature_a);
117 EXPECT_EQ(res, true);
118 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
119 message_a, account_a.public_key, signature_b);
120 EXPECT_EQ(res, true);
121 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
122 message_a, account_a.public_key, signature_c);
123 EXPECT_EQ(res, true);
124 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
125 message_a, account_b.public_key, signature_d);
126 EXPECT_EQ(res, true);
127 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
128 message_a, account_a.public_key, signature_e);
129 EXPECT_EQ(res, true);
130 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
131 message_b, account_a.public_key, signature_f);
132 EXPECT_EQ(res, true);
133 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
134 message_a, account_a.public_key, signature_g);
135 EXPECT_EQ(res, true);
136 res = schnorr_verify_signature<KeccakHasher, grumpkin::fq, grumpkin::fr, grumpkin::g1>(
137 message_b, account_b.public_key, signature_h);
138 EXPECT_EQ(res, true);
139}
static constexpr element one
Definition group.hpp:46
crypto::schnorr_key_pair< grumpkin::fr, grumpkin::g1 > generate_signature()
Entry point for Barretenberg command-line interface.
TEST(MegaCircuitBuilder, CopyConstructor)
G1::affine_element public_key
Definition schnorr.hpp:24
static field random_element(numeric::RNG *engine=nullptr) noexcept