Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include "barretenberg/smt_verification/circuit/ultra_circuit.hpp"
#include "barretenberg/smt_verification/solver/solver.hpp"
#include "barretenberg/smt_verification/util/smt_util.hpp"
#include "barretenberg/stdlib/primitives/uint/uint.hpp"
#include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp"

using namespace bb;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@ void create_ecdsa_k1_verify_constraints(Builder& builder,

std::vector<uint8_t> rr(new_sig.r.begin(), new_sig.r.end());
std::vector<uint8_t> ss(new_sig.s.begin(), new_sig.s.end());
uint8_t vv = new_sig.v;
std::vector<uint8_t> vv = { new_sig.v };

stdlib::ecdsa_signature<Builder> sig{ stdlib::byte_array<Builder>(&builder, rr),
stdlib::byte_array<Builder>(&builder, ss),
stdlib::uint8<Builder>(&builder, vv) };
stdlib::byte_array<Builder>(&builder, vv) };

pub_key_x_fq.assert_is_in_field();
pub_key_y_fq.assert_is_in_field();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ void create_ecdsa_r1_verify_constraints(Builder& builder,

std::vector<uint8_t> rr(new_sig.r.begin(), new_sig.r.end());
std::vector<uint8_t> ss(new_sig.s.begin(), new_sig.s.end());
uint8_t vv = new_sig.v;
std::vector<uint8_t> vv = { new_sig.v };

stdlib::ecdsa_signature<Builder> sig{ stdlib::byte_array<Builder>(&builder, rr),
stdlib::byte_array<Builder>(&builder, ss),
stdlib::uint8<Builder>(&builder, vv) };
stdlib::byte_array<Builder>(&builder, vv) };

pub_key_x_fq.assert_is_in_field();
pub_key_y_fq.assert_is_in_field();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,12 @@ class EcdsaCircuit {

std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
uint8_t vv = signature.v;
std::vector<uint8_t> vv = { signature.v };

// IN CIRCUIT: create a witness with the sig in our circuit
stdlib::ecdsa_signature<Builder> sig{ typename curve::byte_array_ct(&builder, rr),
typename curve::byte_array_ct(&builder, ss),
stdlib::uint8<Builder>(&builder, vv) };
typename curve::byte_array_ct(&builder, vv) };

// IN CIRCUIT: verify the signature
typename curve::bool_ct signature_result = stdlib::ecdsa_verify_signature<Builder,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@

#include "../../primitives/byte_array/byte_array.hpp"
#include "../../primitives/circuit_builders/circuit_builders_fwd.hpp"
#include "../../primitives/uint/uint.hpp"
#include "barretenberg/crypto/ecdsa/ecdsa.hpp"
namespace bb::stdlib {

template <typename Builder> struct ecdsa_signature {
stdlib::byte_array<Builder> r;
stdlib::byte_array<Builder> s;
stdlib::uint8<Builder> v;
stdlib::byte_array<Builder> v; // v is single byte (byte_array of size 1)
};

template <typename Builder, typename Curve, typename Fq, typename Fr, typename G1>
Expand All @@ -27,6 +26,7 @@ template <typename Builder, typename Curve, typename Fq, typename Fr, typename G
bool_t<Builder> ecdsa_verify_signature_noassert(const stdlib::byte_array<Builder>& message,
const G1& public_key,
const ecdsa_signature<Builder>& sig);

template <typename Builder, typename Curve, typename Fq, typename Fr, typename G1>
bool_t<Builder> ecdsa_verify_signature_prehashed_message_noassert(const stdlib::byte_array<Builder>& hashed_message,
const G1& public_key,
Expand All @@ -37,9 +37,10 @@ static ecdsa_signature<Builder> ecdsa_from_witness(Builder* ctx, const crypto::e
{
std::vector<uint8_t> r_vec(std::begin(input.r), std::end(input.r));
std::vector<uint8_t> s_vec(std::begin(input.s), std::end(input.s));
std::vector<uint8_t> v_vec = { input.v }; // Create single-element vector for v
stdlib::byte_array<Builder> r(ctx, r_vec);
stdlib::byte_array<Builder> s(ctx, s_vec);
stdlib::uint8<Builder> v(ctx, input.v);
stdlib::byte_array<Builder> v(ctx, v_vec); // v is now a byte_array with size 1
ecdsa_signature<Builder> out;
out.r = r;
out.s = s;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ TEST(stdlib_ecdsa, verify_signature)

std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
uint8_t vv = signature.v;
std::vector<uint8_t> vv = { signature.v };

stdlib::ecdsa_signature<Builder> sig{ curve_::byte_array_ct(&builder, rr),
curve_::byte_array_ct(&builder, ss),
stdlib::uint8<Builder>(&builder, vv) };
curve_::byte_array_ct(&builder, vv) };

curve_::byte_array_ct message(&builder, message_string);

Expand Down Expand Up @@ -81,11 +81,11 @@ TEST(stdlib_ecdsa, verify_r1_signature)

std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
uint8_t vv = signature.v;
std::vector<uint8_t> vv = { signature.v };

stdlib::ecdsa_signature<Builder> sig{ curveR1::byte_array_ct(&builder, rr),
curveR1::byte_array_ct(&builder, ss),
stdlib::uint8<Builder>(&builder, vv) };
curveR1::byte_array_ct(&builder, vv) };

curveR1::byte_array_ct message(&builder, message_string);

Expand Down Expand Up @@ -127,12 +127,12 @@ TEST(stdlib_ecdsa, ecdsa_verify_signature_noassert_succeed)

std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
uint8_t vv = signature.v;
std::vector<uint8_t> vv = { signature.v };

stdlib::ecdsa_signature<Builder> sig{
curve_::byte_array_ct(&builder, rr),
curve_::byte_array_ct(&builder, ss),
stdlib::uint8<Builder>(&builder, vv),
curve_::byte_array_ct(&builder, vv),
};

curve_::byte_array_ct message(&builder, message_string);
Expand Down Expand Up @@ -178,10 +178,11 @@ TEST(stdlib_ecdsa, ecdsa_verify_signature_noassert_fail)

std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
std::vector<uint8_t> vv = { 27 }; // Use a valid recovery id

stdlib::ecdsa_signature<Builder> sig{ curve_::byte_array_ct(&builder, rr),
curve_::byte_array_ct(&builder, ss),
27 };
curve_::byte_array_ct(&builder, vv) };

curve_::byte_array_ct message(&builder, message_string);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ bool_t<Builder> ecdsa_verify_signature(const stdlib::byte_array<Builder>& messag
{
Builder* ctx = message.get_context() ? message.get_context() : public_key.x.context;

BB_ASSERT_EQ(sig.v.size(), 1ULL, "ecdsa: v must be a single byte");

/**
* Check if recovery id v is either 27 ot 28.
*
Expand Down Expand Up @@ -65,8 +67,7 @@ bool_t<Builder> ecdsa_verify_signature(const stdlib::byte_array<Builder>& messag
*
*/
// Note: This check is also present in the _noassert variation of this method.
field_t<Builder>(sig.v).assert_is_in_set({ field_t<Builder>(27), field_t<Builder>(28) },
"signature is non-standard");
sig.v[0].assert_is_in_set({ field_t<Builder>(27), field_t<Builder>(28) }, "ecdsa: signature is non-standard");

stdlib::byte_array<Builder> hashed_message =
static_cast<stdlib::byte_array<Builder>>(stdlib::SHA256<Builder>::hash(message));
Expand Down Expand Up @@ -148,6 +149,8 @@ bool_t<Builder> ecdsa_verify_signature_prehashed_message_noassert(const stdlib::
{
Builder* ctx = hashed_message.get_context() ? hashed_message.get_context() : public_key.x.context;

BB_ASSERT_EQ(sig.v.size(), 1ULL, "ecdsa: v must be a single byte");

Fr z(hashed_message);
z.assert_is_in_field();

Expand Down Expand Up @@ -202,8 +205,7 @@ bool_t<Builder> ecdsa_verify_signature_prehashed_message_noassert(const stdlib::
output &= result_mod_r.binary_basis_limbs[3].element == (r.binary_basis_limbs[3].element);
output &= result_mod_r.prime_basis_limb == (r.prime_basis_limb);

field_t<Builder>(sig.v).assert_is_in_set({ field_t<Builder>(27), field_t<Builder>(28) },
"signature is non-standard");
sig.v[0].assert_is_in_set({ field_t<Builder>(27), field_t<Builder>(28) }, "ecdsa: signature is non-standard");

return output;
}
Expand Down Expand Up @@ -264,13 +266,13 @@ template <typename Builder> void generate_ecdsa_verification_test_circuit(Builde

std::vector<uint8_t> rr(signature.r.begin(), signature.r.end());
std::vector<uint8_t> ss(signature.s.begin(), signature.s.end());
uint8_t vv = signature.v;
std::vector<uint8_t> vv = { signature.v };

typename curve::g1_bigfr_ct public_key = curve::g1_bigfr_ct::from_witness(&builder, account.public_key);

stdlib::ecdsa_signature<Builder> sig{ typename curve::byte_array_ct(&builder, rr),
typename curve::byte_array_ct(&builder, ss),
stdlib::uint8<Builder>(&builder, vv) };
typename curve::byte_array_ct(&builder, vv) };

typename curve::byte_array_ct message(&builder, message_string);

Expand Down
Loading
Loading