Path: blob/main/crypto/libecc/src/curves/ec_params.c
34914 views
/*1* Copyright (C) 2017 - This file is part of libecc project2*3* Authors:4* Ryad BENADJILA <[email protected]>5* Arnaud EBALARD <[email protected]>6* Jean-Pierre FLORI <[email protected]>7*8* Contributors:9* Nicolas VIVET <[email protected]>10* Karim KHALFALLAH <[email protected]>11*12* This software is licensed under a dual BSD and GPL v2 license.13* See LICENSE file at the root folder of the project.14*/15#include <libecc/curves/ec_params.h>16#include <libecc/curves/curves.h>1718/*19* Initialize (already allocated) curve parameters structure pointed by20* ec_params using value provided in remaining parameters. The function21* returns 0 on success, -1 on error.22*/23int import_params(ec_params *out_params, const ec_str_params *in_str_params)24{25nn tmp_p, tmp_p_bitlen, tmp_r, tmp_r_square, tmp_mpinv, tmp_p_shift;26nn tmp_p_normalized, tmp_p_reciprocal, tmp_curve_order, tmp_order;27nn tmp_order_bitlen, tmp_cofactor;28fp tmp_a, tmp_b, tmp_gx, tmp_gy, tmp_gz;29ec_curve_type curve_type;30int ret;31tmp_p.magic = tmp_r.magic = tmp_r_square.magic = tmp_mpinv.magic = WORD(0);32tmp_p_shift.magic = tmp_p_normalized.magic = tmp_p_reciprocal.magic = WORD(0);33tmp_a.magic = tmp_b.magic = tmp_curve_order.magic = tmp_gx.magic = WORD(0);34tmp_gy.magic = tmp_gz.magic = tmp_order.magic = tmp_cofactor.magic = WORD(0);35tmp_order_bitlen.magic = tmp_p_bitlen.magic = WORD(0);3637MUST_HAVE(((out_params != NULL) && (in_str_params != NULL)), ret, err);3839ret = local_memset(out_params, 0, sizeof(ec_params)); EG(ret, err);4041/*42* We first need to import p, the prime defining Fp and associated43* Montgomery parameters (r, r^2 and mpinv)44*/45ret = nn_init_from_buf(&tmp_p, PARAM_BUF_PTR(in_str_params->p),46PARAM_BUF_LEN(in_str_params->p)); EG(ret, err);4748ret = nn_init_from_buf(&tmp_p_bitlen,49PARAM_BUF_PTR(in_str_params->p_bitlen),50PARAM_BUF_LEN(in_str_params->p_bitlen)); EG(ret, err);5152ret = nn_init_from_buf(&tmp_r, PARAM_BUF_PTR(in_str_params->r),53PARAM_BUF_LEN(in_str_params->r)); EG(ret, err);5455ret = nn_init_from_buf(&tmp_r_square,56PARAM_BUF_PTR(in_str_params->r_square),57PARAM_BUF_LEN(in_str_params->r_square)); EG(ret, err);5859ret = nn_init_from_buf(&tmp_mpinv,60PARAM_BUF_PTR(in_str_params->mpinv),61PARAM_BUF_LEN(in_str_params->mpinv)); EG(ret, err);6263ret = nn_init_from_buf(&tmp_p_shift,64PARAM_BUF_PTR(in_str_params->p_shift),65PARAM_BUF_LEN(in_str_params->p_shift)); EG(ret, err);6667ret = nn_init_from_buf(&tmp_p_normalized,68PARAM_BUF_PTR(in_str_params->p_normalized),69PARAM_BUF_LEN(in_str_params->p_normalized)); EG(ret, err);7071ret = nn_init_from_buf(&tmp_p_reciprocal,72PARAM_BUF_PTR(in_str_params->p_reciprocal),73PARAM_BUF_LEN(in_str_params->p_reciprocal)); EG(ret, err);7475/* From p, we can create global Fp context */76ret = fp_ctx_init(&(out_params->ec_fp), &tmp_p,77(bitcnt_t)(tmp_p_bitlen.val[0]),78&tmp_r, &tmp_r_square,79tmp_mpinv.val[0], (bitcnt_t)tmp_p_shift.val[0],80&tmp_p_normalized, tmp_p_reciprocal.val[0]); EG(ret, err);8182/*83* Having Fp context, we can import a and b, the coefficient of84* of Weierstrass equation.85*/86ret = fp_init_from_buf(&tmp_a, &(out_params->ec_fp),87PARAM_BUF_PTR(in_str_params->a),88PARAM_BUF_LEN(in_str_params->a)); EG(ret, err);89ret = fp_init_from_buf(&tmp_b, &(out_params->ec_fp),90PARAM_BUF_PTR(in_str_params->b),91PARAM_BUF_LEN(in_str_params->b)); EG(ret, err);9293/*94* Now we can store the number of points in the group generated95* by g and the associated cofactor (i.e. npoints / order).96*/97ret = nn_init_from_buf(&tmp_order,98PARAM_BUF_PTR(in_str_params->gen_order),99PARAM_BUF_LEN(in_str_params->gen_order)); EG(ret, err);100ret = nn_init(&(out_params->ec_gen_order), (u16)(tmp_order.wlen * WORD_BYTES)); EG(ret, err);101ret = nn_copy(&(out_params->ec_gen_order), &tmp_order); EG(ret, err);102103ret = nn_init_from_buf(&tmp_order_bitlen,104PARAM_BUF_PTR(in_str_params->gen_order_bitlen),105PARAM_BUF_LEN(in_str_params->gen_order_bitlen)); EG(ret, err);106out_params->ec_gen_order_bitlen = (bitcnt_t)(tmp_order_bitlen.val[0]);107108ret = nn_init_from_buf(&tmp_cofactor,109PARAM_BUF_PTR(in_str_params->cofactor),110PARAM_BUF_LEN(in_str_params->cofactor)); EG(ret, err);111ret = nn_init(&(out_params->ec_gen_cofactor),112(u16)(tmp_cofactor.wlen * WORD_BYTES)); EG(ret, err);113ret = nn_copy(&(out_params->ec_gen_cofactor), &tmp_cofactor); EG(ret, err);114115/* Now we can store the number of points on the curve (curve order) */116ret = nn_init_from_buf(&tmp_curve_order,117PARAM_BUF_PTR(in_str_params->curve_order),118PARAM_BUF_LEN(in_str_params->curve_order)); EG(ret, err);119120/* Now, we can create curve context from a and b. */121ret = ec_shortw_crv_init(&(out_params->ec_curve), &tmp_a, &tmp_b, &tmp_curve_order); EG(ret, err);122123/* Let's now import G from its affine coordinates (gx,gy) */124ret = fp_init_from_buf(&tmp_gx, &(out_params->ec_fp),125PARAM_BUF_PTR(in_str_params->gx),126PARAM_BUF_LEN(in_str_params->gx)); EG(ret, err);127ret = fp_init_from_buf(&tmp_gy, &(out_params->ec_fp),128PARAM_BUF_PTR(in_str_params->gy),129PARAM_BUF_LEN(in_str_params->gy)); EG(ret, err);130ret = fp_init_from_buf(&tmp_gz, &(out_params->ec_fp),131PARAM_BUF_PTR(in_str_params->gz),132PARAM_BUF_LEN(in_str_params->gz)); EG(ret, err);133ret = prj_pt_init_from_coords(&(out_params->ec_gen),134&(out_params->ec_curve),135&tmp_gx, &tmp_gy, &tmp_gz); EG(ret, err);136137#if !defined(USE_SMALL_STACK)138/* Let's get the optional alpha transfert coefficients */139ret = fp_init_from_buf(&(out_params->ec_alpha_montgomery), &(out_params->ec_fp),140PARAM_BUF_PTR(in_str_params->alpha_montgomery),141PARAM_BUF_LEN(in_str_params->alpha_montgomery)); EG(ret, err);142ret = fp_init_from_buf(&(out_params->ec_gamma_montgomery), &(out_params->ec_fp),143PARAM_BUF_PTR(in_str_params->gamma_montgomery),144PARAM_BUF_LEN(in_str_params->gamma_montgomery)); EG(ret, err);145146ret = fp_init_from_buf(&(out_params->ec_alpha_edwards), &(out_params->ec_fp),147PARAM_BUF_PTR(in_str_params->alpha_edwards),148PARAM_BUF_LEN(in_str_params->alpha_edwards)); EG(ret, err);149#endif150151/* Import a local copy of curve OID */152MUST_HAVE(in_str_params->oid->buflen < MAX_CURVE_OID_LEN, ret, err);153ret = local_memset(out_params->curve_oid, 0, MAX_CURVE_OID_LEN); EG(ret, err);154ret = local_strncpy((char *)(out_params->curve_oid),155(const char *)(in_str_params->oid->buf),156in_str_params->oid->buflen); EG(ret, err);157158/* Import a local copy of curve name */159MUST_HAVE(in_str_params->name->buflen < MAX_CURVE_NAME_LEN, ret, err);160ret = local_memset(out_params->curve_name, 0, MAX_CURVE_NAME_LEN); EG(ret, err);161ret = local_strncpy((char *)(out_params->curve_name),162(const char *)(in_str_params->name->buf),163in_str_params->name->buflen); EG(ret, err);164165/* Get the curve type */166ret = ec_get_curve_type_by_name(in_str_params->name->buf,167in_str_params->name->buflen,168&curve_type); EG(ret, err);169MUST_HAVE(curve_type != UNKNOWN_CURVE, ret, err);170out_params->curve_type = curve_type;171172err:173/* Uninit temporary parameters */174nn_uninit(&tmp_p_bitlen);175nn_uninit(&tmp_order_bitlen);176nn_uninit(&tmp_p);177nn_uninit(&tmp_r);178nn_uninit(&tmp_r_square);179nn_uninit(&tmp_mpinv);180nn_uninit(&tmp_p_shift);181nn_uninit(&tmp_p_normalized);182nn_uninit(&tmp_p_reciprocal);183fp_uninit(&tmp_a);184fp_uninit(&tmp_b);185nn_uninit(&tmp_curve_order);186fp_uninit(&tmp_gx);187fp_uninit(&tmp_gy);188fp_uninit(&tmp_gz);189nn_uninit(&tmp_order);190nn_uninit(&tmp_cofactor);191192return ret;193}194195196