41template <
typename Curve>
44 bool has_valid_witness_assignments)
48 using Fq = Curve::fq_ct;
49 using Fr = Curve::bigfr_ct;
50 using G1 = Curve::g1_bigfr_ct;
59 for (
auto&
field : fields) {
64 result.
write(byte_to_append);
78 if (!has_valid_witness_assignments) {
80 create_dummy_ecdsa_constraint<Curve>(
81 builder, hashed_message_fields, r_fields, s_fields, pub_x_fields, pub_y_fields, result_field);
95 Fq pub_x(pub_x_bytes);
96 Fq pub_y(pub_y_bytes);
102 auto default_point = Curve::g1::one + Curve::g1::one;
104 default_point = default_point.normalize();
106 pub_x = Fq::conditional_assign(predicate_witness, pub_x, default_point.x);
107 pub_y = Fq::conditional_assign(predicate_witness, pub_y, default_point.y);
110 if (pub_x.is_constant() != pub_y.is_constant()) {
111 if (pub_x.is_constant()) {
112 pub_x.convert_constant_to_fixed_witness(&
builder);
113 }
else if (pub_y.is_constant()) {
114 pub_y.convert_constant_to_fixed_witness(&
builder);
119 input.
predicate.value,
true,
"Creating ECDSA constraints with a constant predicate equal to false.");
121 G1 public_key(pub_x, pub_y);
125 pub_x.assert_is_in_field(
"ECDSA input validation: the x coordinate of the public key is larger than Fq::modulus");
126 pub_y.assert_is_in_field(
"ECDSA input validation: the y coordinate of the public key is larger than Fq::modulus");
130 stdlib::ecdsa_verify_signature<Builder, Curve, Fq, Fr, G1>(hashed_message, public_key, { r, s });
142template <
typename Curve>
151 using Builder = Curve::Builder;
152 using FqNative = Curve::fq;
153 using G1Native = Curve::g1;
167 populate_fields(hashed_message_fields, mock_zeros);
170 populate_fields(r_fields, mock_zeros);
171 populate_fields(s_fields, mock_zeros);
174 std::array<uint8_t, 32> buffer_x;
175 std::array<uint8_t, 32> buffer_y;
178 FqNative::serialize_to_buffer(G1Native::one.x, &buffer_x[0]);
179 FqNative::serialize_to_buffer(G1Native::one.y, &buffer_y[0]);
180 for (
auto [byte_x, byte_y] :
zip_view(buffer_x, buffer_y)) {
181 mock_pub_x.emplace_back(
bb::fr(byte_x));
182 mock_pub_y.emplace_back(
bb::fr(byte_y));
184 populate_fields(pub_x_fields, mock_pub_x);
185 populate_fields(pub_y_fields, mock_pub_y);
191template void create_ecdsa_verify_constraints<stdlib::secp256k1<UltraCircuitBuilder>>(
193template void create_ecdsa_verify_constraints<stdlib::secp256k1<MegaCircuitBuilder>>(
195template void create_ecdsa_verify_constraints<stdlib::secp256r1<UltraCircuitBuilder>>(
197template void create_ecdsa_verify_constraints<stdlib::secp256r1<MegaCircuitBuilder>>(
200template void create_dummy_ecdsa_constraint<stdlib::secp256k1<UltraCircuitBuilder>>(
209template void create_dummy_ecdsa_constraint<stdlib::secp256r1<UltraCircuitBuilder>>(
#define BB_ASSERT_EQ(actual, expected,...)
Implements boolean logic in-circuit.
void assert_equal(const bool_t &rhs, std::string const &msg="bool_t::assert_equal") const
Implements copy constraint for bool_t elements.
static bool_t from_witness_index_unsafe(Builder *ctx, uint32_t witness_index)
Create a bool_t from a witness index that is known to contain a constrained bool value.
Represents a dynamic array of bytes in-circuit.
byte_array & write(byte_array const &other)
Appends the contents of another byte_array (other) to the end of this one.
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field one()
static constexpr field zero()