7 #ifndef SECP256K1_GROUP_IMPL_H 8 #define SECP256K1_GROUP_IMPL_H 39 #if defined(EXHAUSTIVE_TEST_ORDER) 40 # if EXHAUSTIVE_TEST_ORDER == 199 42 0xFA7CC9A7, 0x0737F2DB, 0xA749DD39, 0x2B4FB069,
43 0x3B017A7D, 0xA808C2F1, 0xFB12940C, 0x9EA66C18,
44 0x78AC123A, 0x5ED8AEF3, 0x8732BC91, 0x1F3A2868,
45 0x48DF246C, 0x808DAE72, 0xCFE52572, 0x7F0501ED
49 # elif EXHAUSTIVE_TEST_ORDER == 13 51 0xedc60018, 0xa51a786b, 0x2ea91f4d, 0x4c9416c0,
52 0x9de54c3b, 0xa1316554, 0x6cf4345c, 0x7277ef15,
53 0x54cb1b6b, 0xdc8c1273, 0x087844ea, 0x43f4603e,
54 0x0eaf9a43, 0xf6effe55, 0x939f806d, 0x37adf8ac
58 # error No known generator for the specified exhaustive test group order. 65 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL,
66 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL,
67 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL,
68 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL
77 secp256k1_fe_sqr(&zi2, zi);
78 secp256k1_fe_mul(&zi3, &zi2, zi);
79 secp256k1_fe_mul(&r->
x, &a->
x, &zi2);
80 secp256k1_fe_mul(&r->
y, &a->
y, &zi3);
96 secp256k1_fe_normalize_weak(&r->
y);
97 secp256k1_fe_negate(&r->
y, &r->
y, 1);
103 secp256k1_fe_inv(&a->
z, &a->
z);
104 secp256k1_fe_sqr(&z2, &a->
z);
105 secp256k1_fe_mul(&z3, &a->
z, &z2);
106 secp256k1_fe_mul(&a->
x, &a->
x, &z2);
107 secp256k1_fe_mul(&a->
y, &a->
y, &z3);
108 secp256k1_fe_set_int(&a->
z, 1);
119 secp256k1_fe_inv_var(&a->
z, &a->
z);
120 secp256k1_fe_sqr(&z2, &a->
z);
121 secp256k1_fe_mul(&z3, &a->
z, &z2);
122 secp256k1_fe_mul(&a->
x, &a->
x, &z2);
123 secp256k1_fe_mul(&a->
y, &a->
y, &z3);
124 secp256k1_fe_set_int(&a->
z, 1);
135 for (i = 0; i < len; i++) {
136 if (!a[i].infinity) {
137 az[count++] = a[i].
z;
142 secp256k1_fe_inv_all_var(azi, az, count);
146 for (i = 0; i < len; i++) {
148 if (!a[i].infinity) {
149 secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]);
161 secp256k1_fe_inv(&zi, &a[i].
z);
162 secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi);
166 secp256k1_fe_mul(&zi, &zi, &zr[i]);
168 secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi);
188 secp256k1_fe_mul(&zs, &zs, &zr[i]);
191 secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs);
198 secp256k1_fe_clear(&r->
x);
199 secp256k1_fe_clear(&r->
y);
200 secp256k1_fe_clear(&r->
z);
205 secp256k1_fe_clear(&r->
x);
206 secp256k1_fe_clear(&r->
y);
207 secp256k1_fe_clear(&r->
z);
212 secp256k1_fe_clear(&r->
x);
213 secp256k1_fe_clear(&r->
y);
219 secp256k1_fe_sqr(&x2, x);
220 secp256k1_fe_mul(&x3, x, &x2);
222 secp256k1_fe_set_int(&c,
CURVE_B);
223 secp256k1_fe_add(&c, &x3);
224 return secp256k1_fe_sqrt(&r->
y, &c);
228 if (!secp256k1_ge_set_xquad(r, x)) {
231 secp256k1_fe_normalize_var(&r->
y);
232 if (secp256k1_fe_is_odd(&r->
y) != odd) {
233 secp256k1_fe_negate(&r->
y, &r->
y, 1);
243 secp256k1_fe_set_int(&r->
z, 1);
249 secp256k1_fe_sqr(&r, &a->
z); secp256k1_fe_mul(&r, &r, x);
250 r2 = a->
x; secp256k1_fe_normalize_weak(&r2);
251 return secp256k1_fe_equal_var(&r, &r2);
259 secp256k1_fe_normalize_weak(&r->
y);
260 secp256k1_fe_negate(&r->
y, &r->
y, 1);
263 static int secp256k1_gej_is_infinity(
const secp256k1_gej *a) {
267 static int secp256k1_gej_is_valid_var(
const secp256k1_gej *a) {
277 secp256k1_fe_sqr(&y2, &a->
y);
278 secp256k1_fe_sqr(&x3, &a->
x); secp256k1_fe_mul(&x3, &x3, &a->
x);
279 secp256k1_fe_sqr(&z2, &a->
z);
280 secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2);
281 secp256k1_fe_mul_int(&z6,
CURVE_B);
282 secp256k1_fe_add(&x3, &z6);
283 secp256k1_fe_normalize_weak(&x3);
284 return secp256k1_fe_equal_var(&y2, &x3);
287 static int secp256k1_ge_is_valid_var(
const secp256k1_ge *a) {
293 secp256k1_fe_sqr(&y2, &a->
y);
294 secp256k1_fe_sqr(&x3, &a->
x); secp256k1_fe_mul(&x3, &x3, &a->
x);
295 secp256k1_fe_set_int(&c,
CURVE_B);
296 secp256k1_fe_add(&x3, &c);
297 secp256k1_fe_normalize_weak(&x3);
298 return secp256k1_fe_equal_var(&y2, &x3);
323 secp256k1_fe_set_int(rzr, 1);
330 secp256k1_fe_normalize_weak(rzr);
331 secp256k1_fe_mul_int(rzr, 2);
334 secp256k1_fe_mul(&r->
z, &a->
z, &a->
y);
335 secp256k1_fe_mul_int(&r->
z, 2);
336 secp256k1_fe_sqr(&t1, &a->
x);
337 secp256k1_fe_mul_int(&t1, 3);
338 secp256k1_fe_sqr(&t2, &t1);
339 secp256k1_fe_sqr(&t3, &a->
y);
340 secp256k1_fe_mul_int(&t3, 2);
341 secp256k1_fe_sqr(&t4, &t3);
342 secp256k1_fe_mul_int(&t4, 2);
343 secp256k1_fe_mul(&t3, &t3, &a->
x);
345 secp256k1_fe_mul_int(&r->
x, 4);
346 secp256k1_fe_negate(&r->
x, &r->
x, 4);
347 secp256k1_fe_add(&r->
x, &t2);
348 secp256k1_fe_negate(&t2, &t2, 1);
349 secp256k1_fe_mul_int(&t3, 6);
350 secp256k1_fe_add(&t3, &t2);
351 secp256k1_fe_mul(&r->
y, &t1, &t3);
352 secp256k1_fe_negate(&t2, &t4, 2);
353 secp256k1_fe_add(&r->
y, &t2);
358 secp256k1_gej_double_var(r, a, rzr);
363 secp256k1_fe z22, z12, u1, u2,
s1,
s2,
h, i, i2,
h2,
h3, t;
373 secp256k1_fe_set_int(rzr, 1);
380 secp256k1_fe_sqr(&z22, &b->
z);
381 secp256k1_fe_sqr(&z12, &a->
z);
382 secp256k1_fe_mul(&u1, &a->
x, &z22);
383 secp256k1_fe_mul(&u2, &b->
x, &z12);
384 secp256k1_fe_mul(&s1, &a->
y, &z22); secp256k1_fe_mul(&s1, &s1, &b->
z);
385 secp256k1_fe_mul(&s2, &b->
y, &z12); secp256k1_fe_mul(&s2, &s2, &a->
z);
386 secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2);
387 secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2);
388 if (secp256k1_fe_normalizes_to_zero_var(&h)) {
389 if (secp256k1_fe_normalizes_to_zero_var(&i)) {
390 secp256k1_gej_double_var(r, a, rzr);
393 secp256k1_fe_set_int(rzr, 0);
399 secp256k1_fe_sqr(&i2, &i);
400 secp256k1_fe_sqr(&h2, &h);
401 secp256k1_fe_mul(&h3, &h, &h2);
402 secp256k1_fe_mul(&h, &h, &b->
z);
406 secp256k1_fe_mul(&r->
z, &a->
z, &h);
407 secp256k1_fe_mul(&t, &u1, &h2);
408 r->
x = t; secp256k1_fe_mul_int(&r->
x, 2); secp256k1_fe_add(&r->
x, &h3); secp256k1_fe_negate(&r->
x, &r->
x, 3); secp256k1_fe_add(&r->
x, &i2);
409 secp256k1_fe_negate(&r->
y, &r->
x, 5); secp256k1_fe_add(&r->
y, &t); secp256k1_fe_mul(&r->
y, &r->
y, &i);
410 secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1);
411 secp256k1_fe_add(&r->
y, &h3);
416 secp256k1_fe z12, u1, u2,
s1,
s2,
h, i, i2,
h2,
h3, t;
419 secp256k1_gej_set_ge(r, b);
424 secp256k1_fe_set_int(rzr, 1);
431 secp256k1_fe_sqr(&z12, &a->
z);
432 u1 = a->
x; secp256k1_fe_normalize_weak(&u1);
433 secp256k1_fe_mul(&u2, &b->
x, &z12);
434 s1 = a->
y; secp256k1_fe_normalize_weak(&s1);
435 secp256k1_fe_mul(&s2, &b->
y, &z12); secp256k1_fe_mul(&s2, &s2, &a->
z);
436 secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2);
437 secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2);
438 if (secp256k1_fe_normalizes_to_zero_var(&h)) {
439 if (secp256k1_fe_normalizes_to_zero_var(&i)) {
440 secp256k1_gej_double_var(r, a, rzr);
443 secp256k1_fe_set_int(rzr, 0);
449 secp256k1_fe_sqr(&i2, &i);
450 secp256k1_fe_sqr(&h2, &h);
451 secp256k1_fe_mul(&h3, &h, &h2);
455 secp256k1_fe_mul(&r->
z, &a->
z, &h);
456 secp256k1_fe_mul(&t, &u1, &h2);
457 r->
x = t; secp256k1_fe_mul_int(&r->
x, 2); secp256k1_fe_add(&r->
x, &h3); secp256k1_fe_negate(&r->
x, &r->
x, 3); secp256k1_fe_add(&r->
x, &i2);
458 secp256k1_fe_negate(&r->
y, &r->
x, 5); secp256k1_fe_add(&r->
y, &t); secp256k1_fe_mul(&r->
y, &r->
y, &i);
459 secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1);
460 secp256k1_fe_add(&r->
y, &h3);
465 secp256k1_fe az, z12, u1, u2,
s1,
s2,
h, i, i2,
h2,
h3, t;
474 secp256k1_fe_sqr(&bzinv2, bzinv);
475 secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv);
476 secp256k1_fe_mul(&r->
x, &b->
x, &bzinv2);
477 secp256k1_fe_mul(&r->
y, &b->
y, &bzinv3);
478 secp256k1_fe_set_int(&r->
z, 1);
491 secp256k1_fe_mul(&az, &a->
z, bzinv);
493 secp256k1_fe_sqr(&z12, &az);
494 u1 = a->
x; secp256k1_fe_normalize_weak(&u1);
495 secp256k1_fe_mul(&u2, &b->
x, &z12);
496 s1 = a->
y; secp256k1_fe_normalize_weak(&s1);
497 secp256k1_fe_mul(&s2, &b->
y, &z12); secp256k1_fe_mul(&s2, &s2, &az);
498 secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2);
499 secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2);
500 if (secp256k1_fe_normalizes_to_zero_var(&h)) {
501 if (secp256k1_fe_normalizes_to_zero_var(&i)) {
502 secp256k1_gej_double_var(r, a, NULL);
508 secp256k1_fe_sqr(&i2, &i);
509 secp256k1_fe_sqr(&h2, &h);
510 secp256k1_fe_mul(&h3, &h, &h2);
511 r->
z = a->
z; secp256k1_fe_mul(&r->
z, &r->
z, &h);
512 secp256k1_fe_mul(&t, &u1, &h2);
513 r->
x = t; secp256k1_fe_mul_int(&r->
x, 2); secp256k1_fe_add(&r->
x, &h3); secp256k1_fe_negate(&r->
x, &r->
x, 3); secp256k1_fe_add(&r->
x, &i2);
514 secp256k1_fe_negate(&r->
y, &r->
x, 5); secp256k1_fe_add(&r->
y, &t); secp256k1_fe_mul(&r->
y, &r->
y, &i);
515 secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1);
516 secp256k1_fe_add(&r->
y, &h3);
523 secp256k1_fe zz, u1, u2,
s1,
s2, t, tt, m, n, q, rr;
525 int infinity, degenerate;
579 secp256k1_fe_sqr(&zz, &a->
z);
580 u1 = a->
x; secp256k1_fe_normalize_weak(&u1);
581 secp256k1_fe_mul(&u2, &b->
x, &zz);
582 s1 = a->
y; secp256k1_fe_normalize_weak(&s1);
583 secp256k1_fe_mul(&s2, &b->
y, &zz);
584 secp256k1_fe_mul(&s2, &s2, &a->
z);
585 t = u1; secp256k1_fe_add(&t, &u2);
586 m =
s1; secp256k1_fe_add(&m, &s2);
587 secp256k1_fe_sqr(&rr, &t);
588 secp256k1_fe_negate(&m_alt, &u2, 1);
589 secp256k1_fe_mul(&tt, &u1, &m_alt);
590 secp256k1_fe_add(&rr, &tt);
593 degenerate = secp256k1_fe_normalizes_to_zero(&m) &
594 secp256k1_fe_normalizes_to_zero(&rr);
601 secp256k1_fe_mul_int(&rr_alt, 2);
602 secp256k1_fe_add(&m_alt, &u1);
604 secp256k1_fe_cmov(&rr_alt, &rr, !degenerate);
605 secp256k1_fe_cmov(&m_alt, &m, !degenerate);
610 secp256k1_fe_sqr(&n, &m_alt);
611 secp256k1_fe_mul(&q, &n, &t);
616 secp256k1_fe_sqr(&n, &n);
617 secp256k1_fe_cmov(&n, &m, degenerate);
618 secp256k1_fe_sqr(&t, &rr_alt);
619 secp256k1_fe_mul(&r->
z, &a->
z, &m_alt);
620 infinity = secp256k1_fe_normalizes_to_zero(&r->
z) * (1 - a->
infinity);
621 secp256k1_fe_mul_int(&r->
z, 2);
622 secp256k1_fe_negate(&q, &q, 1);
623 secp256k1_fe_add(&t, &q);
624 secp256k1_fe_normalize_weak(&t);
626 secp256k1_fe_mul_int(&t, 2);
627 secp256k1_fe_add(&t, &q);
628 secp256k1_fe_mul(&t, &t, &rr_alt);
629 secp256k1_fe_add(&t, &n);
630 secp256k1_fe_negate(&r->
y, &t, 3);
631 secp256k1_fe_normalize_weak(&r->
y);
632 secp256k1_fe_mul_int(&r->
x, 4);
633 secp256k1_fe_mul_int(&r->
y, 4);
638 secp256k1_fe_cmov(&r->
z, &fe_1, a->
infinity);
646 secp256k1_fe_sqr(&zz, s);
647 secp256k1_fe_mul(&r->
x, &r->
x, &zz);
648 secp256k1_fe_mul(&r->
y, &r->
y, &zz);
649 secp256k1_fe_mul(&r->
y, &r->
y, s);
650 secp256k1_fe_mul(&r->
z, &r->
z, s);
657 secp256k1_fe_normalize(&x);
659 secp256k1_fe_normalize(&y);
660 secp256k1_fe_to_storage(&r->
x, &x);
661 secp256k1_fe_to_storage(&r->
y, &y);
665 secp256k1_fe_from_storage(&r->
x, &a->
x);
666 secp256k1_fe_from_storage(&r->
y, &a->
y);
671 secp256k1_fe_storage_cmov(&r->
x, &a->
x, flag);
672 secp256k1_fe_storage_cmov(&r->
y, &a->
y, flag);
675 #ifdef USE_ENDOMORPHISM 678 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul,
679 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul
682 secp256k1_fe_mul(&r->
x, &r->
x, &beta);
686 static int secp256k1_gej_has_quad_y_var(
const secp256k1_gej *a) {
696 secp256k1_fe_mul(&yz, &a->
y, &a->
z);
697 return secp256k1_fe_is_quad_var(&yz);
#define VERIFY_CHECK(cond)
static const std::string s2("AAD")
A group element of the secp256k1 curve, in jacobian coordinates.
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
A group element of the secp256k1 curve, in affine coordinates.
#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)