tests: Fix test whose result is implementation-defined

A compiler may add struct padding and fe_cmov is not guaranteed to
preserve it.

On the way, we improve the identity check such that it covers the
VERIFY struct members.
This commit is contained in:
Tim Ruffing 2021-12-23 19:28:08 +01:00
parent 09971a3ffd
commit 3d7cbafb5f

View File

@ -2451,13 +2451,16 @@ void run_field_convert(void) {
CHECK(secp256k1_memcmp_var(&fes2, &fes, sizeof(fes)) == 0); CHECK(secp256k1_memcmp_var(&fes2, &fes, sizeof(fes)) == 0);
} }
int fe_secp256k1_memcmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { /* Returns true if two field elements have the same representation. */
secp256k1_fe t = *b; int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b) {
int ret = 1;
#ifdef VERIFY #ifdef VERIFY
t.magnitude = a->magnitude; ret &= (a->magnitude == b->magnitude);
t.normalized = a->normalized; ret &= (a->normalized == b->normalized);
#endif #endif
return secp256k1_memcmp_var(a, &t, sizeof(secp256k1_fe)); /* Compare the struct member that holds the limbs. */
ret &= (secp256k1_memcmp_var(a->n, b->n, sizeof(a->n)) == 0);
return ret;
} }
void run_field_misc(void) { void run_field_misc(void) {
@ -2483,13 +2486,13 @@ void run_field_misc(void) {
CHECK(x.normalized && x.magnitude == 1); CHECK(x.normalized && x.magnitude == 1);
#endif #endif
secp256k1_fe_cmov(&x, &x, 1); secp256k1_fe_cmov(&x, &x, 1);
CHECK(fe_secp256k1_memcmp_var(&x, &z) != 0); CHECK(!fe_identical(&x, &z));
CHECK(fe_secp256k1_memcmp_var(&x, &q) == 0); CHECK(fe_identical(&x, &q));
secp256k1_fe_cmov(&q, &z, 1); secp256k1_fe_cmov(&q, &z, 1);
#ifdef VERIFY #ifdef VERIFY
CHECK(!q.normalized && q.magnitude == z.magnitude); CHECK(!q.normalized && q.magnitude == z.magnitude);
#endif #endif
CHECK(fe_secp256k1_memcmp_var(&q, &z) == 0); CHECK(fe_identical(&q, &z));
secp256k1_fe_normalize_var(&x); secp256k1_fe_normalize_var(&x);
secp256k1_fe_normalize_var(&z); secp256k1_fe_normalize_var(&z);
CHECK(!secp256k1_fe_equal_var(&x, &z)); CHECK(!secp256k1_fe_equal_var(&x, &z));