Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ecdsa.test.cpp
Go to the documentation of this file.
2#include "../../primitives/bigfield/bigfield.hpp"
3#include "../../primitives/biggroup/biggroup.hpp"
4#include "../../primitives/curves/secp256k1.hpp"
5#include "../../primitives/curves/secp256r1.hpp"
8#include "ecdsa.hpp"
9
10#include <gtest/gtest.h>
11
12using namespace bb;
13using namespace bb::crypto;
14
15template <class Curve> class EcdsaTests : public ::testing::Test {
16 public:
17 using Builder = Curve::Builder;
18
19 // Native Types
20 using FrNative = Curve::fr;
21 using FqNative = Curve::fq;
22 using G1Native = Curve::g1;
23
24 // Stdlib types
25 using Fr = Curve::bigfr_ct;
26 using Fq = Curve::fq_ct;
27 using G1 = Curve::g1_bigfr_ct;
28
34
36 bool tamper_with_signature)
37 {
39 account.private_key = FrNative::random_element();
40 account.public_key = G1Native::one * account.private_key;
41
42 ecdsa_signature signature =
43 ecdsa_construct_signature<Sha256Hasher, FqNative, FrNative, G1Native>(message_string, account);
44
45 if (tamper_with_signature) {
46 signature.r[1] += 1;
47 }
48
49 return { account, signature };
50 }
51
53 std::string message_string,
55 ecdsa_signature& signature)
56 {
57 stdlib::byte_array<Builder> message(&builder, message_string);
58
59 G1 pub_key = G1::from_witness(&builder, account.public_key);
60
61 std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
62 std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
63 std::vector<uint8_t> vv = { signature.v };
64
67
68 return { message, pub_key, sig };
69 }
70
71 void test_verify_signature(bool tamper_with_signature)
72 {
73 // whaaablaghaaglerijgeriij
74 std::string message_string = "Instructions unclear, ask again later.";
75
76 auto [account, signature] =
77 generate_dummy_ecdsa_data(message_string, /*tamper_with_signature=*/tamper_with_signature);
78
79 // Natively verify the signature
80 bool native_verification = ecdsa_verify_signature<Sha256Hasher, FqNative, FrNative, G1Native>(
81 message_string, account.public_key, signature);
82 EXPECT_EQ(native_verification, !tamper_with_signature);
83
84 // Create ECDSA verification circuit
86
87 auto [message, public_key, sig] = create_stdlib_ecdsa_data(builder, message_string, account, signature);
88
89 // Compute H(m)
90 stdlib::byte_array<Builder> hashed_message =
92
93 // Verify signature
94 stdlib::bool_t<Builder> signature_result =
95 stdlib::ecdsa_verify_signature<Builder, Curve, Fq, Fr, G1>(hashed_message, public_key, sig);
96
97 // Enforce verification passed successfully
98 signature_result.assert_equal(stdlib::bool_t<Builder>(true));
99
100 EXPECT_EQ(signature_result.get_value(), !tamper_with_signature);
101
102 std::cerr << "num gates = " << builder.get_estimated_num_finalized_gates() << std::endl;
103 benchmark_info(Builder::NAME_STRING,
104 "ECDSA",
105 "Signature Verification Test",
106 "Gate Count",
107 builder.get_estimated_num_finalized_gates());
108 bool proof_result = CircuitChecker::check(builder);
109 EXPECT_EQ(proof_result, !tamper_with_signature);
110 }
111};
112
113using Curves = testing::Types<stdlib::secp256k1<UltraCircuitBuilder>,
114 stdlib::secp256r1<UltraCircuitBuilder>>; // TODO(federicobarbacovi): Is
115 // UltraCircuitBuilder a valid assumption?
116
118
119TYPED_TEST(EcdsaTests, VerifySignature)
120{
121 TestFixture::test_verify_signature(/*tamper_with_signature=*/false);
122}
123
124TYPED_TEST(EcdsaTests, VerifySignatureFails)
125{
126 TestFixture::test_verify_signature(/*tamper_with_signature=*/true);
127}
Curve::bigfr_ct Fr
StdlibEcdsaData create_stdlib_ecdsa_data(Builder &builder, std::string message_string, ecdsa_key_pair< FrNative, G1Native > &account, ecdsa_signature &signature)
Curve::g1_bigfr_ct G1
void test_verify_signature(bool tamper_with_signature)
Curve::fr FrNative
std::pair< ecdsa_key_pair< FrNative, G1Native >, ecdsa_signature > generate_dummy_ecdsa_data(std::string message_string, bool tamper_with_signature)
Curve::fq FqNative
Curve::fq_ct Fq
Curve::Builder Builder
Curve::g1 G1Native
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
static byte_array< Builder > hash(const byte_array_ct &input)
Definition sha256.cpp:308
Implements boolean logic in-circuit.
Definition bool.hpp:59
Represents a dynamic array of bytes in-circuit.
std::vector< uint8_t > get_value() const
A helper converting a byte_array into the vector of its uint8_t values.
void benchmark_info(Args...)
Info used to store circuit statistics during CI/CD with concrete structure. Writes straight to log.
Definition log.hpp:103
AluTraceBuilder builder
Definition alu.test.cpp:123
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
::testing::Types< curve::BN254, curve::Grumpkin > Curves
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
stdlib::ecdsa_signature< Builder > sig
stdlib::byte_array< Builder > message
G1::affine_element public_key
Definition ecdsa.hpp:20
std::array< uint8_t, 32 > r
Definition ecdsa.hpp:26
std::array< uint8_t, 32 > s
Definition ecdsa.hpp:27