Home | History | Annotate | Download | only in ec
      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 (at) 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 (at) cryptsoft.com).  This product includes software written by Tim
     59  * Hudson (tjh (at) 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
     92 extern "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) */
    106 typedef 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 
    118 typedef struct ec_method_st EC_METHOD;
    119 
    120 typedef 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 
    131 typedef 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  */
    142 const EC_METHOD *EC_GFp_simple_method(void);
    143 
    144 /** Returns GFp methods using montgomery multiplication.
    145  *  \return  EC_METHOD object
    146  */
    147 const 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  */
    152 const 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  */
    162 const 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  */
    173 EC_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  */
    178 void 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  */
    183 void 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  */
    190 int 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  */
    197 EC_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  */
    203 const 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  */
    209 int 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  */
    219 int 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  */
    225 const 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  */
    233 int 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  */
    241 int 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  */
    247 void 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  */
    253 int EC_GROUP_get_curve_name(const EC_GROUP *group);
    254 
    255 void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag);
    256 int EC_GROUP_get_asn1_flag(const EC_GROUP *group);
    257 
    258 void EC_GROUP_set_point_conversion_form(EC_GROUP *, point_conversion_form_t);
    259 point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);
    260 
    261 unsigned char *EC_GROUP_get0_seed(const EC_GROUP *);
    262 size_t EC_GROUP_get_seed_len(const EC_GROUP *);
    263 size_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  */
    273 int 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  */
    283 int 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  */
    293 int 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  */
    303 int 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  */
    309 int 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  */
    316 int 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  */
    323 int 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  */
    331 int 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  */
    344 EC_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  */
    354 EC_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  */
    361 EC_GROUP *EC_GROUP_new_by_curve_name(int nid);
    362 
    363 
    364 /********************************************************************/
    365 /*               handling of internal curves                        */
    366 /********************************************************************/
    367 
    368 typedef 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 */
    377 size_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  */
    388 EC_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  */
    393 void 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  */
    398 void 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  */
    405 int 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  */
    413 EC_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  */
    419 const 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  */
    426 int 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  */
    437 int 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  */
    449 int 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  */
    460 int 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  */
    471 int 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  */
    482 int 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  */
    493 int 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  */
    504 int 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  */
    515 int 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  */
    528 size_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  */
    540 int 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: */
    544 BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *,
    545 	point_conversion_form_t form, BIGNUM *, BN_CTX *);
    546 EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *,
    547 	EC_POINT *, BN_CTX *);
    548 char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *,
    549 	point_conversion_form_t form, BN_CTX *);
    550 EC_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  */
    566 int 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  */
    575 int 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  */
    583 int 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  */
    590 int 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  */
    598 int 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  */
    607 int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx);
    608 
    609 int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
    610 int 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  */
    622 int 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  */
    633 int 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  */
    640 int 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  */
    646 int 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 */
    655 int EC_GROUP_get_basis_type(const EC_GROUP *);
    656 int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k);
    657 int 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 
    662 typedef struct ecpk_parameters_st ECPKPARAMETERS;
    663 
    664 EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len);
    665 int 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
    675 int     ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off);
    676 #endif
    677 #ifndef OPENSSL_NO_FP_API
    678 int     ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off);
    679 #endif
    680 
    681 
    682 /********************************************************************/
    683 /*                      EC_KEY functions                            */
    684 /********************************************************************/
    685 
    686 typedef 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  */
    695 EC_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  */
    702 EC_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  */
    707 void 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  */
    714 EC_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  */
    720 EC_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  */
    726 int 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  */
    732 const 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  */
    740 int 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  */
    746 const 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  */
    754 int 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  */
    760 const 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  */
    768 int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub);
    769 
    770 unsigned EC_KEY_get_enc_flags(const EC_KEY *key);
    771 void EC_KEY_set_enc_flags(EC_KEY *, unsigned int);
    772 point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *);
    773 void EC_KEY_set_conv_form(EC_KEY *, point_conversion_form_t);
    774 /* functions to set/get method specific data  */
    775 void *EC_KEY_get_key_method_data(EC_KEY *,
    776 	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
    777 void 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 */
    780 void 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  */
    788 int 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  */
    794 int 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  */
    800 int 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  */
    813 EC_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  */
    821 int 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  */
    835 EC_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  */
    843 int 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  */
    858 EC_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  */
    866 int 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  */
    874 int	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  */
    882 int	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  */
    891 int	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  */
    899 int	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  */
    924 void 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