1 /* 2 * Copyright (C) 2017 - This file is part of libecc project 3 * 4 * Authors: 5 * Ryad BENADJILA <ryadbenadjila@gmail.com> 6 * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7 * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8 * 9 * Contributors: 10 * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11 * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12 * 13 * This software is licensed under a dual BSD and GPL v2 license. 14 * See LICENSE file at the root folder of the project. 15 */ 16 #include <libecc/curves/ec_edwards.h> 17 18 #define EC_EDWARDS_CRV_MAGIC ((word_t)(0x9c7349a1837c6794ULL)) 19 20 /* 21 * Check pointed Edwards curve structure has already been 22 * initialized. 23 * 24 * Returns 0 on success, -1 on error. 25 */ 26 int ec_edwards_crv_check_initialized(ec_edwards_crv_src_t crv) 27 { 28 int ret; 29 30 MUST_HAVE((crv != NULL) && (crv->magic == EC_EDWARDS_CRV_MAGIC), ret, err); 31 ret = 0; 32 33 err: 34 return ret; 35 } 36 37 /* 38 * Initialize pointed Edwards curve structure using given a and d 39 * Fp elements representing curve equation (a x^2 + y^2 = 1 + d x^2 y^2) parameters. 40 * 41 * Returns 0 on success, -1 on error. 42 */ 43 int ec_edwards_crv_init(ec_edwards_crv_t crv, fp_src_t a, fp_src_t d, nn_src_t order) 44 { 45 int ret, iszero, cmp; 46 47 ret = nn_check_initialized(order); EG(ret, err); 48 ret = fp_check_initialized(a); EG(ret, err); 49 ret = fp_check_initialized(d); EG(ret, err); 50 MUST_HAVE((a->ctx == d->ctx), ret, err); 51 MUST_HAVE((crv != NULL), ret, err); 52 53 /* a and d in Fp, must be distinct and non zero */ 54 MUST_HAVE((!fp_iszero(a, &iszero)) && (!iszero), ret, err); 55 MUST_HAVE((!fp_iszero(d, &iszero)) && (!iszero), ret, err); 56 MUST_HAVE((!fp_cmp(a, d, &cmp)) && cmp, ret, err); 57 58 ret = fp_init(&(crv->a), a->ctx); EG(ret, err); 59 ret = fp_init(&(crv->d), d->ctx); EG(ret, err); 60 ret = fp_copy(&(crv->a), a); EG(ret, err); 61 ret = fp_copy(&(crv->d), d); EG(ret, err); 62 ret = nn_copy(&(crv->order), order); EG(ret, err); 63 64 crv->magic = EC_EDWARDS_CRV_MAGIC; 65 66 err: 67 return ret; 68 } 69 70 71 /* Uninitialize curve */ 72 void ec_edwards_crv_uninit(ec_edwards_crv_t crv) 73 { 74 if ((crv != NULL) && (crv->magic == EC_EDWARDS_CRV_MAGIC)) { 75 crv->magic = WORD(0); 76 } 77 78 return; 79 } 80