summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ec_lcl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ec/ec_lcl.h')
-rw-r--r--src/lib/libcrypto/ec/ec_lcl.h241
1 files changed, 64 insertions, 177 deletions
diff --git a/src/lib/libcrypto/ec/ec_lcl.h b/src/lib/libcrypto/ec/ec_lcl.h
index fdd7aa2755..cc4cf27755 100644
--- a/src/lib/libcrypto/ec/ec_lcl.h
+++ b/src/lib/libcrypto/ec/ec_lcl.h
@@ -1,9 +1,6 @@
1/* crypto/ec/ec_lcl.h */ 1/* crypto/ec/ec_lcl.h */
2/*
3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */
5/* ==================================================================== 2/* ====================================================================
6 * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
7 * 4 *
8 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
@@ -55,56 +52,35 @@
55 * Hudson (tjh@cryptsoft.com). 52 * Hudson (tjh@cryptsoft.com).
56 * 53 *
57 */ 54 */
58/* ====================================================================
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60 *
61 * Portions of the attached software ("Contribution") are developed by
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
63 *
64 * The Contribution is licensed pursuant to the OpenSSL open source
65 * license provided above.
66 *
67 * The elliptic curve binary polynomial software is originally written by
68 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
69 *
70 */
71 55
72 56
73#include <stdlib.h> 57#include <stdlib.h>
74 58
75#include <openssl/obj_mac.h>
76#include <openssl/ec.h> 59#include <openssl/ec.h>
77#include <openssl/bn.h>
78 60
79#if defined(__SUNPRO_C)
80# if __SUNPRO_C >= 0x520
81# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)
82# endif
83#endif
84 61
85/* Structure details are not part of the exported interface, 62/* Structure details are not part of the exported interface,
86 * so all this may change in future versions. */ 63 * so all this may change in future versions. */
87 64
88struct ec_method_st { 65struct ec_method_st {
89 /* used by EC_METHOD_get_field_type: */
90 int field_type; /* a NID */
91
92 /* used by EC_GROUP_new, EC_GROUP_free, EC_GROUP_clear_free, EC_GROUP_copy: */ 66 /* used by EC_GROUP_new, EC_GROUP_free, EC_GROUP_clear_free, EC_GROUP_copy: */
93 int (*group_init)(EC_GROUP *); 67 int (*group_init)(EC_GROUP *);
94 void (*group_finish)(EC_GROUP *); 68 void (*group_finish)(EC_GROUP *);
95 void (*group_clear_finish)(EC_GROUP *); 69 void (*group_clear_finish)(EC_GROUP *);
96 int (*group_copy)(EC_GROUP *, const EC_GROUP *); 70 int (*group_copy)(EC_GROUP *, const EC_GROUP *);
97 71
98 /* used by EC_GROUP_set_curve_GFp, EC_GROUP_get_curve_GFp, */ 72 /* used by EC_GROUP_set_curve_GFp and EC_GROUP_get_curve_GFp: */
99 /* EC_GROUP_set_curve_GF2m, and EC_GROUP_get_curve_GF2m: */ 73 int (*group_set_curve_GFp)(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
100 int (*group_set_curve)(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 74 int (*group_get_curve_GFp)(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
101 int (*group_get_curve)(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
102 75
103 /* used by EC_GROUP_get_degree: */ 76 /* used by EC_GROUP_set_generator, EC_GROUP_get0_generator,
104 int (*group_get_degree)(const EC_GROUP *); 77 * EC_GROUP_get_order, EC_GROUP_get_cofactor:
105 78 */
106 /* used by EC_GROUP_check: */ 79 int (*group_set_generator)(EC_GROUP *, const EC_POINT *generator,
107 int (*group_check_discriminant)(const EC_GROUP *, BN_CTX *); 80 const BIGNUM *order, const BIGNUM *cofactor);
81 EC_POINT *(*group_get0_generator)(const EC_GROUP *);
82 int (*group_get_order)(const EC_GROUP *, BIGNUM *order, BN_CTX *);
83 int (*group_get_cofactor)(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *);
108 84
109 /* used by EC_POINT_new, EC_POINT_free, EC_POINT_clear_free, EC_POINT_copy: */ 85 /* used by EC_POINT_new, EC_POINT_free, EC_POINT_clear_free, EC_POINT_copy: */
110 int (*point_init)(EC_POINT *); 86 int (*point_init)(EC_POINT *);
@@ -113,22 +89,20 @@ struct ec_method_st {
113 int (*point_copy)(EC_POINT *, const EC_POINT *); 89 int (*point_copy)(EC_POINT *, const EC_POINT *);
114 90
115 /* used by EC_POINT_set_to_infinity, 91 /* used by EC_POINT_set_to_infinity,
116 * EC_POINT_set_Jprojective_coordinates_GFp, 92 * EC_POINT_set_Jprojective_coordinates_GFp, EC_POINT_get_Jprojective_coordinates_GFp,
117 * EC_POINT_get_Jprojective_coordinates_GFp, 93 * EC_POINT_set_affine_coordinates_GFp, EC_POINT_get_affine_coordinates_GFp,
118 * EC_POINT_set_affine_coordinates_GFp, ..._GF2m, 94 * EC_POINT_set_compressed_coordinates_GFp:
119 * EC_POINT_get_affine_coordinates_GFp, ..._GF2m,
120 * EC_POINT_set_compressed_coordinates_GFp, ..._GF2m:
121 */ 95 */
122 int (*point_set_to_infinity)(const EC_GROUP *, EC_POINT *); 96 int (*point_set_to_infinity)(const EC_GROUP *, EC_POINT *);
123 int (*point_set_Jprojective_coordinates_GFp)(const EC_GROUP *, EC_POINT *, 97 int (*point_set_Jprojective_coordinates_GFp)(const EC_GROUP *, EC_POINT *,
124 const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *); 98 const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
125 int (*point_get_Jprojective_coordinates_GFp)(const EC_GROUP *, const EC_POINT *, 99 int (*point_get_Jprojective_coordinates_GFp)(const EC_GROUP *, const EC_POINT *,
126 BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *); 100 BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
127 int (*point_set_affine_coordinates)(const EC_GROUP *, EC_POINT *, 101 int (*point_set_affine_coordinates_GFp)(const EC_GROUP *, EC_POINT *,
128 const BIGNUM *x, const BIGNUM *y, BN_CTX *); 102 const BIGNUM *x, const BIGNUM *y, BN_CTX *);
129 int (*point_get_affine_coordinates)(const EC_GROUP *, const EC_POINT *, 103 int (*point_get_affine_coordinates_GFp)(const EC_GROUP *, const EC_POINT *,
130 BIGNUM *x, BIGNUM *y, BN_CTX *); 104 BIGNUM *x, BIGNUM *y, BN_CTX *);
131 int (*point_set_compressed_coordinates)(const EC_GROUP *, EC_POINT *, 105 int (*point_set_compressed_coordinates_GFp)(const EC_GROUP *, EC_POINT *,
132 const BIGNUM *x, int y_bit, BN_CTX *); 106 const BIGNUM *x, int y_bit, BN_CTX *);
133 107
134 /* used by EC_POINT_point2oct, EC_POINT_oct2point: */ 108 /* used by EC_POINT_point2oct, EC_POINT_oct2point: */
@@ -151,65 +125,34 @@ struct ec_method_st {
151 int (*make_affine)(const EC_GROUP *, EC_POINT *, BN_CTX *); 125 int (*make_affine)(const EC_GROUP *, EC_POINT *, BN_CTX *);
152 int (*points_make_affine)(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *); 126 int (*points_make_affine)(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
153 127
154 /* used by EC_POINTs_mul, EC_POINT_mul, EC_POINT_precompute_mult, EC_POINT_have_precompute_mult
155 * (default implementations are used if the 'mul' pointer is 0): */
156 int (*mul)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
157 size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
158 int (*precompute_mult)(EC_GROUP *group, BN_CTX *);
159 int (*have_precompute_mult)(const EC_GROUP *group);
160
161 128
162 /* internal functions */ 129 /* internal functions */
163 130
164 /* 'field_mul', 'field_sqr', and 'field_div' can be used by 'add' and 'dbl' so that 131 /* 'field_mul' and 'field_sqr' can be used by 'add' and 'dbl' so that
165 * the same implementations of point operations can be used with different 132 * the same implementations of point operations can be used with different
166 * optimized implementations of expensive field operations: */ 133 * optimized implementations of expensive field operations: */
167 int (*field_mul)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 134 int (*field_mul)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
168 int (*field_sqr)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); 135 int (*field_sqr)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
169 int (*field_div)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
170 136
171 int (*field_encode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. to Montgomery */ 137 int (*field_encode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. to Montgomery */
172 int (*field_decode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. from Montgomery */ 138 int (*field_decode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. from Montgomery */
173 int (*field_set_to_one)(const EC_GROUP *, BIGNUM *r, BN_CTX *); 139 int (*field_set_to_one)(const EC_GROUP *, BIGNUM *r, BN_CTX *);
174} /* EC_METHOD */; 140} /* EC_METHOD */;
175 141
176typedef struct ec_extra_data_st {
177 struct ec_extra_data_st *next;
178 void *data;
179 void *(*dup_func)(void *);
180 void (*free_func)(void *);
181 void (*clear_free_func)(void *);
182} EC_EXTRA_DATA; /* used in EC_GROUP */
183 142
184struct ec_group_st { 143struct ec_group_st {
185 const EC_METHOD *meth; 144 const EC_METHOD *meth;
186 145
187 EC_POINT *generator; /* optional */ 146 void *extra_data;
188 BIGNUM order, cofactor; 147 void *(*extra_data_dup_func)(void *);
189 148 void (*extra_data_free_func)(void *);
190 int curve_name;/* optional NID for named curve */ 149 void (*extra_data_clear_free_func)(void *);
191 int asn1_flag; /* flag to control the asn1 encoding */
192 point_conversion_form_t asn1_form;
193
194 unsigned char *seed; /* optional seed for parameters (appears in ASN1) */
195 size_t seed_len;
196 150
197 EC_EXTRA_DATA *extra_data; /* linked list */ 151 /* All members except 'meth' and 'extra_data...' are handled by
198 152 * the method functions, even if they appear generic */
199 /* The following members are handled by the method functions,
200 * even if they appear generic */
201 153
202 BIGNUM field; /* Field specification. 154 BIGNUM field; /* Field specification.
203 * For curves over GF(p), this is the modulus; 155 * For curves over GF(p), this is the modulus. */
204 * for curves over GF(2^m), this is the
205 * irreducible polynomial defining the field.
206 */
207
208 unsigned int poly[5]; /* Field specification for curves over GF(2^m).
209 * The irreducible f(t) is then of the form:
210 * t^poly[0] + t^poly[1] + ... + t^poly[k]
211 * where m = poly[0] > poly[1] > ... > poly[k] = 0.
212 */
213 156
214 BIGNUM a, b; /* Curve coefficients. 157 BIGNUM a, b; /* Curve coefficients.
215 * (Here the assumption is that BIGNUMs can be used 158 * (Here the assumption is that BIGNUMs can be used
@@ -217,49 +160,29 @@ struct ec_group_st {
217 * For characteristic > 3, the curve is defined 160 * For characteristic > 3, the curve is defined
218 * by a Weierstrass equation of the form 161 * by a Weierstrass equation of the form
219 * y^2 = x^3 + a*x + b. 162 * y^2 = x^3 + a*x + b.
220 * For characteristic 2, the curve is defined by
221 * an equation of the form
222 * y^2 + x*y = x^3 + a*x^2 + b.
223 */ 163 */
224
225 int a_is_minus3; /* enable optimized point arithmetics for special case */ 164 int a_is_minus3; /* enable optimized point arithmetics for special case */
226 165
166 EC_POINT *generator; /* optional */
167 BIGNUM order, cofactor;
168
227 void *field_data1; /* method-specific (e.g., Montgomery structure) */ 169 void *field_data1; /* method-specific (e.g., Montgomery structure) */
228 void *field_data2; /* method-specific */ 170 void *field_data2; /* method-specific */
229 int (*field_mod_func)(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); /* method-specific */
230} /* EC_GROUP */; 171} /* EC_GROUP */;
231 172
232struct ec_key_st {
233 int version;
234
235 EC_GROUP *group;
236
237 EC_POINT *pub_key;
238 BIGNUM *priv_key;
239
240 unsigned int enc_flag;
241 point_conversion_form_t conv_form;
242 173
243 int references; 174/* Basically a 'mixin' for extra data, but available for EC_GROUPs only
244
245 EC_EXTRA_DATA *method_data;
246} /* EC_KEY */;
247
248/* Basically a 'mixin' for extra data, but available for EC_GROUPs/EC_KEYs only
249 * (with visibility limited to 'package' level for now). 175 * (with visibility limited to 'package' level for now).
250 * We use the function pointers as index for retrieval; this obviates 176 * We use the function pointers as index for retrieval; this obviates
251 * global ex_data-style index tables. 177 * global ex_data-style index tables.
252 */ 178 * (Currently, we have one slot only, but is is possible to extend this
253int EC_EX_DATA_set_data(EC_EXTRA_DATA **, void *data, 179 * if necessary.) */
254 void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); 180int EC_GROUP_set_extra_data(EC_GROUP *, void *extra_data, void *(*extra_data_dup_func)(void *),
255void *EC_EX_DATA_get_data(const EC_EXTRA_DATA *, 181 void (*extra_data_free_func)(void *), void (*extra_data_clear_free_func)(void *));
256 void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); 182void *EC_GROUP_get_extra_data(const EC_GROUP *, void *(*extra_data_dup_func)(void *),
257void EC_EX_DATA_free_data(EC_EXTRA_DATA **, 183 void (*extra_data_free_func)(void *), void (*extra_data_clear_free_func)(void *));
258 void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); 184void EC_GROUP_free_extra_data(EC_GROUP *);
259void EC_EX_DATA_clear_free_data(EC_EXTRA_DATA **, 185void EC_GROUP_clear_free_extra_data(EC_GROUP *);
260 void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
261void EC_EX_DATA_free_all_data(EC_EXTRA_DATA **);
262void EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA **);
263 186
264 187
265 188
@@ -278,23 +201,18 @@ struct ec_point_st {
278 201
279 202
280 203
281/* method functions in ec_mult.c
282 * (ec_lib.c uses these as defaults if group->method->mul is 0) */
283int ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
284 size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
285int ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *);
286int ec_wNAF_have_precompute_mult(const EC_GROUP *group);
287
288
289/* method functions in ecp_smpl.c */ 204/* method functions in ecp_smpl.c */
290int ec_GFp_simple_group_init(EC_GROUP *); 205int ec_GFp_simple_group_init(EC_GROUP *);
291void ec_GFp_simple_group_finish(EC_GROUP *); 206void ec_GFp_simple_group_finish(EC_GROUP *);
292void ec_GFp_simple_group_clear_finish(EC_GROUP *); 207void ec_GFp_simple_group_clear_finish(EC_GROUP *);
293int ec_GFp_simple_group_copy(EC_GROUP *, const EC_GROUP *); 208int ec_GFp_simple_group_copy(EC_GROUP *, const EC_GROUP *);
294int ec_GFp_simple_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 209int ec_GFp_simple_group_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
295int ec_GFp_simple_group_get_curve(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *); 210int ec_GFp_simple_group_get_curve_GFp(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
296int ec_GFp_simple_group_get_degree(const EC_GROUP *); 211int ec_GFp_simple_group_set_generator(EC_GROUP *, const EC_POINT *generator,
297int ec_GFp_simple_group_check_discriminant(const EC_GROUP *, BN_CTX *); 212 const BIGNUM *order, const BIGNUM *cofactor);
213EC_POINT *ec_GFp_simple_group_get0_generator(const EC_GROUP *);
214int ec_GFp_simple_group_get_order(const EC_GROUP *, BIGNUM *order, BN_CTX *);
215int ec_GFp_simple_group_get_cofactor(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *);
298int ec_GFp_simple_point_init(EC_POINT *); 216int ec_GFp_simple_point_init(EC_POINT *);
299void ec_GFp_simple_point_finish(EC_POINT *); 217void ec_GFp_simple_point_finish(EC_POINT *);
300void ec_GFp_simple_point_clear_finish(EC_POINT *); 218void ec_GFp_simple_point_clear_finish(EC_POINT *);
@@ -304,11 +222,11 @@ int ec_GFp_simple_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *,
304 const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *); 222 const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
305int ec_GFp_simple_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *, 223int ec_GFp_simple_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
306 BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *); 224 BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
307int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *, EC_POINT *, 225int ec_GFp_simple_point_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *,
308 const BIGNUM *x, const BIGNUM *y, BN_CTX *); 226 const BIGNUM *x, const BIGNUM *y, BN_CTX *);
309int ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *, const EC_POINT *, 227int ec_GFp_simple_point_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
310 BIGNUM *x, BIGNUM *y, BN_CTX *); 228 BIGNUM *x, BIGNUM *y, BN_CTX *);
311int ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *, EC_POINT *, 229int ec_GFp_simple_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *,
312 const BIGNUM *x, int y_bit, BN_CTX *); 230 const BIGNUM *x, int y_bit, BN_CTX *);
313size_t ec_GFp_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form, 231size_t ec_GFp_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
314 unsigned char *buf, size_t len, BN_CTX *); 232 unsigned char *buf, size_t len, BN_CTX *);
@@ -328,7 +246,7 @@ int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX
328 246
329/* method functions in ecp_mont.c */ 247/* method functions in ecp_mont.c */
330int ec_GFp_mont_group_init(EC_GROUP *); 248int ec_GFp_mont_group_init(EC_GROUP *);
331int ec_GFp_mont_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 249int ec_GFp_mont_group_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
332void ec_GFp_mont_group_finish(EC_GROUP *); 250void ec_GFp_mont_group_finish(EC_GROUP *);
333void ec_GFp_mont_group_clear_finish(EC_GROUP *); 251void ec_GFp_mont_group_clear_finish(EC_GROUP *);
334int ec_GFp_mont_group_copy(EC_GROUP *, const EC_GROUP *); 252int ec_GFp_mont_group_copy(EC_GROUP *, const EC_GROUP *);
@@ -339,52 +257,21 @@ int ec_GFp_mont_field_decode(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CT
339int ec_GFp_mont_field_set_to_one(const EC_GROUP *, BIGNUM *r, BN_CTX *); 257int ec_GFp_mont_field_set_to_one(const EC_GROUP *, BIGNUM *r, BN_CTX *);
340 258
341 259
260/* method functions in ecp_recp.c */
261int ec_GFp_recp_group_init(EC_GROUP *);
262int ec_GFp_recp_group_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
263void ec_GFp_recp_group_finish(EC_GROUP *);
264void ec_GFp_recp_group_clear_finish(EC_GROUP *);
265int ec_GFp_recp_group_copy(EC_GROUP *, const EC_GROUP *);
266int ec_GFp_recp_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
267int ec_GFp_recp_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
268
269
342/* method functions in ecp_nist.c */ 270/* method functions in ecp_nist.c */
343int ec_GFp_nist_group_copy(EC_GROUP *dest, const EC_GROUP *src); 271int ec_GFp_nist_group_init(EC_GROUP *);
344int ec_GFp_nist_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 272int ec_GFp_nist_group_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
273void ec_GFp_nist_group_finish(EC_GROUP *);
274void ec_GFp_nist_group_clear_finish(EC_GROUP *);
275int ec_GFp_nist_group_copy(EC_GROUP *, const EC_GROUP *);
345int ec_GFp_nist_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 276int ec_GFp_nist_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
346int ec_GFp_nist_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); 277int ec_GFp_nist_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
347
348
349/* method functions in ec2_smpl.c */
350int ec_GF2m_simple_group_init(EC_GROUP *);
351void ec_GF2m_simple_group_finish(EC_GROUP *);
352void ec_GF2m_simple_group_clear_finish(EC_GROUP *);
353int ec_GF2m_simple_group_copy(EC_GROUP *, const EC_GROUP *);
354int ec_GF2m_simple_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
355int ec_GF2m_simple_group_get_curve(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
356int ec_GF2m_simple_group_get_degree(const EC_GROUP *);
357int ec_GF2m_simple_group_check_discriminant(const EC_GROUP *, BN_CTX *);
358int ec_GF2m_simple_point_init(EC_POINT *);
359void ec_GF2m_simple_point_finish(EC_POINT *);
360void ec_GF2m_simple_point_clear_finish(EC_POINT *);
361int ec_GF2m_simple_point_copy(EC_POINT *, const EC_POINT *);
362int ec_GF2m_simple_point_set_to_infinity(const EC_GROUP *, EC_POINT *);
363int ec_GF2m_simple_point_set_affine_coordinates(const EC_GROUP *, EC_POINT *,
364 const BIGNUM *x, const BIGNUM *y, BN_CTX *);
365int ec_GF2m_simple_point_get_affine_coordinates(const EC_GROUP *, const EC_POINT *,
366 BIGNUM *x, BIGNUM *y, BN_CTX *);
367int ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *, EC_POINT *,
368 const BIGNUM *x, int y_bit, BN_CTX *);
369size_t ec_GF2m_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
370 unsigned char *buf, size_t len, BN_CTX *);
371int ec_GF2m_simple_oct2point(const EC_GROUP *, EC_POINT *,
372 const unsigned char *buf, size_t len, BN_CTX *);
373int ec_GF2m_simple_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
374int ec_GF2m_simple_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
375int ec_GF2m_simple_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);
376int ec_GF2m_simple_is_at_infinity(const EC_GROUP *, const EC_POINT *);
377int ec_GF2m_simple_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
378int ec_GF2m_simple_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
379int ec_GF2m_simple_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
380int ec_GF2m_simple_points_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
381int ec_GF2m_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
382int ec_GF2m_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
383int ec_GF2m_simple_field_div(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
384
385
386/* method functions in ec2_mult.c */
387int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
388 size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
389int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
390int ec_GF2m_have_precompute_mult(const EC_GROUP *group);