#include <libecc/curves/ec_montgomery.h>
#define EC_MONTGOMERY_CRV_MAGIC ((word_t)(0x83734673a0443720ULL))
int ec_montgomery_crv_check_initialized(ec_montgomery_crv_src_t crv)
{
int ret;
MUST_HAVE((crv != NULL) && (crv->magic == EC_MONTGOMERY_CRV_MAGIC), ret, err);
ret = 0;
err:
return ret;
}
int ec_montgomery_crv_init(ec_montgomery_crv_t crv, fp_src_t A, fp_src_t B, nn_src_t order)
{
int ret, iszero;
fp tmp;
tmp.magic = WORD(0);
MUST_HAVE((crv != NULL), ret, err);
ret = nn_check_initialized(order); EG(ret, err);
ret = fp_check_initialized(A); EG(ret, err);
ret = fp_check_initialized(B); EG(ret, err);
MUST_HAVE(A->ctx == B->ctx, ret, err);
ret = fp_init(&tmp, A->ctx); EG(ret, err);
ret = fp_set_word_value(&tmp, 2); EG(ret, err);
ret = fp_add(&tmp, A, &tmp); EG(ret, err);
MUST_HAVE((!fp_iszero(&tmp, &iszero)) && (!iszero), ret, err);
ret = fp_set_word_value(&tmp, 2); EG(ret, err);
ret = fp_sub(&tmp, A, &tmp); EG(ret, err);
MUST_HAVE((!fp_iszero(&tmp, &iszero)) && (!iszero), ret, err);
MUST_HAVE((!fp_iszero(B, &iszero)) && (!iszero), ret, err);
ret = fp_init(&(crv->A), A->ctx); EG(ret, err);
ret = fp_init(&(crv->B), B->ctx); EG(ret, err);
ret = fp_copy(&(crv->A), A); EG(ret, err);
ret = fp_copy(&(crv->B), B); EG(ret, err);
ret = nn_copy(&(crv->order), order); EG(ret, err);
crv->magic = EC_MONTGOMERY_CRV_MAGIC;
err:
fp_uninit(&tmp);
return ret;
}
void ec_montgomery_crv_uninit(ec_montgomery_crv_t crv)
{
if ((crv != NULL) && (crv->magic == EC_MONTGOMERY_CRV_MAGIC)) {
crv->magic = WORD(0);
}
return;
}