/*********************************************************************** * Distributed under the MIT software license, see the accompanying * * file COPYING or https://www.opensource.org/licenses/mit-license.php.* ***********************************************************************/ #ifndef SECP256K1_TESTUTIL_H #define SECP256K1_TESTUTIL_H #include "field.h" #include "testrand.h" #include "util.h" static void random_fe(secp256k1_fe *x) { unsigned char bin[32]; do { secp256k1_testrand256(bin); if (secp256k1_fe_set_b32_limit(x, bin)) { return; } } while(1); } static void random_fe_non_zero(secp256k1_fe *nz) { do { random_fe(nz); } while (secp256k1_fe_is_zero(nz)); } static void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { CHECK(a->infinity == b->infinity); if (a->infinity) { return; } CHECK(secp256k1_fe_equal(&a->x, &b->x)); CHECK(secp256k1_fe_equal(&a->y, &b->y)); } static void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { secp256k1_fe z2s; secp256k1_fe u1, u2, s1, s2; CHECK(a->infinity == b->infinity); if (a->infinity) { return; } /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ secp256k1_fe_sqr(&z2s, &b->z); secp256k1_fe_mul(&u1, &a->x, &z2s); u2 = b->x; secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); s2 = b->y; CHECK(secp256k1_fe_equal(&u1, &u2)); CHECK(secp256k1_fe_equal(&s1, &s2)); } #endif /* SECP256K1_TESTUTIL_H */