1*f0865ec9SKyle Evans /* 2*f0865ec9SKyle Evans * Copyright (C) 2017 - This file is part of libecc project 3*f0865ec9SKyle Evans * 4*f0865ec9SKyle Evans * Authors: 5*f0865ec9SKyle Evans * Ryad BENADJILA <ryadbenadjila@gmail.com> 6*f0865ec9SKyle Evans * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7*f0865ec9SKyle Evans * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8*f0865ec9SKyle Evans * 9*f0865ec9SKyle Evans * Contributors: 10*f0865ec9SKyle Evans * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11*f0865ec9SKyle Evans * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12*f0865ec9SKyle Evans * 13*f0865ec9SKyle Evans * This software is licensed under a dual BSD and GPL v2 license. 14*f0865ec9SKyle Evans * See LICENSE file at the root folder of the project. 15*f0865ec9SKyle Evans */ 16*f0865ec9SKyle Evans #ifndef __EC_PARAMS_H__ 17*f0865ec9SKyle Evans #define __EC_PARAMS_H__ 18*f0865ec9SKyle Evans #include <libecc/fp/fp.h> 19*f0865ec9SKyle Evans #include <libecc/curves/prj_pt.h> 20*f0865ec9SKyle Evans #include <libecc/curves/known/ec_params_external.h> 21*f0865ec9SKyle Evans 22*f0865ec9SKyle Evans /* Info: this include is here because an update on 23*f0865ec9SKyle Evans * MAX_CURVE_OID_LEN and MAX_CURVE_NAME_LEN can be done 24*f0865ec9SKyle Evans * through preprocessing of the curves at compile time. 25*f0865ec9SKyle Evans */ 26*f0865ec9SKyle Evans #include <libecc/curves/curves_list.h> 27*f0865ec9SKyle Evans /* These default sizes should be enough for the known curves */ 28*f0865ec9SKyle Evans #ifdef MAX_CURVE_NAME_LEN 29*f0865ec9SKyle Evans #if (MAX_CURVE_OID_LEN < 32) 30*f0865ec9SKyle Evans #undef MAX_CURVE_OID_LEN 31*f0865ec9SKyle Evans #define MAX_CURVE_OID_LEN 32 /* including trailing 0 */ 32*f0865ec9SKyle Evans #endif 33*f0865ec9SKyle Evans #else 34*f0865ec9SKyle Evans #define MAX_CURVE_OID_LEN 32 /* including trailing 0 */ 35*f0865ec9SKyle Evans #endif 36*f0865ec9SKyle Evans 37*f0865ec9SKyle Evans #ifdef MAX_CURVE_NAME_LEN 38*f0865ec9SKyle Evans #if (MAX_CURVE_NAME_LEN < 32) 39*f0865ec9SKyle Evans #undef MAX_CURVE_NAME_LEN 40*f0865ec9SKyle Evans #define MAX_CURVE_NAME_LEN 32 /* including trailing 0 */ 41*f0865ec9SKyle Evans #endif 42*f0865ec9SKyle Evans #else 43*f0865ec9SKyle Evans #define MAX_CURVE_NAME_LEN 32 44*f0865ec9SKyle Evans #endif 45*f0865ec9SKyle Evans 46*f0865ec9SKyle Evans /* 47*f0865ec9SKyle Evans * Elliptic curves parameters. We only support 48*f0865ec9SKyle Evans * curves defined on prime fields (i.e. Fp, 49*f0865ec9SKyle Evans * with p prime). 50*f0865ec9SKyle Evans */ 51*f0865ec9SKyle Evans typedef struct { 52*f0865ec9SKyle Evans /* Fp */ 53*f0865ec9SKyle Evans fp_ctx ec_fp; 54*f0865ec9SKyle Evans 55*f0865ec9SKyle Evans /* Curve */ 56*f0865ec9SKyle Evans ec_shortw_crv ec_curve; 57*f0865ec9SKyle Evans 58*f0865ec9SKyle Evans /* 59*f0865ec9SKyle Evans * Generator G defining our group, in projective 60*f0865ec9SKyle Evans * coordinates. 61*f0865ec9SKyle Evans */ 62*f0865ec9SKyle Evans prj_pt ec_gen; 63*f0865ec9SKyle Evans 64*f0865ec9SKyle Evans /* Number of points on group generated by G */ 65*f0865ec9SKyle Evans nn ec_gen_order; 66*f0865ec9SKyle Evans bitcnt_t ec_gen_order_bitlen; 67*f0865ec9SKyle Evans 68*f0865ec9SKyle Evans /* Curve cofactor */ 69*f0865ec9SKyle Evans nn ec_gen_cofactor; 70*f0865ec9SKyle Evans 71*f0865ec9SKyle Evans #if !defined(USE_SMALL_STACK) 72*f0865ec9SKyle Evans /* Optional transfer coefficients with Montgomery curves */ 73*f0865ec9SKyle Evans fp ec_alpha_montgomery; 74*f0865ec9SKyle Evans fp ec_gamma_montgomery; 75*f0865ec9SKyle Evans /* Optional transfer coefficient with Edwards curves */ 76*f0865ec9SKyle Evans fp ec_alpha_edwards; 77*f0865ec9SKyle Evans #endif 78*f0865ec9SKyle Evans 79*f0865ec9SKyle Evans /* Object Identifier for the curve */ 80*f0865ec9SKyle Evans u8 curve_oid[MAX_CURVE_OID_LEN]; 81*f0865ec9SKyle Evans 82*f0865ec9SKyle Evans /* Short name for the curve */ 83*f0865ec9SKyle Evans u8 curve_name[MAX_CURVE_NAME_LEN]; 84*f0865ec9SKyle Evans 85*f0865ec9SKyle Evans /* Type of the curve */ 86*f0865ec9SKyle Evans ec_curve_type curve_type; 87*f0865ec9SKyle Evans } ec_params; 88*f0865ec9SKyle Evans 89*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int import_params(ec_params *out_params, const ec_str_params *in_str_params); 90*f0865ec9SKyle Evans 91*f0865ec9SKyle Evans #endif /* __EC_PARAMS_H__ */ 92