ec.h revision 221304ee937bc0910948a8be1320cb8cc4eb6d36
1/* crypto/ec/ec.h */
2/*
3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */
5/**
6 * \file crypto/ec/ec.h Include file for the OpenSSL EC functions
7 * \author Originally written by Bodo Moeller for the OpenSSL project
8 */
9/* ====================================================================
10 * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 *
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in
21 *    the documentation and/or other materials provided with the
22 *    distribution.
23 *
24 * 3. All advertising materials mentioning features or use of this
25 *    software must display the following acknowledgment:
26 *    "This product includes software developed by the OpenSSL Project
27 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
28 *
29 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
30 *    endorse or promote products derived from this software without
31 *    prior written permission. For written permission, please contact
32 *    openssl-core@openssl.org.
33 *
34 * 5. Products derived from this software may not be called "OpenSSL"
35 *    nor may "OpenSSL" appear in their names without prior written
36 *    permission of the OpenSSL Project.
37 *
38 * 6. Redistributions of any form whatsoever must retain the following
39 *    acknowledgment:
40 *    "This product includes software developed by the OpenSSL Project
41 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
42 *
43 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
44 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
46 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
47 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
49 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
50 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
52 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
53 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
54 * OF THE POSSIBILITY OF SUCH DAMAGE.
55 * ====================================================================
56 *
57 * This product includes cryptographic software written by Eric Young
58 * (eay@cryptsoft.com).  This product includes software written by Tim
59 * Hudson (tjh@cryptsoft.com).
60 *
61 */
62/* ====================================================================
63 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
64 *
65 * Portions of the attached software ("Contribution") are developed by
66 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
67 *
68 * The Contribution is licensed pursuant to the OpenSSL open source
69 * license provided above.
70 *
71 * The elliptic curve binary polynomial software is originally written by
72 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
73 *
74 */
75
76#ifndef HEADER_EC_H
77#define HEADER_EC_H
78
79#include <openssl/opensslconf.h>
80
81#ifdef OPENSSL_NO_EC
82#error EC is disabled.
83#endif
84
85#include <openssl/asn1.h>
86#include <openssl/symhacks.h>
87#ifndef OPENSSL_NO_DEPRECATED
88#include <openssl/bn.h>
89#endif
90
91#ifdef  __cplusplus
92extern "C" {
93#elif defined(__SUNPRO_C)
94# if __SUNPRO_C >= 0x520
95# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)
96# endif
97#endif
98
99
100#ifndef OPENSSL_ECC_MAX_FIELD_BITS
101# define OPENSSL_ECC_MAX_FIELD_BITS 661
102#endif
103
104/** Enum for the point conversion form as defined in X9.62 (ECDSA)
105 *  for the encoding of a elliptic curve point (x,y) */
106typedef enum {
107	/** the point is encoded as z||x, where the octet z specifies
108	 *  which solution of the quadratic equation y is  */
109	POINT_CONVERSION_COMPRESSED = 2,
110	/** the point is encoded as z||x||y, where z is the octet 0x02  */
111	POINT_CONVERSION_UNCOMPRESSED = 4,
112	/** the point is encoded as z||x||y, where the octet z specifies
113         *  which solution of the quadratic equation y is  */
114	POINT_CONVERSION_HYBRID = 6
115} point_conversion_form_t;
116
117
118typedef struct ec_method_st EC_METHOD;
119
120typedef struct ec_group_st
121	/*
122	 EC_METHOD *meth;
123	 -- field definition
124	 -- curve coefficients
125	 -- optional generator with associated information (order, cofactor)
126	 -- optional extra data (precomputed table for fast computation of multiples of generator)
127	 -- ASN1 stuff
128	*/
129	EC_GROUP;
130
131typedef struct ec_point_st EC_POINT;
132
133
134/********************************************************************/
135/*               EC_METHODs for curves over GF(p)                   */
136/********************************************************************/
137
138/** Returns the basic GFp ec methods which provides the basis for the
139 *  optimized methods.
140 *  \return  EC_METHOD object
141 */
142const EC_METHOD *EC_GFp_simple_method(void);
143
144/** Returns GFp methods using montgomery multiplication.
145 *  \return  EC_METHOD object
146 */
147const EC_METHOD *EC_GFp_mont_method(void);
148
149/** Returns GFp methods using optimized methods for NIST recommended curves
150 *  \return  EC_METHOD object
151 */
152const EC_METHOD *EC_GFp_nist_method(void);
153
154
155/********************************************************************/
156/*           EC_METHOD for curves over GF(2^m)                      */
157/********************************************************************/
158
159/** Returns the basic GF2m ec method
160 *  \return  EC_METHOD object
161 */
162const EC_METHOD *EC_GF2m_simple_method(void);
163
164
165/********************************************************************/
166/*                   EC_GROUP functions                             */
167/********************************************************************/
168
169/** Creates a new EC_GROUP object
170 *  \param   meth  EC_METHOD to use
171 *  \return  newly created EC_GROUP object or NULL in case of an error.
172 */
173EC_GROUP *EC_GROUP_new(const EC_METHOD *meth);
174
175/** Frees a EC_GROUP object
176 *  \param  group  EC_GROUP object to be freed.
177 */
178void EC_GROUP_free(EC_GROUP *group);
179
180/** Clears and frees a EC_GROUP object
181 *  \param  group  EC_GROUP object to be cleared and freed.
182 */
183void EC_GROUP_clear_free(EC_GROUP *group);
184
185/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD.
186 *  \param  dst  destination EC_GROUP object
187 *  \param  src  source EC_GROUP object
188 *  \return 1 on success and 0 if an error occurred.
189 */
190int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src);
191
192/** Creates a new EC_GROUP object and copies the copies the content
193 *  form src to the newly created EC_KEY object
194 *  \param  src  source EC_GROUP object
195 *  \return newly created EC_GROUP object or NULL in case of an error.
196 */
197EC_GROUP *EC_GROUP_dup(const EC_GROUP *src);
198
199/** Returns the EC_METHOD of the EC_GROUP object.
200 *  \param  group  EC_GROUP object
201 *  \return EC_METHOD used in this EC_GROUP object.
202 */
203const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group);
204
205/** Returns the field type of the EC_METHOD.
206 *  \param  meth  EC_METHOD object
207 *  \return NID of the underlying field type OID.
208 */
209int EC_METHOD_get_field_type(const EC_METHOD *meth);
210
211/** Sets the generator and it's order/cofactor of a EC_GROUP object.
212 *  \param  group      EC_GROUP object
213 *  \param  generator  EC_POINT object with the generator.
214 *  \param  order      the order of the group generated by the generator.
215 *  \param  cofactor   the index of the sub-group generated by the generator
216 *                     in the group of all points on the elliptic curve.
217 *  \return 1 on success and 0 if an error occured
218 */
219int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor);
220
221/** Returns the generator of a EC_GROUP object.
222 *  \param  group  EC_GROUP object
223 *  \return the currently used generator (possibly NULL).
224 */
225const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group);
226
227/** Gets the order of a EC_GROUP
228 *  \param  group  EC_GROUP object
229 *  \param  order  BIGNUM to which the order is copied
230 *  \param  ctx    BN_CTX object (optional)
231 *  \return 1 on success and 0 if an error occured
232 */
233int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);
234
235/** Gets the cofactor of a EC_GROUP
236 *  \param  group     EC_GROUP object
237 *  \param  cofactor  BIGNUM to which the cofactor is copied
238 *  \param  ctx       BN_CTX object (optional)
239 *  \return 1 on success and 0 if an error occured
240 */
241int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx);
242
243/** Sets the name of a EC_GROUP object
244 *  \param  group  EC_GROUP object
245 *  \param  nid    NID of the curve name OID
246 */
247void EC_GROUP_set_curve_name(EC_GROUP *group, int nid);
248
249/** Returns the curve name of a EC_GROUP object
250 *  \param  group  EC_GROUP object
251 *  \return NID of the curve name OID or 0 if not set.
252 */
253int EC_GROUP_get_curve_name(const EC_GROUP *group);
254
255void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag);
256int EC_GROUP_get_asn1_flag(const EC_GROUP *group);
257
258void EC_GROUP_set_point_conversion_form(EC_GROUP *, point_conversion_form_t);
259point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);
260
261unsigned char *EC_GROUP_get0_seed(const EC_GROUP *);
262size_t EC_GROUP_get_seed_len(const EC_GROUP *);
263size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len);
264
265/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b
266 *  \param  group  EC_GROUP object
267 *  \param  p      BIGNUM with the prime number
268 *  \param  a      BIGNUM with parameter a of the equation
269 *  \param  b      BIGNUM with parameter b of the equation
270 *  \param  ctx    BN_CTX object (optional)
271 *  \return 1 on success and 0 if an error occured
272 */
273int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
274
275/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b
276 *  \param  group  EC_GROUP object
277 *  \param  p      BIGNUM for the prime number
278 *  \param  a      BIGNUM for parameter a of the equation
279 *  \param  b      BIGNUM for parameter b of the equation
280 *  \param  ctx    BN_CTX object (optional)
281 *  \return 1 on success and 0 if an error occured
282 */
283int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
284
285/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
286 *  \param  group  EC_GROUP object
287 *  \param  p      BIGNUM with the polynomial defining the underlying field
288 *  \param  a      BIGNUM with parameter a of the equation
289 *  \param  b      BIGNUM with parameter b of the equation
290 *  \param  ctx    BN_CTX object (optional)
291 *  \return 1 on success and 0 if an error occured
292 */
293int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
294
295/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
296 *  \param  group  EC_GROUP object
297 *  \param  p      BIGNUM for the polynomial defining the underlying field
298 *  \param  a      BIGNUM for parameter a of the equation
299 *  \param  b      BIGNUM for parameter b of the equation
300 *  \param  ctx    BN_CTX object (optional)
301 *  \return 1 on success and 0 if an error occured
302 */
303int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
304
305/** Returns the number of bits needed to represent a field element
306 *  \param  group  EC_GROUP object
307 *  \return number of bits needed to represent a field element
308 */
309int EC_GROUP_get_degree(const EC_GROUP *group);
310
311/** Checks whether the parameter in the EC_GROUP define a valid ec group
312 *  \param  group  EC_GROUP object
313 *  \param  ctx    BN_CTX object (optional)
314 *  \return 1 if group is a valid ec group and 0 otherwise
315 */
316int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx);
317
318/** Checks whether the discriminant of the elliptic curve is zero or not
319 *  \param  group  EC_GROUP object
320 *  \param  ctx    BN_CTX object (optional)
321 *  \return 1 if the discriminant is not zero and 0 otherwise
322 */
323int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx);
324
325/** Compares two EC_GROUP objects
326 *  \param  a    first EC_GROUP object
327 *  \param  b    second EC_GROUP object
328 *  \param  ctx  BN_CTX object (optional)
329 *  \return 0 if both groups are equal and 1 otherwise
330 */
331int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx);
332
333/* EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*()
334 * after choosing an appropriate EC_METHOD */
335
336/** Creates a new EC_GROUP object with the specified parameters defined
337 *  over GFp (defined by the equation y^2 = x^3 + a*x + b)
338 *  \param  p    BIGNUM with the prime number
339 *  \param  a    BIGNUM with the parameter a of the equation
340 *  \param  b    BIGNUM with the parameter b of the equation
341 *  \param  ctx  BN_CTX object (optional)
342 *  \return newly created EC_GROUP object with the specified parameters
343 */
344EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
345
346/** Creates a new EC_GROUP object with the specified parameters defined
347 *  over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b)
348 *  \param  p    BIGNUM with the polynomial defining the underlying field
349 *  \param  a    BIGNUM with the parameter a of the equation
350 *  \param  b    BIGNUM with the parameter b of the equation
351 *  \param  ctx  BN_CTX object (optional)
352 *  \return newly created EC_GROUP object with the specified parameters
353 */
354EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
355
356/** Creates a EC_GROUP object with a curve specified by a NID
357 *  \param  nid  NID of the OID of the curve name
358 *  \return newly created EC_GROUP object with specified curve or NULL
359 *          if an error occurred
360 */
361EC_GROUP *EC_GROUP_new_by_curve_name(int nid);
362
363
364/********************************************************************/
365/*               handling of internal curves                        */
366/********************************************************************/
367
368typedef struct {
369	int nid;
370	const char *comment;
371	} EC_builtin_curve;
372
373/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number
374 * of all available curves or zero if a error occurred.
375 * In case r ist not zero nitems EC_builtin_curve structures
376 * are filled with the data of the first nitems internal groups */
377size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);
378
379
380/********************************************************************/
381/*                    EC_POINT functions                            */
382/********************************************************************/
383
384/** Creates a new EC_POINT object for the specified EC_GROUP
385 *  \param  group  EC_GROUP the underlying EC_GROUP object
386 *  \return newly created EC_POINT object or NULL if an error occurred
387 */
388EC_POINT *EC_POINT_new(const EC_GROUP *group);
389
390/** Frees a EC_POINT object
391 *  \param  point  EC_POINT object to be freed
392 */
393void EC_POINT_free(EC_POINT *point);
394
395/** Clears and frees a EC_POINT object
396 *  \param  point  EC_POINT object to be cleared and freed
397 */
398void EC_POINT_clear_free(EC_POINT *point);
399
400/** Copies EC_POINT object
401 *  \param  dst  destination EC_POINT object
402 *  \param  src  source EC_POINT object
403 *  \return 1 on success and 0 if an error occured
404 */
405int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src);
406
407/** Creates a new EC_POINT object and copies the content of the supplied
408 *  EC_POINT
409 *  \param  src    source EC_POINT object
410 *  \param  group  underlying the EC_GROUP object
411 *  \return newly created EC_POINT object or NULL if an error occurred
412 */
413EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group);
414
415/** Returns the EC_METHOD used in EC_POINT object
416 *  \param  point  EC_POINT object
417 *  \return the EC_METHOD used
418 */
419const EC_METHOD *EC_POINT_method_of(const EC_POINT *point);
420
421/** Sets a point to infinity (neutral element)
422 *  \param  group  underlying EC_GROUP object
423 *  \param  point  EC_POINT to set to infinity
424 *  \return 1 on success and 0 if an error occured
425 */
426int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point);
427
428/** Sets the jacobian projective coordinates of a EC_POINT over GFp
429 *  \param  group  underlying EC_GROUP object
430 *  \param  p      EC_POINT object
431 *  \param  x      BIGNUM with the x-coordinate
432 *  \param  y      BIGNUM with the y-coordinate
433 *  \param  z      BIGNUM with the z-coordinate
434 *  \param  ctx    BN_CTX object (optional)
435 *  \return 1 on success and 0 if an error occured
436 */
437int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
438	const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx);
439
440/** Gets the jacobian projective coordinates of a EC_POINT over GFp
441 *  \param  group  underlying EC_GROUP object
442 *  \param  p      EC_POINT object
443 *  \param  x      BIGNUM for the x-coordinate
444 *  \param  y      BIGNUM for the y-coordinate
445 *  \param  z      BIGNUM for the z-coordinate
446 *  \param  ctx    BN_CTX object (optional)
447 *  \return 1 on success and 0 if an error occured
448 */
449int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group,
450	const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx);
451
452/** Sets the affine coordinates of a EC_POINT over GFp
453 *  \param  group  underlying EC_GROUP object
454 *  \param  p      EC_POINT object
455 *  \param  x      BIGNUM with the x-coordinate
456 *  \param  y      BIGNUM with the y-coordinate
457 *  \param  ctx    BN_CTX object (optional)
458 *  \return 1 on success and 0 if an error occured
459 */
460int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
461	const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx);
462
463/** Gets the affine coordinates of a EC_POINT over GFp
464 *  \param  group  underlying EC_GROUP object
465 *  \param  p      EC_POINT object
466 *  \param  x      BIGNUM for the x-coordinate
467 *  \param  y      BIGNUM for the y-coordinate
468 *  \param  ctx    BN_CTX object (optional)
469 *  \return 1 on success and 0 if an error occured
470 */
471int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,
472	const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
473
474/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp
475 *  \param  group  underlying EC_GROUP object
476 *  \param  p      EC_POINT object
477 *  \param  x      BIGNUM with x-coordinate
478 *  \param  y_bit  integer with the y-Bit (either 0 or 1)
479 *  \param  ctx    BN_CTX object (optional)
480 *  \return 1 on success and 0 if an error occured
481 */
482int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
483	const BIGNUM *x, int y_bit, BN_CTX *ctx);
484
485/** Sets the affine coordinates of a EC_POINT over GF2m
486 *  \param  group  underlying EC_GROUP object
487 *  \param  p      EC_POINT object
488 *  \param  x      BIGNUM with the x-coordinate
489 *  \param  y      BIGNUM with the y-coordinate
490 *  \param  ctx    BN_CTX object (optional)
491 *  \return 1 on success and 0 if an error occured
492 */
493int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p,
494	const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx);
495
496/** Gets the affine coordinates of a EC_POINT over GF2m
497 *  \param  group  underlying EC_GROUP object
498 *  \param  p      EC_POINT object
499 *  \param  x      BIGNUM for the x-coordinate
500 *  \param  y      BIGNUM for the y-coordinate
501 *  \param  ctx    BN_CTX object (optional)
502 *  \return 1 on success and 0 if an error occured
503 */
504int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,
505	const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
506
507/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m
508 *  \param  group  underlying EC_GROUP object
509 *  \param  p      EC_POINT object
510 *  \param  x      BIGNUM with x-coordinate
511 *  \param  y_bit  integer with the y-Bit (either 0 or 1)
512 *  \param  ctx    BN_CTX object (optional)
513 *  \return 1 on success and 0 if an error occured
514 */
515int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p,
516	const BIGNUM *x, int y_bit, BN_CTX *ctx);
517
518/** Encodes a EC_POINT object to a octet string
519 *  \param  group  underlying EC_GROUP object
520 *  \param  p      EC_POINT object
521 *  \param  form   point conversion form
522 *  \param  buf    memory buffer for the result. If NULL the function returns
523 *                 required buffer size.
524 *  \param  len    length of the memory buffer
525 *  \param  ctx    BN_CTX object (optional)
526 *  \return the length of the encoded octet string or 0 if an error occurred
527 */
528size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p,
529	point_conversion_form_t form,
530        unsigned char *buf, size_t len, BN_CTX *ctx);
531
532/** Decodes a EC_POINT from a octet string
533 *  \param  group  underlying EC_GROUP object
534 *  \param  p      EC_POINT object
535 *  \param  buf    memory buffer with the encoded ec point
536 *  \param  len    length of the encoded ec point
537 *  \param  ctx    BN_CTX object (optional)
538 *  \return 1 on success and 0 if an error occured
539 */
540int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p,
541        const unsigned char *buf, size_t len, BN_CTX *ctx);
542
543/* other interfaces to point2oct/oct2point: */
544BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *,
545	point_conversion_form_t form, BIGNUM *, BN_CTX *);
546EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *,
547	EC_POINT *, BN_CTX *);
548char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *,
549	point_conversion_form_t form, BN_CTX *);
550EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *,
551	EC_POINT *, BN_CTX *);
552
553
554/********************************************************************/
555/*         functions for doing EC_POINT arithmetic                  */
556/********************************************************************/
557
558/** Computes the sum of two EC_POINT
559 *  \param  group  underlying EC_GROUP object
560 *  \param  r      EC_POINT object for the result (r = a + b)
561 *  \param  a      EC_POINT object with the first summand
562 *  \param  b      EC_POINT object with the second summand
563 *  \param  ctx    BN_CTX object (optional)
564 *  \return 1 on success and 0 if an error occured
565 */
566int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx);
567
568/** Computes the double of a EC_POINT
569 *  \param  group  underlying EC_GROUP object
570 *  \param  r      EC_POINT object for the result (r = 2 * a)
571 *  \param  a      EC_POINT object
572 *  \param  ctx    BN_CTX object (optional)
573 *  \return 1 on success and 0 if an error occured
574 */
575int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx);
576
577/** Computes the inverse of a EC_POINT
578 *  \param  group  underlying EC_GROUP object
579 *  \param  a      EC_POINT object to be inverted (it's used for the result as well)
580 *  \param  ctx    BN_CTX object (optional)
581 *  \return 1 on success and 0 if an error occured
582 */
583int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx);
584
585/** Checks whether the point is the neutral element of the group
586 *  \param  group  the underlying EC_GROUP object
587 *  \param  p      EC_POINT object
588 *  \return 1 if the point is the neutral element and 0 otherwise
589 */
590int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p);
591
592/** Checks whether the point is on the curve
593 *  \param  group  underlying EC_GROUP object
594 *  \param  point  EC_POINT object to check
595 *  \param  ctx    BN_CTX object (optional)
596 *  \return 1 if point if on the curve and 0 otherwise
597 */
598int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx);
599
600/** Compares two EC_POINTs
601 *  \param  group  underlying EC_GROUP object
602 *  \param  a      first EC_POINT object
603 *  \param  b      second EC_POINT object
604 *  \param  ctx    BN_CTX object (optional)
605 *  \return 0 if both points are equal and a value != 0 otherwise
606 */
607int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx);
608
609int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
610int EC_POINTs_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
611
612/** Computes r = generator * n sum_{i=0}^num p[i] * m[i]
613 *  \param  group  underlying EC_GROUP object
614 *  \param  r      EC_POINT object for the result
615 *  \param  n      BIGNUM with the multiplier for the group generator (optional)
616 *  \param  num    number futher summands
617 *  \param  p      array of size num of EC_POINT objects
618 *  \param  m      array of size num of BIGNUM objects
619 *  \param  ctx    BN_CTX object (optional)
620 *  \return 1 on success and 0 if an error occured
621 */
622int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, size_t num, const EC_POINT *p[], const BIGNUM *m[], BN_CTX *ctx);
623
624/** Computes r = generator * n + q * m
625 *  \param  group  underlying EC_GROUP object
626 *  \param  r      EC_POINT object for the result
627 *  \param  n      BIGNUM with the multiplier for the group generator (optional)
628 *  \param  q      EC_POINT object with the first factor of the second summand
629 *  \param  m      BIGNUM with the second factor of the second summand
630 *  \param  ctx    BN_CTX object (optional)
631 *  \return 1 on success and 0 if an error occured
632 */
633int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx);
634
635/** Stores multiples of generator for faster point multiplication
636 *  \param  group  EC_GROUP object
637 *  \param  ctx    BN_CTX object (optional)
638 *  \return 1 on success and 0 if an error occured
639 */
640int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
641
642/** Reports whether a precomputation has been done
643 *  \param  group  EC_GROUP object
644 *  \return 1 if a pre-computation has been done and 0 otherwise
645 */
646int EC_GROUP_have_precompute_mult(const EC_GROUP *group);
647
648
649/********************************************************************/
650/*                       ASN1 stuff                                 */
651/********************************************************************/
652
653/* EC_GROUP_get_basis_type() returns the NID of the basis type
654 * used to represent the field elements */
655int EC_GROUP_get_basis_type(const EC_GROUP *);
656int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k);
657int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1,
658	unsigned int *k2, unsigned int *k3);
659
660#define OPENSSL_EC_NAMED_CURVE	0x001
661
662typedef struct ecpk_parameters_st ECPKPARAMETERS;
663
664EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len);
665int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out);
666
667#define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x)
668#define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x)
669#define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \
670                (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x))
671#define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \
672		(unsigned char *)(x))
673
674#ifndef OPENSSL_NO_BIO
675int     ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off);
676#endif
677#ifndef OPENSSL_NO_FP_API
678int     ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off);
679#endif
680
681
682/********************************************************************/
683/*                      EC_KEY functions                            */
684/********************************************************************/
685
686typedef struct ec_key_st EC_KEY;
687
688/* some values for the encoding_flag */
689#define EC_PKEY_NO_PARAMETERS	0x001
690#define EC_PKEY_NO_PUBKEY	0x002
691
692/** Creates a new EC_KEY object.
693 *  \return EC_KEY object or NULL if an error occurred.
694 */
695EC_KEY *EC_KEY_new(void);
696
697/** Creates a new EC_KEY object using a named curve as underlying
698 *  EC_GROUP object.
699 *  \param  nid  NID of the named curve.
700 *  \return EC_KEY object or NULL if an error occurred.
701 */
702EC_KEY *EC_KEY_new_by_curve_name(int nid);
703
704/** Frees a EC_KEY object.
705 *  \param  key  EC_KEY object to be freed.
706 */
707void EC_KEY_free(EC_KEY *key);
708
709/** Copies a EC_KEY object.
710 *  \param  dst  destination EC_KEY object
711 *  \param  src  src EC_KEY object
712 *  \return dst or NULL if an error occurred.
713 */
714EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src);
715
716/** Creates a new EC_KEY object and copies the content from src to it.
717 *  \param  src  the source EC_KEY object
718 *  \return newly created EC_KEY object or NULL if an error occurred.
719 */
720EC_KEY *EC_KEY_dup(const EC_KEY *src);
721
722/** Increases the internal reference count of a EC_KEY object.
723 *  \param  key  EC_KEY object
724 *  \return 1 on success and 0 if an error occurred.
725 */
726int EC_KEY_up_ref(EC_KEY *key);
727
728/** Returns the EC_GROUP object of a EC_KEY object
729 *  \param  key  EC_KEY object
730 *  \return the EC_GROUP object (possibly NULL).
731 */
732const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key);
733
734/** Sets the EC_GROUP of a EC_KEY object.
735 *  \param  key    EC_KEY object
736 *  \param  group  EC_GROUP to use in the EC_KEY object (note: the EC_KEY
737 *                 object will use an own copy of the EC_GROUP).
738 *  \return 1 on success and 0 if an error occurred.
739 */
740int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group);
741
742/** Returns the private key of a EC_KEY object.
743 *  \param  key  EC_KEY object
744 *  \return a BIGNUM with the private key (possibly NULL).
745 */
746const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key);
747
748/** Sets the private key of a EC_KEY object.
749 *  \param  key  EC_KEY object
750 *  \param  prv  BIGNUM with the private key (note: the EC_KEY object
751 *               will use an own copy of the BIGNUM).
752 *  \return 1 on success and 0 if an error occurred.
753 */
754int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv);
755
756/** Returns the public key of a EC_KEY object.
757 *  \param  key  the EC_KEY object
758 *  \return a EC_POINT object with the public key (possibly NULL)
759 */
760const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key);
761
762/** Sets the public key of a EC_KEY object.
763 *  \param  key  EC_KEY object
764 *  \param  pub  EC_POINT object with the public key (note: the EC_KEY object
765 *               will use an own copy of the EC_POINT object).
766 *  \return 1 on success and 0 if an error occurred.
767 */
768int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub);
769
770unsigned EC_KEY_get_enc_flags(const EC_KEY *key);
771void EC_KEY_set_enc_flags(EC_KEY *, unsigned int);
772point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *);
773void EC_KEY_set_conv_form(EC_KEY *, point_conversion_form_t);
774/* functions to set/get method specific data  */
775void *EC_KEY_get_key_method_data(EC_KEY *,
776	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
777void EC_KEY_insert_key_method_data(EC_KEY *, void *data,
778	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
779/* wrapper functions for the underlying EC_GROUP object */
780void EC_KEY_set_asn1_flag(EC_KEY *, int);
781
782/** Creates a table of pre-computed multiples of the generator to
783 *  accelerate further EC_KEY operations.
784 *  \param  key  EC_KEY object
785 *  \param  ctx  BN_CTX object (optional)
786 *  \return 1 on success and 0 if an error occurred.
787 */
788int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx);
789
790/** Creates a new ec private (and optional a new public) key.
791 *  \param  key  EC_KEY object
792 *  \return 1 on success and 0 if an error occurred.
793 */
794int EC_KEY_generate_key(EC_KEY *key);
795
796/** Verifies that a private and/or public key is valid.
797 *  \param  key  the EC_KEY object
798 *  \return 1 on success and 0 otherwise.
799 */
800int EC_KEY_check_key(const EC_KEY *key);
801
802
803/********************************************************************/
804/*        de- and encoding functions for SEC1 ECPrivateKey          */
805/********************************************************************/
806
807/** Decodes a private key from a memory buffer.
808 *  \param  key  a pointer to a EC_KEY object which should be used (or NULL)
809 *  \param  in   pointer to memory with the DER encoded private key
810 *  \param  len  length of the DER encoded private key
811 *  \return the decoded private key or NULL if an error occurred.
812 */
813EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len);
814
815/** Encodes a private key object and stores the result in a buffer.
816 *  \param  key  the EC_KEY object to encode
817 *  \param  out  the buffer for the result (if NULL the function returns number
818 *               of bytes needed).
819 *  \return 1 on success and 0 if an error occurred.
820 */
821int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out);
822
823
824/********************************************************************/
825/*        de- and encoding functions for EC parameters              */
826/********************************************************************/
827
828/** Decodes ec parameter from a memory buffer.
829 *  \param  key  a pointer to a EC_KEY object which should be used (or NULL)
830 *  \param  in   pointer to memory with the DER encoded ec parameters
831 *  \param  len  length of the DER encoded ec parameters
832 *  \return a EC_KEY object with the decoded parameters or NULL if an error
833 *          occurred.
834 */
835EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len);
836
837/** Encodes ec parameter and stores the result in a buffer.
838 *  \param  key  the EC_KEY object with ec paramters to encode
839 *  \param  out  the buffer for the result (if NULL the function returns number
840 *               of bytes needed).
841 *  \return 1 on success and 0 if an error occurred.
842 */
843int i2d_ECParameters(EC_KEY *key, unsigned char **out);
844
845
846/********************************************************************/
847/*         de- and encoding functions for EC public key             */
848/*         (octet string, not DER -- hence 'o2i' and 'i2o')         */
849/********************************************************************/
850
851/** Decodes a ec public key from a octet string.
852 *  \param  key  a pointer to a EC_KEY object which should be used
853 *  \param  in   memory buffer with the encoded public key
854 *  \param  len  length of the encoded public key
855 *  \return EC_KEY object with decoded public key or NULL if an error
856 *          occurred.
857 */
858EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len);
859
860/** Encodes a ec public key in an octet string.
861 *  \param  key  the EC_KEY object with the public key
862 *  \param  out  the buffer for the result (if NULL the function returns number
863 *               of bytes needed).
864 *  \return 1 on success and 0 if an error occurred
865 */
866int i2o_ECPublicKey(EC_KEY *key, unsigned char **out);
867
868#ifndef OPENSSL_NO_BIO
869/** Prints out the ec parameters on human readable form.
870 *  \param  bp   BIO object to which the information is printed
871 *  \param  key  EC_KEY object
872 *  \return 1 on success and 0 if an error occurred
873 */
874int	ECParameters_print(BIO *bp, const EC_KEY *key);
875
876/** Prints out the contents of a EC_KEY object
877 *  \param  bp   BIO object to which the information is printed
878 *  \param  key  EC_KEY object
879 *  \param  off  line offset
880 *  \return 1 on success and 0 if an error occurred
881 */
882int	EC_KEY_print(BIO *bp, const EC_KEY *key, int off);
883
884#endif
885#ifndef OPENSSL_NO_FP_API
886/** Prints out the ec parameters on human readable form.
887 *  \param  fp   file descriptor to which the information is printed
888 *  \param  key  EC_KEY object
889 *  \return 1 on success and 0 if an error occurred
890 */
891int	ECParameters_print_fp(FILE *fp, const EC_KEY *key);
892
893/** Prints out the contents of a EC_KEY object
894 *  \param  fp   file descriptor to which the information is printed
895 *  \param  key  EC_KEY object
896 *  \param  off  line offset
897 *  \return 1 on success and 0 if an error occurred
898 */
899int	EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off);
900
901#endif
902
903#define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x)
904
905#ifndef __cplusplus
906#if defined(__SUNPRO_C)
907#  if __SUNPRO_C >= 0x520
908# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)
909#  endif
910# endif
911#endif
912
913#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \
914	EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, EVP_PKEY_OP_PARAMGEN, \
915				EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL)
916
917
918#define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID		(EVP_PKEY_ALG_CTRL + 1)
919
920/* BEGIN ERROR CODES */
921/* The following lines are auto generated by the script mkerr.pl. Any changes
922 * made after this point may be overwritten when the script is next run.
923 */
924void ERR_load_EC_strings(void);
925
926/* Error codes for the EC functions. */
927
928/* Function codes. */
929#define EC_F_COMPUTE_WNAF				 143
930#define EC_F_D2I_ECPARAMETERS				 144
931#define EC_F_D2I_ECPKPARAMETERS				 145
932#define EC_F_D2I_ECPRIVATEKEY				 146
933#define EC_F_DO_EC_KEY_PRINT				 221
934#define EC_F_ECKEY_PARAM2TYPE				 223
935#define EC_F_ECKEY_PARAM_DECODE				 212
936#define EC_F_ECKEY_PRIV_DECODE				 213
937#define EC_F_ECKEY_PRIV_ENCODE				 214
938#define EC_F_ECKEY_PUB_DECODE				 215
939#define EC_F_ECKEY_PUB_ENCODE				 216
940#define EC_F_ECKEY_TYPE2PARAM				 220
941#define EC_F_ECPARAMETERS_PRINT				 147
942#define EC_F_ECPARAMETERS_PRINT_FP			 148
943#define EC_F_ECPKPARAMETERS_PRINT			 149
944#define EC_F_ECPKPARAMETERS_PRINT_FP			 150
945#define EC_F_ECP_NIST_MOD_192				 203
946#define EC_F_ECP_NIST_MOD_224				 204
947#define EC_F_ECP_NIST_MOD_256				 205
948#define EC_F_ECP_NIST_MOD_521				 206
949#define EC_F_EC_ASN1_GROUP2CURVE			 153
950#define EC_F_EC_ASN1_GROUP2FIELDID			 154
951#define EC_F_EC_ASN1_GROUP2PARAMETERS			 155
952#define EC_F_EC_ASN1_GROUP2PKPARAMETERS			 156
953#define EC_F_EC_ASN1_PARAMETERS2GROUP			 157
954#define EC_F_EC_ASN1_PKPARAMETERS2GROUP			 158
955#define EC_F_EC_EX_DATA_SET_DATA			 211
956#define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY		 208
957#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT	 159
958#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE		 195
959#define EC_F_EC_GF2M_SIMPLE_OCT2POINT			 160
960#define EC_F_EC_GF2M_SIMPLE_POINT2OCT			 161
961#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162
962#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163
963#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES	 164
964#define EC_F_EC_GFP_MONT_FIELD_DECODE			 133
965#define EC_F_EC_GFP_MONT_FIELD_ENCODE			 134
966#define EC_F_EC_GFP_MONT_FIELD_MUL			 131
967#define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE		 209
968#define EC_F_EC_GFP_MONT_FIELD_SQR			 132
969#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE		 189
970#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP		 135
971#define EC_F_EC_GFP_NIST_FIELD_MUL			 200
972#define EC_F_EC_GFP_NIST_FIELD_SQR			 201
973#define EC_F_EC_GFP_NIST_GROUP_SET_CURVE		 202
974#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT	 165
975#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE		 166
976#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP		 100
977#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR		 101
978#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE			 102
979#define EC_F_EC_GFP_SIMPLE_OCT2POINT			 103
980#define EC_F_EC_GFP_SIMPLE_POINT2OCT			 104
981#define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE		 137
982#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES	 167
983#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105
984#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES	 168
985#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128
986#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES	 169
987#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129
988#define EC_F_EC_GROUP_CHECK				 170
989#define EC_F_EC_GROUP_CHECK_DISCRIMINANT		 171
990#define EC_F_EC_GROUP_COPY				 106
991#define EC_F_EC_GROUP_GET0_GENERATOR			 139
992#define EC_F_EC_GROUP_GET_COFACTOR			 140
993#define EC_F_EC_GROUP_GET_CURVE_GF2M			 172
994#define EC_F_EC_GROUP_GET_CURVE_GFP			 130
995#define EC_F_EC_GROUP_GET_DEGREE			 173
996#define EC_F_EC_GROUP_GET_ORDER				 141
997#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS		 193
998#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS		 194
999#define EC_F_EC_GROUP_NEW				 108
1000#define EC_F_EC_GROUP_NEW_BY_CURVE_NAME			 174
1001#define EC_F_EC_GROUP_NEW_FROM_DATA			 175
1002#define EC_F_EC_GROUP_PRECOMPUTE_MULT			 142
1003#define EC_F_EC_GROUP_SET_CURVE_GF2M			 176
1004#define EC_F_EC_GROUP_SET_CURVE_GFP			 109
1005#define EC_F_EC_GROUP_SET_EXTRA_DATA			 110
1006#define EC_F_EC_GROUP_SET_GENERATOR			 111
1007#define EC_F_EC_KEY_CHECK_KEY				 177
1008#define EC_F_EC_KEY_COPY				 178
1009#define EC_F_EC_KEY_GENERATE_KEY			 179
1010#define EC_F_EC_KEY_NEW					 182
1011#define EC_F_EC_KEY_PRINT				 180
1012#define EC_F_EC_KEY_PRINT_FP				 181
1013#define EC_F_EC_POINTS_MAKE_AFFINE			 136
1014#define EC_F_EC_POINT_ADD				 112
1015#define EC_F_EC_POINT_CMP				 113
1016#define EC_F_EC_POINT_COPY				 114
1017#define EC_F_EC_POINT_DBL				 115
1018#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M	 183
1019#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP	 116
1020#define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP	 117
1021#define EC_F_EC_POINT_INVERT				 210
1022#define EC_F_EC_POINT_IS_AT_INFINITY			 118
1023#define EC_F_EC_POINT_IS_ON_CURVE			 119
1024#define EC_F_EC_POINT_MAKE_AFFINE			 120
1025#define EC_F_EC_POINT_MUL				 184
1026#define EC_F_EC_POINT_NEW				 121
1027#define EC_F_EC_POINT_OCT2POINT				 122
1028#define EC_F_EC_POINT_POINT2OCT				 123
1029#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M	 185
1030#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP	 124
1031#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M	 186
1032#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP	 125
1033#define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP	 126
1034#define EC_F_EC_POINT_SET_TO_INFINITY			 127
1035#define EC_F_EC_PRE_COMP_DUP				 207
1036#define EC_F_EC_PRE_COMP_NEW				 196
1037#define EC_F_EC_WNAF_MUL				 187
1038#define EC_F_EC_WNAF_PRECOMPUTE_MULT			 188
1039#define EC_F_I2D_ECPARAMETERS				 190
1040#define EC_F_I2D_ECPKPARAMETERS				 191
1041#define EC_F_I2D_ECPRIVATEKEY				 192
1042#define EC_F_I2O_ECPUBLICKEY				 151
1043#define EC_F_O2I_ECPUBLICKEY				 152
1044#define EC_F_OLD_EC_PRIV_DECODE				 222
1045#define EC_F_PKEY_EC_CTRL				 197
1046#define EC_F_PKEY_EC_CTRL_STR				 198
1047#define EC_F_PKEY_EC_DERIVE				 217
1048#define EC_F_PKEY_EC_KEYGEN				 199
1049#define EC_F_PKEY_EC_PARAMGEN				 219
1050#define EC_F_PKEY_EC_SIGN				 218
1051
1052/* Reason codes. */
1053#define EC_R_ASN1_ERROR					 115
1054#define EC_R_ASN1_UNKNOWN_FIELD				 116
1055#define EC_R_BUFFER_TOO_SMALL				 100
1056#define EC_R_D2I_ECPKPARAMETERS_FAILURE			 117
1057#define EC_R_DECODE_ERROR				 142
1058#define EC_R_DISCRIMINANT_IS_ZERO			 118
1059#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE		 119
1060#define EC_R_FIELD_TOO_LARGE				 143
1061#define EC_R_GROUP2PKPARAMETERS_FAILURE			 120
1062#define EC_R_I2D_ECPKPARAMETERS_FAILURE			 121
1063#define EC_R_INCOMPATIBLE_OBJECTS			 101
1064#define EC_R_INVALID_ARGUMENT				 112
1065#define EC_R_INVALID_COMPRESSED_POINT			 110
1066#define EC_R_INVALID_COMPRESSION_BIT			 109
1067#define EC_R_INVALID_CURVE				 141
1068#define EC_R_INVALID_DIGEST_TYPE			 138
1069#define EC_R_INVALID_ENCODING				 102
1070#define EC_R_INVALID_FIELD				 103
1071#define EC_R_INVALID_FORM				 104
1072#define EC_R_INVALID_GROUP_ORDER			 122
1073#define EC_R_INVALID_PENTANOMIAL_BASIS			 132
1074#define EC_R_INVALID_PRIVATE_KEY			 123
1075#define EC_R_INVALID_TRINOMIAL_BASIS			 137
1076#define EC_R_KEYS_NOT_SET				 140
1077#define EC_R_MISSING_PARAMETERS				 124
1078#define EC_R_MISSING_PRIVATE_KEY			 125
1079#define EC_R_NOT_A_NIST_PRIME				 135
1080#define EC_R_NOT_A_SUPPORTED_NIST_PRIME			 136
1081#define EC_R_NOT_IMPLEMENTED				 126
1082#define EC_R_NOT_INITIALIZED				 111
1083#define EC_R_NO_FIELD_MOD				 133
1084#define EC_R_NO_PARAMETERS_SET				 139
1085#define EC_R_PASSED_NULL_PARAMETER			 134
1086#define EC_R_PKPARAMETERS2GROUP_FAILURE			 127
1087#define EC_R_POINT_AT_INFINITY				 106
1088#define EC_R_POINT_IS_NOT_ON_CURVE			 107
1089#define EC_R_SLOT_FULL					 108
1090#define EC_R_UNDEFINED_GENERATOR			 113
1091#define EC_R_UNDEFINED_ORDER				 128
1092#define EC_R_UNKNOWN_GROUP				 129
1093#define EC_R_UNKNOWN_ORDER				 114
1094#define EC_R_UNSUPPORTED_FIELD				 131
1095#define EC_R_WRONG_ORDER				 130
1096
1097#ifdef  __cplusplus
1098}
1099#endif
1100#endif
1101