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);
    90 static int secp256k1_ge_is_infinity(
const secp256k1_ge *a) {
    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)
 
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)