mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-08 10:31:50 -05:00
Make secp256k1_fe_mul_inner use the r != property
Suggested by Peter Dettman.
This commit is contained in:
parent
be82e92fc4
commit
4d4eeea4ac
1 changed files with 52 additions and 55 deletions
|
@ -34,15 +34,17 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(const uint64_t *a, const uin
|
||||||
* Note that [x 0 0 0 0 0] = [x*R].
|
* Note that [x 0 0 0 0 0] = [x*R].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4];
|
||||||
|
|
||||||
__int128 c, d;
|
__int128 c, d;
|
||||||
|
|
||||||
d = (__int128)a[0] * b[3]
|
d = (__int128)a0 * b[3]
|
||||||
+ (__int128)a[1] * b[2]
|
+ (__int128)a1 * b[2]
|
||||||
+ (__int128)a[2] * b[1]
|
+ (__int128)a2 * b[1]
|
||||||
+ (__int128)a[3] * b[0];
|
+ (__int128)a3 * b[0];
|
||||||
VERIFY_BITS(d, 114);
|
VERIFY_BITS(d, 114);
|
||||||
/* [d 0 0 0] = [p3 0 0 0] */
|
/* [d 0 0 0] = [p3 0 0 0] */
|
||||||
c = (__int128)a[4] * b[4];
|
c = (__int128)a4 * b[4];
|
||||||
VERIFY_BITS(c, 112);
|
VERIFY_BITS(c, 112);
|
||||||
/* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
|
/* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
|
||||||
d += (c & M) * R; c >>= 52;
|
d += (c & M) * R; c >>= 52;
|
||||||
|
@ -54,11 +56,11 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(const uint64_t *a, const uin
|
||||||
VERIFY_BITS(d, 63);
|
VERIFY_BITS(d, 63);
|
||||||
/* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
|
/* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
|
||||||
|
|
||||||
d += (__int128)a[0] * b[4]
|
d += (__int128)a0 * b[4]
|
||||||
+ (__int128)a[1] * b[3]
|
+ (__int128)a1 * b[3]
|
||||||
+ (__int128)a[2] * b[2]
|
+ (__int128)a2 * b[2]
|
||||||
+ (__int128)a[3] * b[1]
|
+ (__int128)a3 * b[1]
|
||||||
+ (__int128)a[4] * b[0];
|
+ (__int128)a4 * b[0];
|
||||||
VERIFY_BITS(d, 115);
|
VERIFY_BITS(d, 115);
|
||||||
/* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
|
/* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
|
||||||
d += c * R;
|
d += c * R;
|
||||||
|
@ -73,13 +75,13 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(const uint64_t *a, const uin
|
||||||
VERIFY_BITS(t4, 48);
|
VERIFY_BITS(t4, 48);
|
||||||
/* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
|
/* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
|
||||||
|
|
||||||
c = (__int128)a[0] * b[0];
|
c = (__int128)a0 * b[0];
|
||||||
VERIFY_BITS(c, 112);
|
VERIFY_BITS(c, 112);
|
||||||
/* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */
|
/* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */
|
||||||
d += (__int128)a[1] * b[4]
|
d += (__int128)a1 * b[4]
|
||||||
+ (__int128)a[2] * b[3]
|
+ (__int128)a2 * b[3]
|
||||||
+ (__int128)a[3] * b[2]
|
+ (__int128)a3 * b[2]
|
||||||
+ (__int128)a[4] * b[1];
|
+ (__int128)a4 * b[1];
|
||||||
VERIFY_BITS(d, 115);
|
VERIFY_BITS(d, 115);
|
||||||
/* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
|
/* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
|
||||||
uint64_t u0 = d & M; d >>= 52;
|
uint64_t u0 = d & M; d >>= 52;
|
||||||
|
@ -93,48 +95,43 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(const uint64_t *a, const uin
|
||||||
c += (__int128)u0 * (R >> 4);
|
c += (__int128)u0 * (R >> 4);
|
||||||
VERIFY_BITS(c, 115);
|
VERIFY_BITS(c, 115);
|
||||||
/* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
|
/* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
|
||||||
uint64_t t0 = c & M; c >>= 52;
|
r[0] = c & M; c >>= 52;
|
||||||
VERIFY_BITS(t0, 52);
|
|
||||||
VERIFY_BITS(c, 61);
|
|
||||||
/* [d 0 t4 t3 0 c t0] = [p8 0 0 p5 p4 p3 0 0 p0] */
|
|
||||||
|
|
||||||
c += (__int128)a[0] * b[1]
|
|
||||||
+ (__int128)a[1] * b[0];
|
|
||||||
VERIFY_BITS(c, 114);
|
|
||||||
/* [d 0 t4 t3 0 c t0] = [p8 0 0 p5 p4 p3 0 p1 p0] */
|
|
||||||
d += (__int128)a[2] * b[4]
|
|
||||||
+ (__int128)a[3] * b[3]
|
|
||||||
+ (__int128)a[4] * b[2];
|
|
||||||
VERIFY_BITS(d, 114);
|
|
||||||
/* [d 0 t4 t3 0 c t0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */
|
|
||||||
c += (d & M) * R; d >>= 52;
|
|
||||||
VERIFY_BITS(c, 115);
|
|
||||||
VERIFY_BITS(d, 62);
|
|
||||||
/* [d 0 0 t4 t3 0 c t0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */
|
|
||||||
uint64_t t1 = c & M; c >>= 52;
|
|
||||||
VERIFY_BITS(t1, 52);
|
|
||||||
VERIFY_BITS(c, 63);
|
|
||||||
/* [d 0 0 t4 t3 c t1 t0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */
|
|
||||||
|
|
||||||
c += (__int128)a[0] * b[2]
|
|
||||||
+ (__int128)a[1] * b[1]
|
|
||||||
+ (__int128)a[2] * b[0];
|
|
||||||
VERIFY_BITS(c, 114);
|
|
||||||
/* [d 0 0 t4 t3 c t1 t0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */
|
|
||||||
d += (__int128)a[3] * b[4]
|
|
||||||
+ (__int128)a[4] * b[3];
|
|
||||||
VERIFY_BITS(d, 114);
|
|
||||||
/* [d 0 0 t4 t3 c t1 t0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
|
||||||
c += (d & M) * R; d >>= 52;
|
|
||||||
VERIFY_BITS(c, 115);
|
|
||||||
VERIFY_BITS(d, 62);
|
|
||||||
/* [d 0 0 0 t4 t3 c t1 t0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
|
||||||
|
|
||||||
r[0] = t0;
|
|
||||||
VERIFY_BITS(r[0], 52);
|
VERIFY_BITS(r[0], 52);
|
||||||
/* [d 0 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
VERIFY_BITS(c, 61);
|
||||||
r[1] = t1;
|
/* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */
|
||||||
|
|
||||||
|
c += (__int128)a0 * b[1]
|
||||||
|
+ (__int128)a1 * b[0];
|
||||||
|
VERIFY_BITS(c, 114);
|
||||||
|
/* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */
|
||||||
|
d += (__int128)a2 * b[4]
|
||||||
|
+ (__int128)a3 * b[3]
|
||||||
|
+ (__int128)a4 * b[2];
|
||||||
|
VERIFY_BITS(d, 114);
|
||||||
|
/* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */
|
||||||
|
c += (d & M) * R; d >>= 52;
|
||||||
|
VERIFY_BITS(c, 115);
|
||||||
|
VERIFY_BITS(d, 62);
|
||||||
|
/* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */
|
||||||
|
r[1] = c & M; c >>= 52;
|
||||||
VERIFY_BITS(r[1], 52);
|
VERIFY_BITS(r[1], 52);
|
||||||
|
VERIFY_BITS(c, 63);
|
||||||
|
/* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */
|
||||||
|
|
||||||
|
c += (__int128)a0 * b[2]
|
||||||
|
+ (__int128)a1 * b[1]
|
||||||
|
+ (__int128)a2 * b[0];
|
||||||
|
VERIFY_BITS(c, 114);
|
||||||
|
/* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */
|
||||||
|
d += (__int128)a3 * b[4]
|
||||||
|
+ (__int128)a4 * b[3];
|
||||||
|
VERIFY_BITS(d, 114);
|
||||||
|
/* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
||||||
|
c += (d & M) * R; d >>= 52;
|
||||||
|
VERIFY_BITS(c, 115);
|
||||||
|
VERIFY_BITS(d, 62);
|
||||||
|
/* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
||||||
|
|
||||||
/* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
/* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
|
||||||
r[2] = c & M; c >>= 52;
|
r[2] = c & M; c >>= 52;
|
||||||
VERIFY_BITS(r[2], 52);
|
VERIFY_BITS(r[2], 52);
|
||||||
|
|
Loading…
Add table
Reference in a new issue