7 #ifndef SECP256K1_MODULE_GENERATOR_MAIN
8 #define SECP256K1_MODULE_GENERATOR_MAIN
19 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xce, 0x87, 0x0b, 0x07,
20 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xce, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98,
21 0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb, 0xfc, 0x0e, 0x11, 0x08, 0xa8,
22 0xfd, 0x17, 0xb4, 0x48, 0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10, 0xd4, 0xb8
33 0x50, 0x92, 0x9b, 0x74, 0xc1, 0xa0, 0x49, 0x54, 0xb7, 0x8b, 0x4b, 0x60, 0x35, 0xe9, 0x7a, 0x5e,
34 0x07, 0x8a, 0x5a, 0x0f, 0x28, 0xec, 0x96, 0xd5, 0x47, 0xbf, 0xee, 0x9a, 0xce, 0x80, 0x3a, 0xc0,
35 0x31, 0xd3, 0xc6, 0x86, 0x39, 0x73, 0x92, 0x6e, 0x04, 0x9e, 0x63, 0x7c, 0xb1, 0xb5, 0xf4, 0x0a,
36 0x36, 0xda, 0xc2, 0x8a, 0xf1, 0x76, 0x69, 0x68, 0xc3, 0x0c, 0x23, 0x13, 0xf3, 0xa3, 0x89, 0x04
41 succeed = secp256k1_fe_set_b32(&ge->
x, &gen->
data[0]);
43 succeed = secp256k1_fe_set_b32(&ge->
y, &gen->
data[32]);
51 secp256k1_fe_normalize_var(&ge->
x);
52 secp256k1_fe_normalize_var(&ge->
y);
53 secp256k1_fe_get_b32(&gen->
data[0], &ge->
x);
54 secp256k1_fe_get_b32(&gen->
data[32], &ge->
y);
65 if ((input[0] & 0xFE) != 10 ||
66 !secp256k1_fe_set_b32(&x, &input[1]) ||
67 !secp256k1_ge_set_xquad(&ge, &x)) {
71 secp256k1_ge_neg(&ge, &ge);
73 secp256k1_generator_save(gen, &ge);
84 secp256k1_generator_load(&ge, gen);
86 output[0] = 11 ^ secp256k1_fe_is_quad_var(&ge.
y);
87 secp256k1_fe_normalize_var(&ge.
x);
88 secp256k1_fe_get_b32(&output[1], &ge.
x);
129 secp256k1_fe wn, wd, x1n, x2n, x3n, x3d, jinv, tmp, x1, x2, x3, alphain, betain, gammain, y1, y2, y3;
130 int alphaquad, betaquad;
132 secp256k1_fe_mul(&wn, &c, t);
133 secp256k1_fe_sqr(&wd, t);
134 secp256k1_fe_add(&wd, &b_plus_one);
135 secp256k1_fe_mul(&tmp, t, &wn);
136 secp256k1_fe_negate(&tmp, &tmp, 1);
137 secp256k1_fe_mul(&x1n, &d, &wd);
138 secp256k1_fe_add(&x1n, &tmp);
140 secp256k1_fe_add(&x2n, &wd);
141 secp256k1_fe_negate(&x2n, &x2n, 5);
142 secp256k1_fe_mul(&x3d, &c, t);
143 secp256k1_fe_sqr(&x3d, &x3d);
144 secp256k1_fe_sqr(&x3n, &wd);
145 secp256k1_fe_add(&x3n, &x3d);
146 secp256k1_fe_mul(&jinv, &x3d, &wd);
147 secp256k1_fe_inv(&jinv, &jinv);
148 secp256k1_fe_mul(&x1, &x1n, &x3d);
149 secp256k1_fe_mul(&x1, &x1, &jinv);
150 secp256k1_fe_mul(&x2, &x2n, &x3d);
151 secp256k1_fe_mul(&x2, &x2, &jinv);
152 secp256k1_fe_mul(&x3, &x3n, &wd);
153 secp256k1_fe_mul(&x3, &x3, &jinv);
155 secp256k1_fe_sqr(&alphain, &x1);
156 secp256k1_fe_mul(&alphain, &alphain, &x1);
157 secp256k1_fe_add(&alphain, &
b);
158 secp256k1_fe_sqr(&betain, &x2);
159 secp256k1_fe_mul(&betain, &betain, &x2);
160 secp256k1_fe_add(&betain, &
b);
161 secp256k1_fe_sqr(&gammain, &x3);
162 secp256k1_fe_mul(&gammain, &gammain, &x3);
163 secp256k1_fe_add(&gammain, &
b);
165 alphaquad = secp256k1_fe_sqrt(&y1, &alphain);
166 betaquad = secp256k1_fe_sqrt(&y2, &betain);
167 secp256k1_fe_sqrt(&y3, &gammain);
169 secp256k1_fe_cmov(&x1, &x2, (!alphaquad) & betaquad);
170 secp256k1_fe_cmov(&y1, &y2, (!alphaquad) & betaquad);
171 secp256k1_fe_cmov(&x1, &x3, (!alphaquad) & !betaquad);
172 secp256k1_fe_cmov(&y1, &y3, (!alphaquad) & !betaquad);
174 secp256k1_ge_set_xy(ge, &x1, &y1);
181 secp256k1_fe_negate(&tmp, &ge->
y, 1);
182 secp256k1_fe_cmov(&ge->
y, &tmp, secp256k1_fe_is_odd(t));
186 static const unsigned char prefix1[17] =
"1st generation: ";
187 static const unsigned char prefix2[17] =
"2nd generation: ";
193 unsigned char b32[32];
198 secp256k1_scalar_set_b32(&blind, blind32, &overflow);
204 secp256k1_sha256_initialize(&
sha256);
205 secp256k1_sha256_write(&
sha256, prefix1, 16);
206 secp256k1_sha256_write(&
sha256, key32, 32);
207 secp256k1_sha256_finalize(&
sha256, b32);
208 ret &= secp256k1_fe_set_b32(&t, b32);
210 shallue_van_de_woestijne(&add, &t);
212 secp256k1_gej_add_ge(&accum, &accum, &add);
214 secp256k1_gej_set_ge(&accum, &add);
217 secp256k1_sha256_initialize(&
sha256);
218 secp256k1_sha256_write(&
sha256, prefix2, 16);
219 secp256k1_sha256_write(&
sha256, key32, 32);
220 secp256k1_sha256_finalize(&
sha256, b32);
221 ret &= secp256k1_fe_set_b32(&t, b32);
223 shallue_van_de_woestijne(&add, &t);
224 secp256k1_gej_add_ge(&accum, &accum, &add);
226 secp256k1_ge_set_gej(&add, &accum);
227 secp256k1_generator_save(gen, &add);
235 return secp256k1_generator_generate_internal(ctx, gen, key32, NULL);
244 return secp256k1_generator_generate_internal(ctx, gen, key32, blind32);