3#include "barretenberg/stdlib/encryption/ecdsa/ecdsa.hpp"
4#include "barretenberg/stdlib/hash/sha256/sha256.hpp"
5#include "barretenberg/stdlib/primitives//bit_array/bit_array.hpp"
24template <
typename Builder,
typename Curve,
typename Fq,
typename Fr,
typename G1>
25bool_t<Builder> verify_signature(
const stdlib::byte_array<Builder>& message,
27 const signature<Builder>& sig)
29 Builder* ctx = message.get_context() ? message.get_context() : public_key.x.context;
60 "signature is non-standard");
62 stdlib::byte_array<Builder> hashed_message =
63 static_cast<stdlib::byte_array<Builder>
>(stdlib::sha256<Builder>(message));
66 z.assert_is_in_field();
70 r.assert_is_in_field();
75 r.assert_is_not_equal(Fr::zero());
76 s.assert_is_not_equal(Fr::zero());
80 s.assert_less_than((Fr::modulus + 1) / 2);
85 public_key.validate_on_curve();
92 result = G1::secp256k1_ecdsa_mul(public_key, u1, u2);
94 result = G1::batch_mul({ G1::one(ctx), public_key }, { u1, u2 });
96 result.x.self_reduce();
99 Fr result_mod_r(ctx, 0);
100 result_mod_r.binary_basis_limbs[0].element = result.x.binary_basis_limbs[0].element;
101 result_mod_r.binary_basis_limbs[1].element = result.x.binary_basis_limbs[1].element;
102 result_mod_r.binary_basis_limbs[2].element = result.x.binary_basis_limbs[2].element;
103 result_mod_r.binary_basis_limbs[3].element = result.x.binary_basis_limbs[3].element;
104 result_mod_r.binary_basis_limbs[0].maximum_value = result.x.binary_basis_limbs[0].maximum_value;
105 result_mod_r.binary_basis_limbs[1].maximum_value = result.x.binary_basis_limbs[1].maximum_value;
106 result_mod_r.binary_basis_limbs[2].maximum_value = result.x.binary_basis_limbs[2].maximum_value;
107 result_mod_r.binary_basis_limbs[3].maximum_value = result.x.binary_basis_limbs[3].maximum_value;
109 result_mod_r.prime_basis_limb = result.x.prime_basis_limb;
111 result_mod_r.assert_is_in_field();
113 result_mod_r.binary_basis_limbs[0].element.assert_equal(r.binary_basis_limbs[0].element);
114 result_mod_r.binary_basis_limbs[1].element.assert_equal(r.binary_basis_limbs[1].element);
115 result_mod_r.binary_basis_limbs[2].element.assert_equal(r.binary_basis_limbs[2].element);
116 result_mod_r.binary_basis_limbs[3].element.assert_equal(r.binary_basis_limbs[3].element);
117 result_mod_r.prime_basis_limb.assert_equal(r.prime_basis_limb);
118 return bool_t<Builder>(ctx,
true);
134template <
typename Builder,
typename Curve,
typename Fq,
typename Fr,
typename G1>
135bool_t<Builder> verify_signature_prehashed_message_noassert(
const stdlib::byte_array<Builder>& hashed_message,
136 const G1& public_key,
137 const signature<Builder>& sig)
139 Builder* ctx = hashed_message.get_context() ? hashed_message.get_context() : public_key.x.context;
141 Fr z(hashed_message);
142 z.assert_is_in_field();
146 r.assert_is_in_field();
151 r.assert_is_not_equal(Fr::zero());
152 s.assert_is_not_equal(Fr::zero());
156 s.assert_less_than((Fr::modulus + 1) / 2);
161 public_key.validate_on_curve();
167 result = G1::secp256k1_ecdsa_mul(public_key, u1, u2);
169 result = G1::batch_mul({ G1::one(ctx), public_key }, { u1, u2 });
171 result.x.self_reduce();
174 Fr result_mod_r(ctx, 0);
175 result_mod_r.binary_basis_limbs[0].element = result.x.binary_basis_limbs[0].element;
176 result_mod_r.binary_basis_limbs[1].element = result.x.binary_basis_limbs[1].element;
177 result_mod_r.binary_basis_limbs[2].element = result.x.binary_basis_limbs[2].element;
178 result_mod_r.binary_basis_limbs[3].element = result.x.binary_basis_limbs[3].element;
179 result_mod_r.binary_basis_limbs[0].maximum_value = result.x.binary_basis_limbs[0].maximum_value;
180 result_mod_r.binary_basis_limbs[1].maximum_value = result.x.binary_basis_limbs[1].maximum_value;
181 result_mod_r.binary_basis_limbs[2].maximum_value = result.x.binary_basis_limbs[2].maximum_value;
182 result_mod_r.binary_basis_limbs[3].maximum_value = result.x.binary_basis_limbs[3].maximum_value;
184 result_mod_r.prime_basis_limb = result.x.prime_basis_limb;
186 result_mod_r.assert_is_in_field();
188 bool_t<Builder> output(ctx,
true);
189 output &= result_mod_r.binary_basis_limbs[0].element == (r.binary_basis_limbs[0].element);
190 output &= result_mod_r.binary_basis_limbs[1].element == (r.binary_basis_limbs[1].element);
191 output &= result_mod_r.binary_basis_limbs[2].element == (r.binary_basis_limbs[2].element);
192 output &= result_mod_r.binary_basis_limbs[3].element == (r.binary_basis_limbs[3].element);
193 output &= result_mod_r.prime_basis_limb == (r.prime_basis_limb);
196 "signature is non-standard");
214template <
typename Builder,
typename Curve,
typename Fq,
typename Fr,
typename G1>
215bool_t<Builder> verify_signature_noassert(
const stdlib::byte_array<Builder>& message,
216 const G1& public_key,
217 const signature<Builder>& sig)
219 stdlib::byte_array<Builder> hashed_message =
220 static_cast<stdlib::byte_array<Builder>
>(stdlib::sha256<Builder>(message));
222 return verify_signature_prehashed_message_noassert<Builder, Curve, Fq, Fr, G1>(hashed_message, public_key, sig);
Definition: standard_circuit_builder.hpp:12
Contains all the headers required to adequately compile the types defined in circuit_builders_fwd....
Definition: circuit_builders.hpp:11
Definition: widget.bench.cpp:13