#include "bignum.h" #include "gmp.h" void from_bignum(mpz_t i, struct Bignum b) { mpz_import(i, b.len, -1, 1, 0, 0, b.data); } void to_bignum(struct Bignum* b, mpz_t i) { mpz_export(b->data, &b->len, -1, 1, 0, 0, i); } enum bignum_error get_curve25519_mod(struct Bignum* result) { mpz_t mod; mpz_init(mod); mpz_ui_pow_ui(mod, 2, 255); mpz_sub_ui(mod, mod, 19); to_bignum(result, mod); return NoError; } enum bignum_error multiply_mod(struct Bignum* result, struct Bignum const lh, struct Bignum const rh, struct Bignum const mod) { mpz_t lh_; mpz_init(lh_); from_bignum(lh_, lh); mpz_t rh_; mpz_init(rh_); from_bignum(rh_, rh); mpz_t result_; mpz_init(result_); mpz_mul(result_, lh_, rh_); mpz_t mod_; mpz_init(mod_); from_bignum(mod_, mod); mpz_mod(result_, result_, mod_); to_bignum(result, result_); mpz_clear(result_); mpz_clear(lh_); mpz_clear(rh_); mpz_clear(mod_); return NoError; }