mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-30 10:42:23 +02:00
Merge pull request #267
5a43124
Save 1 _fe_negate since s1 == -s2 (Peter Dettman)a5d796e
Update code comments (Peter Dettman)7d054cd
Refactor to save a _fe_negate (Peter Dettman)b28d02a
Refactor to remove a local var (Peter Dettman)55e7fc3
Perf. improvement in _gej_add_ge (Peter Dettman)
This commit is contained in:
@ -461,9 +461,9 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej_t *r, const secp256k1_gej_t
|
|||||||
|
|
||||||
|
|
||||||
static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) {
|
static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) {
|
||||||
/* Operations: 7 mul, 5 sqr, 5 normalize, 17 mul_int/add/negate/cmov */
|
/* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */
|
||||||
static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
|
static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
|
||||||
secp256k1_fe_t zz, u1, u2, s1, s2, z, t, tt, m, n, q, rr;
|
secp256k1_fe_t zz, u1, u2, s1, s2, t, tt, m, n, q, rr;
|
||||||
secp256k1_fe_t m_alt, rr_alt;
|
secp256k1_fe_t m_alt, rr_alt;
|
||||||
int infinity, degenerate;
|
int infinity, degenerate;
|
||||||
VERIFY_CHECK(!b->infinity);
|
VERIFY_CHECK(!b->infinity);
|
||||||
@ -525,12 +525,12 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
|
|||||||
s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */
|
s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */
|
||||||
secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */
|
secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */
|
||||||
secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */
|
secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */
|
||||||
z = a->z; /* z = Z = Z1*Z2 (8) */
|
|
||||||
t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */
|
t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */
|
||||||
m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */
|
m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */
|
||||||
secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */
|
secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */
|
||||||
secp256k1_fe_mul(&tt, &u1, &u2); secp256k1_fe_negate(&tt, &tt, 1); /* tt = -U1*U2 (2) */
|
secp256k1_fe_negate(&m_alt, &u2, 1); /* Malt = -X2*Z1^2 */
|
||||||
secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */
|
secp256k1_fe_mul(&tt, &u1, &m_alt); /* tt = -U1*U2 (2) */
|
||||||
|
secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */
|
||||||
/** If lambda = R/M = 0/0 we have a problem (except in the "trivial"
|
/** If lambda = R/M = 0/0 we have a problem (except in the "trivial"
|
||||||
* case that Z = z1z2 = 0, and this is special-cased later on). */
|
* case that Z = z1z2 = 0, and this is special-cased later on). */
|
||||||
degenerate = secp256k1_fe_normalizes_to_zero(&m) &
|
degenerate = secp256k1_fe_normalizes_to_zero(&m) &
|
||||||
@ -540,10 +540,9 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
|
|||||||
* a nontrivial cube root of one. In either case, an alternate
|
* a nontrivial cube root of one. In either case, an alternate
|
||||||
* non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2),
|
* non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2),
|
||||||
* so we set R/M equal to this. */
|
* so we set R/M equal to this. */
|
||||||
secp256k1_fe_negate(&rr_alt, &s2, 1); /* rr = -Y2*Z1^3 */
|
rr_alt = s1;
|
||||||
secp256k1_fe_add(&rr_alt, &s1); /* rr = Y1*Z2^3 - Y2*Z1^3 */
|
secp256k1_fe_mul_int(&rr_alt, 2); /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */
|
||||||
secp256k1_fe_negate(&m_alt, &u2, 1); /* m = -X2*Z1^2 */
|
secp256k1_fe_add(&m_alt, &u1); /* Malt = X1*Z2^2 - X2*Z1^2 */
|
||||||
secp256k1_fe_add(&m_alt, &u1); /* m = X1*Z2^2 - X2*Z1^2 */
|
|
||||||
|
|
||||||
secp256k1_fe_cmov(&rr_alt, &rr, !degenerate);
|
secp256k1_fe_cmov(&rr_alt, &rr, !degenerate);
|
||||||
secp256k1_fe_cmov(&m_alt, &m, !degenerate);
|
secp256k1_fe_cmov(&m_alt, &m, !degenerate);
|
||||||
@ -557,23 +556,21 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
|
|||||||
* so M^3 * Malt is either Malt^4 (which is computed by squaring), or
|
* so M^3 * Malt is either Malt^4 (which is computed by squaring), or
|
||||||
* zero (which is "computed" by cmov). So the cost is one squaring
|
* zero (which is "computed" by cmov). So the cost is one squaring
|
||||||
* versus two multiplications. */
|
* versus two multiplications. */
|
||||||
secp256k1_fe_sqr(&n, &n); /* n = M^3 * Malt (1) */
|
secp256k1_fe_sqr(&n, &n);
|
||||||
secp256k1_fe_cmov(&n, &m, degenerate);
|
secp256k1_fe_cmov(&n, &m, degenerate); /* n = M^3 * Malt (2) */
|
||||||
secp256k1_fe_normalize_weak(&n);
|
|
||||||
secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */
|
secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */
|
||||||
secp256k1_fe_mul(&r->z, &m_alt, &z); /* r->z = Malt*Z (1) */
|
secp256k1_fe_mul(&r->z, &a->z, &m_alt); /* r->z = Malt*Z (1) */
|
||||||
infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity);
|
infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity);
|
||||||
secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */
|
secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */
|
||||||
r->x = t; /* r->x = Ralt^2 (1) */
|
|
||||||
secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */
|
secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */
|
||||||
secp256k1_fe_add(&r->x, &q); /* r->x = Ralt^2-Q (3) */
|
secp256k1_fe_add(&t, &q); /* t = Ralt^2-Q (3) */
|
||||||
secp256k1_fe_normalize(&r->x);
|
secp256k1_fe_normalize_weak(&t);
|
||||||
t = r->x;
|
r->x = t; /* r->x = Ralt^2-Q (1) */
|
||||||
secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */
|
secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */
|
||||||
secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (8) */
|
secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (4) */
|
||||||
secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */
|
secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */
|
||||||
secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (2) */
|
secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */
|
||||||
secp256k1_fe_negate(&r->y, &t, 2); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (3) */
|
secp256k1_fe_negate(&r->y, &t, 3); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */
|
||||||
secp256k1_fe_normalize_weak(&r->y);
|
secp256k1_fe_normalize_weak(&r->y);
|
||||||
secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */
|
secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */
|
||||||
secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */
|
secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */
|
||||||
|
Reference in New Issue
Block a user