3#include "barretenberg/numeric/uintx/uintx.hpp"
4#include "secp256k1.hpp"
6namespace secp256k1_params {
8 uint64_t endo_g1_lo = 0;
9 uint64_t endo_g1_mid = 0;
10 uint64_t endo_g1_hi = 0;
11 uint64_t endo_g1_hihi = 0;
12 uint64_t endo_g2_lo = 0;
13 uint64_t endo_g2_mid = 0;
14 uint64_t endo_g2_hi = 0;
15 uint64_t endo_g2_hihi = 0;
16 uint64_t endo_minus_b1_lo = 0;
17 uint64_t endo_minus_b1_mid = 0;
18 uint64_t endo_b2_lo = 0;
19 uint64_t endo_b2_mid = 0;
20 uint64_t endo_a1_lo = 0;
21 uint64_t endo_a1_mid = 0;
22 uint64_t endo_a1_hi = 0;
23 uint64_t endo_a2_lo = 0;
24 uint64_t endo_a2_mid = 0;
25 uint64_t endo_a2_hi = 0;
31 uint512_t approximate_square_root;
32 uint512_t z = (uint512_t(secp256k1::fr::modulus) + uint512_t(2)) >> 1;
33 auto y = uint512_t(secp256k1::fr::modulus);
36 z = (uint512_t(secp256k1::fr::modulus) / z + z) >> 1;
38 approximate_square_root = y;
42 uint512_t v(secp256k1::fr::modulus);
57 uint512_t prevOut = 0;
64 out = v - uint512_t(uint512_t(q) * uint512_t(u));
66 uint512_t y = y2 - (q * y1);
67 if ((a1 == 0) && (out < approximate_square_root)) {
72 }
else if ((a1 > 0) && (++i == 2)) {
88 uint512_t len1 = (a1 * a1) + (b1 * b1);
89 uint512_t len2 = (a2 * a2) + (b2 * b2);
95 if (a1.get_msb() >= 128) {
99 if (a2.get_msb() >= 128) {
104 uint512_t minus_b1 = -b1;
105 uint512_t shift256 = uint512_t(1) << 384;
106 uint512_t g1 = (-b1 * shift256) / uint512_t(secp256k1::fr::modulus);
107 uint512_t g2 = (b2 * shift256) / uint512_t(secp256k1::fr::modulus);
109 basis_vectors result;
110 result.endo_g1_lo = g1.lo.data[0];
111 result.endo_g1_mid = g1.lo.data[1];
112 result.endo_g1_hi = g1.lo.data[2];
113 result.endo_g1_hihi = g1.lo.data[3];
114 result.endo_g2_lo = g2.lo.data[0];
115 result.endo_g2_mid = g2.lo.data[1];
116 result.endo_g2_hi = g2.lo.data[2];
117 result.endo_g2_hihi = g2.lo.data[3];
118 result.endo_minus_b1_lo = minus_b1.lo.data[0];
119 result.endo_minus_b1_mid = minus_b1.lo.data[1];
120 result.endo_b2_lo = b2.lo.data[0];
121 result.endo_b2_mid = b2.lo.data[1];
122 result.endo_a1_lo = a1.lo.data[0];
123 result.endo_a1_mid = a1.lo.data[1];
124 result.endo_a1_hi = a1.lo.data[2];
125 result.endo_a2_lo = a2.lo.data[0];
126 result.endo_a2_mid = a2.lo.data[1];
127 result.endo_a2_hi = a2.lo.data[2];
131[[maybe_unused]]
static std::pair<secp256k1::fq, secp256k1::fr> get_endomorphism_scalars()
139 const secp256k1::fq beta = secp256k1::fq::cube_root_of_unity();
140 const secp256k1::fr lambda = secp256k1::fr::cube_root_of_unity();
143 std::cerr <<
"beta is not a cube root of unity" << std::endl;
146 std::cerr <<
"lambda is not a cube root of unity" << std::endl;
153 if (P * lambda == endoP) {
154 return { beta, lambda };
157 if ((P * lambda) == endoP) {
158 return { beta * beta, lambda };
161 std::cerr <<
"could not find endomorphism scalars???" << std::endl;
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition: element.hpp:27
Definition: field_declarations.hpp:24
Definition: secp256k1_endo_notes.hpp:7