@@ -49,23 +49,23 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t
49
49
c = (uint128_t )a4 * b [4 ];
50
50
VERIFY_BITS (c , 112 );
51
51
/* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
52
- d += (c & M ) * R ; c >>= 52 ;
52
+ d += (uint128_t ) R * ( uint64_t ) c ; c >>= 64 ;
53
53
VERIFY_BITS (d , 115 );
54
- VERIFY_BITS (c , 60 );
55
- /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
54
+ VERIFY_BITS (c , 48 );
55
+ /* [(c<<12) 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
56
56
t3 = d & M ; d >>= 52 ;
57
57
VERIFY_BITS (t3 , 52 );
58
58
VERIFY_BITS (d , 63 );
59
- /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
59
+ /* [(c<<12) 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
60
60
61
61
d += (uint128_t )a0 * b [4 ]
62
62
+ (uint128_t )a1 * b [3 ]
63
63
+ (uint128_t )a2 * b [2 ]
64
64
+ (uint128_t )a3 * b [1 ]
65
65
+ (uint128_t )a4 * b [0 ];
66
66
VERIFY_BITS (d , 115 );
67
- /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
68
- d += c * R ;
67
+ /* [(c<<12) 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
68
+ d += ( uint128_t )( R << 12 ) * ( uint64_t ) c ;
69
69
VERIFY_BITS (d , 116 );
70
70
/* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
71
71
t4 = d & M ; d >>= 52 ;
@@ -129,17 +129,16 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t
129
129
+ (uint128_t )a4 * b [3 ];
130
130
VERIFY_BITS (d , 114 );
131
131
/* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
132
- c += (d & M ) * R ; d >>= 52 ;
132
+ c += (uint128_t ) R * ( uint64_t ) d ; d >>= 64 ;
133
133
VERIFY_BITS (c , 115 );
134
- VERIFY_BITS (d , 62 );
135
- /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
134
+ VERIFY_BITS (d , 50 );
135
+ /* [(d<<12) 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
136
136
137
- /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
138
137
r [2 ] = c & M ; c >>= 52 ;
139
138
VERIFY_BITS (r [2 ], 52 );
140
139
VERIFY_BITS (c , 63 );
141
- /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
142
- c += d * R + t3 ;
140
+ /* [(d<<12) 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
141
+ c += ( uint128_t )( R << 12 ) * ( uint64_t ) d + t3 ;
143
142
VERIFY_BITS (c , 100 );
144
143
/* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
145
144
r [3 ] = c & M ; c >>= 52 ;
@@ -178,22 +177,22 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t
178
177
c = (uint128_t )a4 * a4 ;
179
178
VERIFY_BITS (c , 112 );
180
179
/* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
181
- d += (c & M ) * R ; c >>= 52 ;
180
+ d += (uint128_t ) R * ( uint64_t ) c ; c >>= 64 ;
182
181
VERIFY_BITS (d , 115 );
183
- VERIFY_BITS (c , 60 );
184
- /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
182
+ VERIFY_BITS (c , 48 );
183
+ /* [(c<<12) 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
185
184
t3 = d & M ; d >>= 52 ;
186
185
VERIFY_BITS (t3 , 52 );
187
186
VERIFY_BITS (d , 63 );
188
- /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
187
+ /* [(c<<12) 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */
189
188
190
189
a4 *= 2 ;
191
190
d += (uint128_t )a0 * a4
192
191
+ (uint128_t )(a1 * 2 ) * a3
193
192
+ (uint128_t )a2 * a2 ;
194
193
VERIFY_BITS (d , 115 );
195
- /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
196
- d += c * R ;
194
+ /* [(c<<12) 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
195
+ d += ( uint128_t )( R << 12 ) * ( uint64_t ) c ;
197
196
VERIFY_BITS (d , 116 );
198
197
/* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */
199
198
t4 = d & M ; d >>= 52 ;
@@ -252,16 +251,16 @@ SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t
252
251
d += (uint128_t )a3 * a4 ;
253
252
VERIFY_BITS (d , 114 );
254
253
/* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
255
- c += (d & M ) * R ; d >>= 52 ;
254
+ c += (uint128_t ) R * ( uint64_t ) d ; d >>= 64 ;
256
255
VERIFY_BITS (c , 115 );
257
- VERIFY_BITS (d , 62 );
258
- /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
256
+ VERIFY_BITS (d , 50 );
257
+ /* [(d<<12) 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
259
258
r [2 ] = c & M ; c >>= 52 ;
260
259
VERIFY_BITS (r [2 ], 52 );
261
260
VERIFY_BITS (c , 63 );
262
- /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
261
+ /* [(d<<12) 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
263
262
264
- c += d * R + t3 ;
263
+ c += ( uint128_t )( R << 12 ) * ( uint64_t ) d + t3 ;
265
264
VERIFY_BITS (c , 100 );
266
265
/* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */
267
266
r [3 ] = c & M ; c >>= 52 ;
0 commit comments