xref: /freebsd/crypto/libecc/include/libecc/curves/ec_params.h (revision f0865ec9906d5a18fa2a3b61381f22ce16e606ad)
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