9#include <gtest/gtest.h>
36 return ecdsa_construct_signature<Hasher, Fq, Fr, G1>(message, account);
44 return ecdsa_verify_signature<Hasher, Fq, Fr, G1>(message, public_key, sig);
50 return ecdsa_recover_public_key<Hasher, Fq, Fr, G1>(message, sig);
56 requires(T::has_wycheproof_tests)
103using Params = ::testing::Types<EcdsaTestParams<secp256k1_curve, Sha256Hasher>,
122 std::string message =
"The quick brown dog jumped over the lazy fox.";
124 auto account = TestFixture::generate_keypair();
125 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
126 bool result = TestFixture::verify_signature(message, account.public_key, signature);
133 using Curve = TypeParam::CurveType;
135 std::string message =
"The quick brown dog jumped over the lazy fox.";
137 if constexpr (Curve::supports_recovery) {
138 auto account = TestFixture::generate_keypair();
139 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
142 bool result = TestFixture::verify_signature(message, account.public_key, signature);
146 auto recovered_public_key = TestFixture::recover_public_key(message, signature);
147 EXPECT_EQ(recovered_public_key, account.public_key);
149 GTEST_SKIP() <<
"Public key recovery not supported for this curve";
161 std::string message =
"Test message";
162 auto account = TestFixture::generate_keypair();
163 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
167 auto* r_ptr = &signature.
r[0];
168 write(r_ptr, zero_r);
170 bool result = TestFixture::verify_signature(message, account.public_key, signature);
171 EXPECT_FALSE(result);
178 using Fr =
typename TestFixture::Fr;
180 std::string message =
"Test message";
181 auto account = TestFixture::generate_keypair();
182 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
186 auto* r_write_ptr = &signature.
r[0];
187 write(r_write_ptr, overflowing_r);
189 bool result = TestFixture::verify_signature(message, account.public_key, signature);
190 EXPECT_FALSE(result);
197 std::string message =
"Test message";
198 auto account = TestFixture::generate_keypair();
199 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
203 auto* s_ptr = &signature.
s[0];
204 write(s_ptr, zero_s);
206 bool result = TestFixture::verify_signature(message, account.public_key, signature);
207 EXPECT_FALSE(result);
214 using Fr =
typename TestFixture::Fr;
216 std::string message =
"Test message";
217 auto account = TestFixture::generate_keypair();
218 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
224 bool result = TestFixture::verify_signature(message, account.public_key, signature);
225 EXPECT_FALSE(result);
230 using Fq =
typename TestFixture::Fq;
231 using AffineElement =
typename TestFixture::AffineElement;
233 std::string message =
"Test message";
234 auto account = TestFixture::generate_keypair();
235 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
238 AffineElement invalid_pubkey = account.public_key;
239 invalid_pubkey.y = invalid_pubkey.y +
Fq::one();
241 bool result = TestFixture::verify_signature(message, invalid_pubkey, signature);
242 EXPECT_FALSE(result);
247 using AffineElement =
typename TestFixture::AffineElement;
249 std::string message =
"Test message";
250 auto account = TestFixture::generate_keypair();
251 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
254 AffineElement infinity_pubkey = AffineElement::infinity();
256 bool result = TestFixture::verify_signature(message, infinity_pubkey, signature);
257 EXPECT_FALSE(result);
262 using Fr =
typename TestFixture::Fr;
263 using G1 =
typename TestFixture::G1;
265 std::string message =
"Test message";
266 auto account = TestFixture::generate_keypair();
267 ecdsa_signature signature = TestFixture::create_valid_signature(message, account);
270 std::vector<uint8_t>
buffer;
278 Fr modified_private_key = r_inverse * (-fr_hash);
279 account.public_key = G1::one * modified_private_key;
282 auto P = G1::one * fr_hash + account.public_key * r;
285 bool result = TestFixture::verify_signature(message, account.public_key, signature);
286 EXPECT_FALSE(result);
291 using Curve = TypeParam::CurveType;
292 using AffineElement = TestFixture::AffineElement;
293 using Fr = TestFixture::Fr;
295 if constexpr (Curve::has_wycheproof_tests) {
296 for (
const auto& test_case : TestFixture::template get_wycheproof_test_cases<Curve>()) {
297 std::string message_string(test_case.message.begin(), test_case.message.end());
298 std::array<uint8_t, 32> r;
299 std::array<uint8_t, 32> s;
308 message_string, AffineElement(test_case.x, test_case.y), sig);
310 EXPECT_EQ(is_signature_valid, test_case.is_valid_signature) <<
"Test case: " << test_case.comment;
313 GTEST_SKIP() <<
"Wycheproof tests not available for this curve";
324 EXPECT_EQ(actual, expected);
327TEST(ecdsa, verify_signature_secp256r1_sha256_NIST_1)
346 std::array<uint8_t, 32> r{
347 0xf3, 0xac, 0x80, 0x61, 0xb5, 0x14, 0x79, 0x5b, 0x88, 0x43, 0xe3, 0xd6, 0x62, 0x95, 0x27, 0xed,
348 0x2a, 0xfd, 0x6b, 0x1f, 0x6a, 0x55, 0x5a, 0x7a, 0xca, 0xbb, 0x5e, 0x6f, 0x79, 0xc8, 0xc2, 0xac,
351 std::array<uint8_t, 32> s{
352 0x74, 0x08, 0x87, 0xe5, 0x35, 0xfa, 0x59, 0x4e, 0x87, 0x93, 0x89, 0xd9, 0xd4, 0x08, 0xc8, 0xe2,
353 0xcd, 0x4f, 0x48, 0x94, 0xbd, 0xa8, 0x87, 0x2a, 0xb6, 0xeb, 0xf0, 0x98, 0x30, 0x5d, 0x9c, 0x4e,
358 "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46"
359 "c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9"
360 "d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8");
361 std::string message(message_vec.begin(), message_vec.end());
364 ecdsa_verify_signature<Sha256Hasher, secp256r1::fq, secp256r1::fr, secp256r1::g1>(message, public_key, sig);
365 EXPECT_EQ(result,
true);
#define BB_ASSERT_EQ(actual, expected,...)
static ecdsa_signature create_valid_signature(const std::string &message, const ecdsa_key_pair< Fr, G1 > &account)
typename Curve::BaseField Fq
typename Curve::AffineElement AffineElement
static AffineElement recover_public_key(const std::string &message, const ecdsa_signature &sig)
typename Curve::ScalarField Fr
static ecdsa_key_pair< Fr, G1 > generate_keypair()
typename EcdsaTestParams::CurveType Curve
static bool verify_signature(const std::string &message, const AffineElement &public_key, const ecdsa_signature &sig)
typename EcdsaTestParams::Hasher Hasher
static auto get_wycheproof_test_cases()
typename Group::affine_element AffineElement
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
group_elements::affine_element< Fq, Fr, Params > affine_element
std::unique_ptr< uint8_t[]> buffer
const std::vector< WycherproofSecp256r1 > secp256r1_tests
Test for Secp256r1 ECDSA signatures taken from the Wycherproof project.
void write(B &buf, SchnorrProofOfPossession< G1, Hash > const &proof_of_possession)
bool ecdsa_verify_signature(const std::string &message, const typename G1::affine_element &public_key, const ecdsa_signature &sig)
const std::vector< WycherproofSecp256k1 > secp256k1_tests
Test for Secp256k1 ECDSA signatures taken from the Wycherproof project.
bb::group< bb::fr, bb::fq, G1Params > g1
group< fq, fr, G1Params > g1
group< fq, fr, G1Params > g1
std::vector< uint8_t > hex_to_bytes(const std::string &hex)
Routine to transform hexstring to vector of bytes.
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
void read(auto &it, msgpack_concepts::HasMsgPack auto &obj)
Automatically derived read for any object that defines .msgpack() (implicitly defined by MSGPACK_FIEL...
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
static auto hash(const B &message)
G1::affine_element public_key
std::array< uint8_t, 32 > r
std::array< uint8_t, 32 > s
static constexpr field one()
static constexpr uint256_t modulus
BB_INLINE constexpr field to_montgomery_form() const noexcept
constexpr field invert() const noexcept
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)
static constexpr bool has_wycheproof_tests
static constexpr bool supports_recovery
static constexpr bool supports_recovery
static constexpr bool has_wycheproof_tests
static constexpr bool supports_recovery
static constexpr bool has_wycheproof_tests
std::pair< T, T > msgpack_roundtrip(const T &object)