60 const fr_native u1_native = scalar_from_bytes(Data + 0);
61 const fr_native u2_native = scalar_from_bytes(Data + 32);
62 const fr_native q_native = scalar_from_bytes(Data + 64);
65 if (q_native == fr_native::zero()) {
76 const auto out = element_ct::secp256r1_ecdsa_mul(Q, u1, u2);
78 const bool u2_degenerate =
79 (u2_native == fr_native::zero()) || (u2_native == fr_native::one()) || (u2_native == -fr_native::one());
82 assert(
out.u2_is_acceptable.get_value() == !u2_degenerate &&
"ecdsa_mul: u2_is_acceptable mismatch");
88 if (expected.is_point_at_infinity()) {
89 assert(
out.result.is_point_at_infinity().get_value() &&
"ecdsa_mul: expected infinity");
91 assert(!
out.result.is_point_at_infinity().get_value() &&
"ecdsa_mul: unexpected infinity");
92 assert(
out.result.x().get_value().lo ==
uint256_t(expected.x) &&
"ecdsa_mul: x mismatch");
93 assert(
out.result.y().get_value().lo ==
uint256_t(expected.y) &&
"ecdsa_mul: y mismatch");