Abstract out verify logic for fe_cmov
This commit is contained in:
parent
be82bd8e03
commit
1e6894bdd7
@ -92,6 +92,7 @@ static const secp256k1_fe secp256k1_const_beta = SECP256K1_FE_CONST(
|
|||||||
# define secp256k1_fe_add secp256k1_fe_impl_add
|
# define secp256k1_fe_add secp256k1_fe_impl_add
|
||||||
# define secp256k1_fe_mul secp256k1_fe_impl_mul
|
# define secp256k1_fe_mul secp256k1_fe_impl_mul
|
||||||
# define secp256k1_fe_sqr secp256k1_fe_impl_sqr
|
# define secp256k1_fe_sqr secp256k1_fe_impl_sqr
|
||||||
|
# define secp256k1_fe_cmov secp256k1_fe_impl_cmov
|
||||||
#endif /* !defined(VERIFY) */
|
#endif /* !defined(VERIFY) */
|
||||||
|
|
||||||
/** Normalize a field element.
|
/** Normalize a field element.
|
||||||
@ -271,7 +272,12 @@ static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storag
|
|||||||
/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. Both *r and *a must be initialized.*/
|
/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. Both *r and *a must be initialized.*/
|
||||||
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag);
|
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag);
|
||||||
|
|
||||||
/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. Both *r and *a must be initialized.*/
|
/** Conditionally move a field element in constant time.
|
||||||
|
*
|
||||||
|
* On input, both r and a must be valid field elements. Flag must be 0 or 1.
|
||||||
|
* Performs {r = flag ? a : r}.
|
||||||
|
* On output, r's magnitude and normalized will equal a's in case of flag=1, unchanged otherwise.
|
||||||
|
*/
|
||||||
static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag);
|
static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag);
|
||||||
|
|
||||||
/** Halves the value of a field element modulo the field prime. Constant-time.
|
/** Halves the value of a field element modulo the field prime. Constant-time.
|
||||||
|
@ -1035,7 +1035,7 @@ SECP256K1_INLINE static void secp256k1_fe_impl_sqr(secp256k1_fe *r, const secp25
|
|||||||
secp256k1_fe_sqr_inner(r->n, a->n);
|
secp256k1_fe_sqr_inner(r->n, a->n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
|
SECP256K1_INLINE static void secp256k1_fe_impl_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
|
||||||
uint32_t mask0, mask1;
|
uint32_t mask0, mask1;
|
||||||
volatile int vflag = flag;
|
volatile int vflag = flag;
|
||||||
SECP256K1_CHECKMEM_CHECK_VERIFY(r->n, sizeof(r->n));
|
SECP256K1_CHECKMEM_CHECK_VERIFY(r->n, sizeof(r->n));
|
||||||
@ -1051,12 +1051,6 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_
|
|||||||
r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1);
|
r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1);
|
||||||
r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1);
|
r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1);
|
||||||
r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1);
|
r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1);
|
||||||
#ifdef VERIFY
|
|
||||||
if (flag) {
|
|
||||||
r->magnitude = a->magnitude;
|
|
||||||
r->normalized = a->normalized;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SECP256K1_INLINE void secp256k1_fe_half(secp256k1_fe *r) {
|
static SECP256K1_INLINE void secp256k1_fe_half(secp256k1_fe *r) {
|
||||||
|
@ -369,7 +369,7 @@ SECP256K1_INLINE static void secp256k1_fe_impl_sqr(secp256k1_fe *r, const secp25
|
|||||||
secp256k1_fe_sqr_inner(r->n, a->n);
|
secp256k1_fe_sqr_inner(r->n, a->n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
|
SECP256K1_INLINE static void secp256k1_fe_impl_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
|
||||||
uint64_t mask0, mask1;
|
uint64_t mask0, mask1;
|
||||||
volatile int vflag = flag;
|
volatile int vflag = flag;
|
||||||
SECP256K1_CHECKMEM_CHECK_VERIFY(r->n, sizeof(r->n));
|
SECP256K1_CHECKMEM_CHECK_VERIFY(r->n, sizeof(r->n));
|
||||||
@ -380,12 +380,6 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_
|
|||||||
r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
|
r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
|
||||||
r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
|
r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
|
||||||
r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);
|
r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);
|
||||||
#ifdef VERIFY
|
|
||||||
if (flag) {
|
|
||||||
r->magnitude = a->magnitude;
|
|
||||||
r->normalized = a->normalized;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SECP256K1_INLINE void secp256k1_fe_half(secp256k1_fe *r) {
|
static SECP256K1_INLINE void secp256k1_fe_half(secp256k1_fe *r) {
|
||||||
|
@ -323,6 +323,19 @@ SECP256K1_INLINE static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_f
|
|||||||
r->normalized = 0;
|
r->normalized = 0;
|
||||||
secp256k1_fe_verify(r);
|
secp256k1_fe_verify(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void secp256k1_fe_impl_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag);
|
||||||
|
SECP256K1_INLINE static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
|
||||||
|
VERIFY_CHECK(flag == 0 || flag == 1);
|
||||||
|
secp256k1_fe_verify(a);
|
||||||
|
secp256k1_fe_verify(r);
|
||||||
|
secp256k1_fe_impl_cmov(r, a, flag);
|
||||||
|
if (flag) {
|
||||||
|
r->magnitude = a->magnitude;
|
||||||
|
r->normalized = a->normalized;
|
||||||
|
}
|
||||||
|
secp256k1_fe_verify(r);
|
||||||
|
}
|
||||||
#endif /* defined(VERIFY) */
|
#endif /* defined(VERIFY) */
|
||||||
|
|
||||||
#endif /* SECP256K1_FIELD_IMPL_H */
|
#endif /* SECP256K1_FIELD_IMPL_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user