ec.h 21.8 KB
Newer Older
1 2
/* crypto/ec/ec.h */
/* ====================================================================
B
Bodo Möller 已提交
3
 * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
B
Bodo Möller 已提交
4
 *
5 6 7
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
B
Bodo Möller 已提交
8
 *
9 10
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
B
Bodo Möller 已提交
11
 *
12 13 14 15
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
B
Bodo Möller 已提交
16
 *
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
B
Bodo Möller 已提交
53 54
 *
 */
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 *
 * Portions of the attached software ("Contribution") are developed by 
 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
 *
 * The Contribution is licensed pursuant to the OpenSSL open source
 * license provided above.
 *
 * In addition, Sun covenants to all licensees who provide a reciprocal
 * covenant with respect to their own patents if any, not to sue under
 * current and future patent claims necessarily infringed by the making,
 * using, practicing, selling, offering for sale and/or otherwise
 * disposing of the Contribution as delivered hereunder 
 * (or portions thereof), provided that such covenant shall not apply:
 *  1) for code that a licensee deletes from the Contribution;
 *  2) separates from the Contribution; or
 *  3) for infringements caused by:
 *       i) the modification of the Contribution or
 *      ii) the combination of the Contribution with other software or
 *          devices where such combination causes the infringement.
 *
 * The elliptic curve binary polynomial software is originally written by 
 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
 *
 */
B
Bodo Möller 已提交
81 82 83 84

#ifndef HEADER_EC_H
#define HEADER_EC_H

85
#ifdef OPENSSL_NO_EC
86
#error EC is disabled.
87 88
#endif

B
Bodo Möller 已提交
89
#include <openssl/bn.h>
90
#include <openssl/asn1.h>
91
#include <openssl/symhacks.h>
B
Bodo Möller 已提交
92

93 94 95
#ifdef  __cplusplus
extern "C" {
#endif
B
Bodo Möller 已提交
96 97


98
typedef enum {
99
	/* values as defined in X9.62 (ECDSA) and elsewhere */
100 101 102 103 104 105 106 107 108 109 110 111 112 113
	POINT_CONVERSION_COMPRESSED = 2,
	POINT_CONVERSION_UNCOMPRESSED = 4,
	POINT_CONVERSION_HYBRID = 6
} point_conversion_form_t;


typedef struct ec_method_st EC_METHOD;

typedef struct ec_group_st
	/*
	 EC_METHOD *meth;
	 -- field definition
	 -- curve coefficients
	 -- optional generator with associated information (order, cofactor)
114
	 -- optional extra data (TODO: precomputed table for fast computation of multiples of generator)
115
	 -- ASN1 stuff
116 117 118 119 120 121 122 123 124 125 126
	*/
	EC_GROUP;

typedef struct ec_point_st EC_POINT;


/* EC_METHODs for curves over GF(p).
 * EC_GFp_simple_method provides the basis for the optimized methods.
 */
const EC_METHOD *EC_GFp_simple_method(void);
const EC_METHOD *EC_GFp_mont_method(void);
127
#if 0
128 129
const EC_METHOD *EC_GFp_recp_method(void); /* TODO */
const EC_METHOD *EC_GFp_nist_method(void); /* TODO */
130
#endif
131

132 133 134 135 136
/* EC_METHODs for curves over GF(2^m).
 * EC_GF2m_simple_method provides the basis for the optimized methods.
 */
const EC_METHOD *EC_GF2m_simple_method(void);

137 138

EC_GROUP *EC_GROUP_new(const EC_METHOD *);
139 140 141
void EC_GROUP_free(EC_GROUP *);
void EC_GROUP_clear_free(EC_GROUP *);
int EC_GROUP_copy(EC_GROUP *, const EC_GROUP *);
142
EC_GROUP *EC_GROUP_dup(const EC_GROUP *);
143

144
const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *);
145
int EC_METHOD_get_field_type(const EC_METHOD *);
146 147 148 149 150 151

int EC_GROUP_set_generator(EC_GROUP *, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor);
EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *);
int EC_GROUP_get_order(const EC_GROUP *, BIGNUM *order, BN_CTX *);
int EC_GROUP_get_cofactor(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *);

152
void EC_GROUP_set_nid(EC_GROUP *, int); /* curve name */
B
Bodo Möller 已提交
153 154
int EC_GROUP_get_nid(const EC_GROUP *);

155 156 157 158 159 160 161 162 163
void EC_GROUP_set_asn1_flag(EC_GROUP *, int flag);
int EC_GROUP_get_asn1_flag(const EC_GROUP *);

void EC_GROUP_set_point_conversion_form(EC_GROUP *, point_conversion_form_t);
point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);

unsigned char *EC_GROUP_get0_seed(const EC_GROUP *);
size_t EC_GROUP_get_seed_len(const EC_GROUP *);
size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len);
164

165
int EC_GROUP_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
166
int EC_GROUP_get_curve_GFp(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
167 168 169 170
int EC_GROUP_set_curve_GF2m(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int EC_GROUP_get_curve_GF2m(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);

int EC_GROUP_get_degree(const EC_GROUP *);
171

B
Bodo Möller 已提交
172 173
/* EC_GROUP_check() returns 1 if 'group' defines a valid group, 0 otherwise */
int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx);
174 175 176
/* EC_GROUP_check_discriminant() returns 1 if the discriminant of the
 * elliptic curve is not zero, 0 otherwise */
int EC_GROUP_check_discriminant(const EC_GROUP *, BN_CTX *);
B
Bodo Möller 已提交
177

178
/* EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*()
B
Bodo Möller 已提交
179 180
 * after choosing an appropriate EC_METHOD */
EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
181
EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
B
Bodo Möller 已提交
182

183 184
/* EC_GROUP_new_by_nid() and EC_GROUP_new_by_name() also set
 * generator and order */
B
Bodo Möller 已提交
185
EC_GROUP *EC_GROUP_new_by_nid(int nid);
186
EC_GROUP *EC_GROUP_new_by_name(int name);
B
Bodo Möller 已提交
187
/* Currently valid arguments to EC_GROUP_new_by_name() */
B
Bodo Möller 已提交
188
#define EC_GROUP_NO_CURVE		0
189
#define EC_GROUP_NIST_PRIME_192		NID_X9_62_prime192v1
B
Bodo Möller 已提交
190
#define EC_GROUP_NIST_PRIME_224		NID_secp224r1
191
#define EC_GROUP_NIST_PRIME_256		NID_X9_62_prime256v1
B
Bodo Möller 已提交
192 193
#define EC_GROUP_NIST_PRIME_384		NID_secp384r1
#define EC_GROUP_NIST_PRIME_521		NID_secp521r1
B
Bodo Möller 已提交
194 195 196 197 198 199 200
#define EC_GROUP_X9_62_PRIME_192V1	NID_X9_62_prime192v1
#define EC_GROUP_X9_62_PRIME_192V2	NID_X9_62_prime192v2
#define EC_GROUP_X9_62_PRIME_192V3	NID_X9_62_prime192v3
#define EC_GROUP_X9_62_PRIME_239V1	NID_X9_62_prime239v1
#define EC_GROUP_X9_62_PRIME_239V2	NID_X9_62_prime239v2
#define EC_GROUP_X9_62_PRIME_239V3	NID_X9_62_prime239v3
#define EC_GROUP_X9_62_PRIME_256V1	NID_X9_62_prime256v1
B
Bodo Möller 已提交
201 202 203 204 205 206 207 208
#define EC_GROUP_SECG_PRIME_112R1	NID_secp112r1
#define EC_GROUP_SECG_PRIME_112R2	NID_secp112r2
#define EC_GROUP_SECG_PRIME_128R1	NID_secp128r1
#define EC_GROUP_SECG_PRIME_128R2	NID_secp128r2
#define EC_GROUP_SECG_PRIME_160K1	NID_secp160k1
#define EC_GROUP_SECG_PRIME_160R1	NID_secp160r1
#define EC_GROUP_SECG_PRIME_160R2	NID_secp160r2
#define EC_GROUP_SECG_PRIME_192K1	NID_secp192k1
209
#define EC_GROUP_SECG_PRIME_192R1	NID_X9_62_prime192v1
B
Bodo Möller 已提交
210 211 212
#define EC_GROUP_SECG_PRIME_224K1	NID_secp224k1
#define EC_GROUP_SECG_PRIME_224R1	NID_secp224r1
#define EC_GROUP_SECG_PRIME_256K1	NID_secp256k1
213
#define EC_GROUP_SECG_PRIME_256R1	NID_X9_62_prime256v1
B
Bodo Möller 已提交
214 215
#define EC_GROUP_SECG_PRIME_384R1	NID_secp384r1
#define EC_GROUP_SECG_PRIME_521R1	NID_secp521r1
B
Bodo Möller 已提交
216
#define EC_GROUP_WTLS_6			NID_wap_wsg_idm_ecid_wtls6
217
#define EC_GROUP_WTLS_7			NID_wap_wsg_idm_ecid_wtls7
B
Bodo Möller 已提交
218 219
#define EC_GROUP_WTLS_8			NID_wap_wsg_idm_ecid_wtls8
#define EC_GROUP_WTLS_9			NID_wap_wsg_idm_ecid_wtls9
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
#define EC_GROUP_WTLS_12		NID_wap_wsg_idm_ecid_wtls12
#define EC_GROUP_NIST_CHAR2_K163	NID_sect163k1
#define EC_GROUP_NIST_CHAR2_B163	NID_sect163r2
#define EC_GROUP_NIST_CHAR2_K233	NID_sect233k1
#define EC_GROUP_NIST_CHAR2_B233	NID_sect233r1
#define EC_GROUP_NIST_CHAR2_K283	NID_sect283k1
#define EC_GROUP_NIST_CHAR2_B283	NID_sect283r1
#define EC_GROUP_NIST_CHAR2_K409	NID_sect409k1
#define EC_GROUP_NIST_CHAR2_B409	NID_sect409r1
#define EC_GROUP_NIST_CHAR2_K571	NID_sect571k1
#define EC_GROUP_NIST_CHAR2_B571	NID_sect571r1
#define EC_GROUP_X9_62_CHAR2_163V1	NID_X9_62_c2pnb163v1
#define EC_GROUP_X9_62_CHAR2_163V2	NID_X9_62_c2pnb163v2
#define EC_GROUP_X9_62_CHAR2_163V3	NID_X9_62_c2pnb163v3
#define EC_GROUP_X9_62_CHAR2_176V1	NID_X9_62_c2pnb176v1
#define EC_GROUP_X9_62_CHAR2_191V1	NID_X9_62_c2tnb191v1
#define EC_GROUP_X9_62_CHAR2_191V2	NID_X9_62_c2tnb191v2
#define EC_GROUP_X9_62_CHAR2_191V3	NID_X9_62_c2tnb191v3
#define EC_GROUP_X9_62_CHAR2_208W1	NID_X9_62_c2pnb208w1
#define EC_GROUP_X9_62_CHAR2_239V1	NID_X9_62_c2tnb239v1
#define EC_GROUP_X9_62_CHAR2_239V2	NID_X9_62_c2tnb239v2
#define EC_GROUP_X9_62_CHAR2_239V3	NID_X9_62_c2tnb239v3
#define EC_GROUP_X9_62_CHAR2_272W1	NID_X9_62_c2pnb272w1
#define EC_GROUP_X9_62_CHAR2_304W1	NID_X9_62_c2pnb304w1
#define EC_GROUP_X9_62_CHAR2_359V1	NID_X9_62_c2tnb359v1
#define EC_GROUP_X9_62_CHAR2_368W1	NID_X9_62_c2pnb368w1
#define EC_GROUP_X9_62_CHAR2_431R1	NID_X9_62_c2tnb431r1
#define EC_GROUP_SECG_CHAR2_113R1	NID_sect113r1
#define EC_GROUP_SECG_CHAR2_113R2	NID_sect113r2
#define EC_GROUP_SECG_CHAR2_131R1	NID_sect131r1
#define EC_GROUP_SECG_CHAR2_131R2	NID_sect131r2
#define EC_GROUP_SECG_CHAR2_163K1	NID_sect163k1
#define EC_GROUP_SECG_CHAR2_163R1	NID_sect163r1
#define EC_GROUP_SECG_CHAR2_163R2	NID_sect163r2
#define EC_GROUP_SECG_CHAR2_193R1	NID_sect193r1
#define EC_GROUP_SECG_CHAR2_193R2	NID_sect193r2
#define EC_GROUP_SECG_CHAR2_233K1	NID_sect233k1
#define EC_GROUP_SECG_CHAR2_233R1	NID_sect233r1
#define EC_GROUP_SECG_CHAR2_239K1	NID_sect239k1
#define EC_GROUP_SECG_CHAR2_283K1	NID_sect283k1
#define EC_GROUP_SECG_CHAR2_283R1	NID_sect283r1
#define EC_GROUP_SECG_CHAR2_409K1	NID_sect409k1
#define EC_GROUP_SECG_CHAR2_409R1	NID_sect409r1
#define EC_GROUP_SECG_CHAR2_571K1	NID_sect571k1
#define EC_GROUP_SECG_CHAR2_571R1	NID_sect571r1
#define EC_GROUP_WTLS_1			NID_wap_wsg_idm_ecid_wtls1
#define EC_GROUP_WTLS_3			NID_wap_wsg_idm_ecid_wtls3
#define EC_GROUP_WTLS_4			NID_wap_wsg_idm_ecid_wtls4
#define EC_GROUP_WTLS_5			NID_wap_wsg_idm_ecid_wtls5
#define EC_GROUP_WTLS_10		NID_wap_wsg_idm_ecid_wtls10
#define EC_GROUP_WTLS_11		NID_wap_wsg_idm_ecid_wtls11
B
Bodo Möller 已提交
271

272 273
EC_POINT *EC_POINT_new(const EC_GROUP *);
void EC_POINT_free(EC_POINT *);
274
void EC_POINT_clear_free(EC_POINT *);
275
int EC_POINT_copy(EC_POINT *, const EC_POINT *);
276
EC_POINT *EC_POINT_dup(const EC_POINT *, const EC_GROUP *);
277
 
278 279
const EC_METHOD *EC_POINT_method_of(const EC_POINT *);

280
int EC_POINT_set_to_infinity(const EC_GROUP *, EC_POINT *);
B
Bodo Möller 已提交
281 282 283 284
int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
285 286 287 288
int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
B
Bodo Möller 已提交
289 290
int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, int y_bit, BN_CTX *);
291

292 293 294 295 296 297 298 299 300 301 302
int EC_POINT_set_Jprojective_coordinates_GF2m(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
int EC_POINT_get_Jprojective_coordinates_GF2m(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, int y_bit, BN_CTX *);

B
Bodo Möller 已提交
303
size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
304 305 306 307
        unsigned char *buf, size_t len, BN_CTX *);
int EC_POINT_oct2point(const EC_GROUP *, EC_POINT *,
        const unsigned char *buf, size_t len, BN_CTX *);

308 309 310 311 312 313 314 315 316 317
/* other interfaces to point2oct/oct2point: */
BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *,
	point_conversion_form_t form, BIGNUM *, BN_CTX *);
EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *,
	EC_POINT *, BN_CTX *);
char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *,
	point_conversion_form_t form, BN_CTX *);
EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *,
	EC_POINT *, BN_CTX *);

318 319
int EC_POINT_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
int EC_POINT_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
B
Bodo Möller 已提交
320
int EC_POINT_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);
321

B
Bodo Möller 已提交
322 323
int EC_POINT_is_at_infinity(const EC_GROUP *, const EC_POINT *);
int EC_POINT_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
B
Bodo Möller 已提交
324
int EC_POINT_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
B
Bodo Möller 已提交
325

B
Bodo Möller 已提交
326
int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
327
int EC_POINTs_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
B
Bodo Möller 已提交
328

329

330 331
int EC_POINTs_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, size_t num, const EC_POINT *[], const BIGNUM *[], BN_CTX *);
int EC_POINT_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, const EC_POINT *, const BIGNUM *, BN_CTX *);
332
int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *);
B
Bodo Möller 已提交
333 334 335



336
/* ASN1 stuff */
B
Bodo Möller 已提交
337
#define OPENSSL_EC_NAMED_CURVE	0x001
338 339 340 341 342 343 344 345 346 347 348 349

typedef struct ec_parameters_st ECPARAMETERS;
typedef struct ecpk_parameters_st ECPKPARAMETERS;

DECLARE_ASN1_ITEM(ECPARAMETERS)
DECLARE_ASN1_ITEM(ECPKPARAMETERS)
DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPARAMETERS, ECPARAMETERS)
DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS)

EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *); 
ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *, ECPKPARAMETERS *);

B
Bodo Möller 已提交
350

351 352 353 354 355 356
EC_GROUP *d2i_ECParameters(EC_GROUP **, const unsigned char **in, long len);
int i2d_ECParameters(const EC_GROUP *, unsigned char **out);

EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len);
int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out);

357 358 359 360 361 362 363 364
#define d2i_ECPKParameters_bio(bp,x) (EC_GROUP *)ASN1_d2i_bio(NULL, \
                (char *(*)())d2i_ECPKParameters,(bp),(unsigned char **)(x))
#define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio(i2d_ECPKParameters,(bp), \
		(unsigned char *)(x))
#define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \
                (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x))
#define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \
		(unsigned char *)(x))
365

366 367 368 369 370 371 372
#ifndef OPENSSL_NO_BIO
int     ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off);
#endif
#ifndef OPENSSL_NO_FP_API
int     ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off);
#endif

373 374 375 376 377 378 379 380 381 382 383 384
/* SEC1 ECPrivateKey */
typedef struct ec_privatekey_st {
	int               version;
	ASN1_OCTET_STRING *privateKey;
        ECPKPARAMETERS    *parameters;
	ASN1_BIT_STRING   *publicKey;
	} EC_PRIVATEKEY;

DECLARE_ASN1_ITEM(EC_PRIVATEKEY)
DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY)
DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY)

385

386 387 388 389
/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
390
void ERR_load_EC_strings(void);
B
Bodo Möller 已提交
391

392
/* Error codes for the EC functions. */
B
Bodo Möller 已提交
393

394
/* Function codes. */
B
Bodo Möller 已提交
395
#define EC_F_COMPUTE_WNAF				 143
396 397 398
#define EC_F_D2I_ECDSAPARAMETERS			 154
#define EC_F_D2I_ECPARAMETERS				 155
#define EC_F_D2I_ECPKPARAMETERS				 161
399 400
#define EC_F_ECPKPARAMETERS_PRINT			 166
#define EC_F_ECPKPARAMETERS_PRINT_FP			 167
401 402 403 404 405 406
#define EC_F_EC_ASN1_GROUP2CURVE			 159
#define EC_F_EC_ASN1_GROUP2FIELDID			 156
#define EC_F_EC_ASN1_GROUP2PARAMETERS			 160
#define EC_F_EC_ASN1_GROUP2PKPARAMETERS			 162
#define EC_F_EC_ASN1_PARAMETERS2GROUP			 157
#define EC_F_EC_ASN1_PKPARAMETERS2GROUP			 163
407 408 409 410 411 412
#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT	 168
#define EC_F_EC_GF2M_SIMPLE_OCT2POINT			 169
#define EC_F_EC_GF2M_SIMPLE_POINT2OCT			 170
#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES_GF2M 171
#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES_GF2M 172
#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES_GF2M 185
B
Bodo Möller 已提交
413 414 415 416
#define EC_F_EC_GFP_MONT_FIELD_DECODE			 133
#define EC_F_EC_GFP_MONT_FIELD_ENCODE			 134
#define EC_F_EC_GFP_MONT_FIELD_MUL			 131
#define EC_F_EC_GFP_MONT_FIELD_SQR			 132
417
#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT	 152
418 419 420 421 422
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP		 100
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR		 101
#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE			 102
#define EC_F_EC_GFP_SIMPLE_OCT2POINT			 103
#define EC_F_EC_GFP_SIMPLE_POINT2OCT			 104
423
#define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE		 137
424
#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105
425 426
#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128
#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129
B
Bodo Möller 已提交
427
#define EC_F_EC_GROUP_CHECK				 150
428
#define EC_F_EC_GROUP_CHECK_DISCRIMINANT		 153
429
#define EC_F_EC_GROUP_COPY				 106
430 431
#define EC_F_EC_GROUP_GET0_GENERATOR			 139
#define EC_F_EC_GROUP_GET_COFACTOR			 140
432
#define EC_F_EC_GROUP_GET_CURVE_GF2M			 173
433
#define EC_F_EC_GROUP_GET_CURVE_GFP			 130
434
#define EC_F_EC_GROUP_GET_DEGREE			 174
435
#define EC_F_EC_GROUP_GET_EXTRA_DATA			 107
436
#define EC_F_EC_GROUP_GET_ORDER				 141
437
#define EC_F_EC_GROUP_GROUP2NID				 147
438
#define EC_F_EC_GROUP_NEW				 108
439 440
#define EC_F_EC_GROUP_NEW_BY_NAME			 144
#define EC_F_EC_GROUP_NEW_BY_NID			 146
441
#define EC_F_EC_GROUP_NEW_GF2M_FROM_HEX			 175
442
#define EC_F_EC_GROUP_NEW_GFP_FROM_HEX			 148
443
#define EC_F_EC_GROUP_PRECOMPUTE_MULT			 142
444
#define EC_F_EC_GROUP_SET_CURVE_GF2M			 176
445 446 447
#define EC_F_EC_GROUP_SET_CURVE_GFP			 109
#define EC_F_EC_GROUP_SET_EXTRA_DATA			 110
#define EC_F_EC_GROUP_SET_GENERATOR			 111
448 449
#define EC_F_EC_POINTS_MAKE_AFFINE			 136
#define EC_F_EC_POINTS_MUL				 138
450 451 452 453
#define EC_F_EC_POINT_ADD				 112
#define EC_F_EC_POINT_CMP				 113
#define EC_F_EC_POINT_COPY				 114
#define EC_F_EC_POINT_DBL				 115
454
#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M	 177
455
#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP	 116
456
#define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GF2M	 178
457 458 459 460
#define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP	 117
#define EC_F_EC_POINT_IS_AT_INFINITY			 118
#define EC_F_EC_POINT_IS_ON_CURVE			 119
#define EC_F_EC_POINT_MAKE_AFFINE			 120
461
#define EC_F_EC_POINT_MUL				 179
462 463 464
#define EC_F_EC_POINT_NEW				 121
#define EC_F_EC_POINT_OCT2POINT				 122
#define EC_F_EC_POINT_POINT2OCT				 123
465
#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M	 180
466
#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP	 124
467
#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M	 181
B
Bodo Möller 已提交
468
#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP	 125
469
#define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GF2M	 182
B
Bodo Möller 已提交
470
#define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP	 126
471
#define EC_F_EC_POINT_SET_TO_INFINITY			 127
472 473
#define EC_F_EC_WNAF_MUL				 183
#define EC_F_EC_WNAF_PRECOMPUTE_MULT			 184
B
Bodo Möller 已提交
474
#define EC_F_GFP_MONT_GROUP_SET_CURVE_GFP		 135
475 476 477
#define EC_F_I2D_ECDSAPARAMETERS			 158
#define EC_F_I2D_ECPARAMETERS				 164
#define EC_F_I2D_ECPKPARAMETERS				 165
B
Bodo Möller 已提交
478

479
/* Reason codes. */
480 481
#define EC_R_ASN1_ERROR					 130
#define EC_R_ASN1_UNKNOWN_FIELD				 131
482
#define EC_R_BUFFER_TOO_SMALL				 100
483 484 485
#define EC_R_D2I_ECPARAMETERS_FAILURE			 132
#define EC_R_D2I_ECPKPARAMETERS_FAILURE			 133
#define EC_R_D2I_EC_PARAMETERS_FAILURE			 123
B
Bodo Möller 已提交
486
#define EC_R_DISCRIMINANT_IS_ZERO			 118
487 488 489 490 491
#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE		 124
#define EC_R_GROUP2PARAMETERS_FAILURE			 125
#define EC_R_GROUP2PKPARAMETERS_FAILURE			 134
#define EC_R_I2D_ECPKPARAMETERS_FAILURE			 135
#define EC_R_I2D_EC_PARAMETERS_FAILURE			 126
492
#define EC_R_INCOMPATIBLE_OBJECTS			 101
493
#define EC_R_INVALID_ARGUMENT				 112
494 495
#define EC_R_INVALID_COMPRESSED_POINT			 110
#define EC_R_INVALID_COMPRESSION_BIT			 109
496
#define EC_R_INVALID_ENCODING				 102
497 498
#define EC_R_INVALID_FIELD				 103
#define EC_R_INVALID_FORM				 104
B
Bodo Möller 已提交
499
#define EC_R_INVALID_GROUP_ORDER			 119
500 501
#define EC_R_MISSING_PARAMETERS				 127
#define EC_R_NOT_IMPLEMENTED				 136
B
Bodo Möller 已提交
502
#define EC_R_NOT_INITIALIZED				 111
503
#define EC_R_NO_SUCH_EXTRA_DATA				 105
504 505
#define EC_R_PARAMETERS2GROUP_FAILURE			 128
#define EC_R_PKPARAMETERS2GROUP_FAILURE			 137
506 507 508
#define EC_R_POINT_AT_INFINITY				 106
#define EC_R_POINT_IS_NOT_ON_CURVE			 107
#define EC_R_SLOT_FULL					 108
B
Bodo Möller 已提交
509
#define EC_R_UNDEFINED_GENERATOR			 113
B
Bodo Möller 已提交
510
#define EC_R_UNDEFINED_ORDER				 122
B
Bodo Möller 已提交
511 512
#define EC_R_UNKNOWN_GROUP				 116
#define EC_R_UNKNOWN_NID				 117
513
#define EC_R_UNKNOWN_ORDER				 114
514
#define EC_R_UNKNOWN_PARAMETERS_TYPE			 129
B
Bodo Möller 已提交
515

516 517 518
#ifdef  __cplusplus
}
#endif
B
Bodo Möller 已提交
519
#endif