root / lab4 / .minix-src / include / openssl / ec.h @ 14
History | View | Annotate | Download (50.5 KB)
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
|
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 |
# ifndef OPENSSL_ECC_MAX_FIELD_BITS
|
100 |
# define OPENSSL_ECC_MAX_FIELD_BITS 661 |
101 |
# endif
|
102 |
|
103 |
/** Enum for the point conversion form as defined in X9.62 (ECDSA)
|
104 |
* for the encoding of a elliptic curve point (x,y) */
|
105 |
typedef enum { |
106 |
/** the point is encoded as z||x, where the octet z specifies
|
107 |
* which solution of the quadratic equation y is */
|
108 |
POINT_CONVERSION_COMPRESSED = 2,
|
109 |
/** the point is encoded as z||x||y, where z is the octet 0x02 */
|
110 |
POINT_CONVERSION_UNCOMPRESSED = 4,
|
111 |
/** the point is encoded as z||x||y, where the octet z specifies
|
112 |
* which solution of the quadratic equation y is */
|
113 |
POINT_CONVERSION_HYBRID = 6
|
114 |
} point_conversion_form_t; |
115 |
|
116 |
typedef struct ec_method_st EC_METHOD; |
117 |
|
118 |
typedef struct ec_group_st |
119 |
/*-
|
120 |
EC_METHOD *meth;
|
121 |
-- field definition
|
122 |
-- curve coefficients
|
123 |
-- optional generator with associated information (order, cofactor)
|
124 |
-- optional extra data (precomputed table for fast computation of multiples of generator)
|
125 |
-- ASN1 stuff
|
126 |
*/
|
127 |
EC_GROUP; |
128 |
|
129 |
typedef struct ec_point_st EC_POINT; |
130 |
|
131 |
/********************************************************************/
|
132 |
/* EC_METHODs for curves over GF(p) */
|
133 |
/********************************************************************/
|
134 |
|
135 |
/** Returns the basic GFp ec methods which provides the basis for the
|
136 |
* optimized methods.
|
137 |
* \return EC_METHOD object
|
138 |
*/
|
139 |
const EC_METHOD *EC_GFp_simple_method(void); |
140 |
|
141 |
/** Returns GFp methods using montgomery multiplication.
|
142 |
* \return EC_METHOD object
|
143 |
*/
|
144 |
const EC_METHOD *EC_GFp_mont_method(void); |
145 |
|
146 |
/** Returns GFp methods using optimized methods for NIST recommended curves
|
147 |
* \return EC_METHOD object
|
148 |
*/
|
149 |
const EC_METHOD *EC_GFp_nist_method(void); |
150 |
|
151 |
# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
|
152 |
/** Returns 64-bit optimized methods for nistp224
|
153 |
* \return EC_METHOD object
|
154 |
*/
|
155 |
const EC_METHOD *EC_GFp_nistp224_method(void); |
156 |
|
157 |
/** Returns 64-bit optimized methods for nistp256
|
158 |
* \return EC_METHOD object
|
159 |
*/
|
160 |
const EC_METHOD *EC_GFp_nistp256_method(void); |
161 |
|
162 |
/** Returns 64-bit optimized methods for nistp521
|
163 |
* \return EC_METHOD object
|
164 |
*/
|
165 |
const EC_METHOD *EC_GFp_nistp521_method(void); |
166 |
# endif
|
167 |
|
168 |
# ifndef OPENSSL_NO_EC2M
|
169 |
/********************************************************************/
|
170 |
/* EC_METHOD for curves over GF(2^m) */
|
171 |
/********************************************************************/
|
172 |
|
173 |
/** Returns the basic GF2m ec method
|
174 |
* \return EC_METHOD object
|
175 |
*/
|
176 |
const EC_METHOD *EC_GF2m_simple_method(void); |
177 |
|
178 |
# endif
|
179 |
|
180 |
/********************************************************************/
|
181 |
/* EC_GROUP functions */
|
182 |
/********************************************************************/
|
183 |
|
184 |
/** Creates a new EC_GROUP object
|
185 |
* \param meth EC_METHOD to use
|
186 |
* \return newly created EC_GROUP object or NULL in case of an error.
|
187 |
*/
|
188 |
EC_GROUP *EC_GROUP_new(const EC_METHOD *meth);
|
189 |
|
190 |
/** Frees a EC_GROUP object
|
191 |
* \param group EC_GROUP object to be freed.
|
192 |
*/
|
193 |
void EC_GROUP_free(EC_GROUP *group);
|
194 |
|
195 |
/** Clears and frees a EC_GROUP object
|
196 |
* \param group EC_GROUP object to be cleared and freed.
|
197 |
*/
|
198 |
void EC_GROUP_clear_free(EC_GROUP *group);
|
199 |
|
200 |
/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD.
|
201 |
* \param dst destination EC_GROUP object
|
202 |
* \param src source EC_GROUP object
|
203 |
* \return 1 on success and 0 if an error occurred.
|
204 |
*/
|
205 |
int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); |
206 |
|
207 |
/** Creates a new EC_GROUP object and copies the copies the content
|
208 |
* form src to the newly created EC_KEY object
|
209 |
* \param src source EC_GROUP object
|
210 |
* \return newly created EC_GROUP object or NULL in case of an error.
|
211 |
*/
|
212 |
EC_GROUP *EC_GROUP_dup(const EC_GROUP *src);
|
213 |
|
214 |
/** Returns the EC_METHOD of the EC_GROUP object.
|
215 |
* \param group EC_GROUP object
|
216 |
* \return EC_METHOD used in this EC_GROUP object.
|
217 |
*/
|
218 |
const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); |
219 |
|
220 |
/** Returns the field type of the EC_METHOD.
|
221 |
* \param meth EC_METHOD object
|
222 |
* \return NID of the underlying field type OID.
|
223 |
*/
|
224 |
int EC_METHOD_get_field_type(const EC_METHOD *meth); |
225 |
|
226 |
/** Sets the generator and it's order/cofactor of a EC_GROUP object.
|
227 |
* \param group EC_GROUP object
|
228 |
* \param generator EC_POINT object with the generator.
|
229 |
* \param order the order of the group generated by the generator.
|
230 |
* \param cofactor the index of the sub-group generated by the generator
|
231 |
* in the group of all points on the elliptic curve.
|
232 |
* \return 1 on success and 0 if an error occured
|
233 |
*/
|
234 |
int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, |
235 |
const BIGNUM *order, const BIGNUM *cofactor); |
236 |
|
237 |
/** Returns the generator of a EC_GROUP object.
|
238 |
* \param group EC_GROUP object
|
239 |
* \return the currently used generator (possibly NULL).
|
240 |
*/
|
241 |
const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); |
242 |
|
243 |
/** Gets the order of a EC_GROUP
|
244 |
* \param group EC_GROUP object
|
245 |
* \param order BIGNUM to which the order is copied
|
246 |
* \param ctx BN_CTX object (optional)
|
247 |
* \return 1 on success and 0 if an error occured
|
248 |
*/
|
249 |
int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); |
250 |
|
251 |
/** Gets the cofactor of a EC_GROUP
|
252 |
* \param group EC_GROUP object
|
253 |
* \param cofactor BIGNUM to which the cofactor is copied
|
254 |
* \param ctx BN_CTX object (optional)
|
255 |
* \return 1 on success and 0 if an error occured
|
256 |
*/
|
257 |
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, |
258 |
BN_CTX *ctx); |
259 |
|
260 |
/** Sets the name of a EC_GROUP object
|
261 |
* \param group EC_GROUP object
|
262 |
* \param nid NID of the curve name OID
|
263 |
*/
|
264 |
void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); |
265 |
|
266 |
/** Returns the curve name of a EC_GROUP object
|
267 |
* \param group EC_GROUP object
|
268 |
* \return NID of the curve name OID or 0 if not set.
|
269 |
*/
|
270 |
int EC_GROUP_get_curve_name(const EC_GROUP *group); |
271 |
|
272 |
void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); |
273 |
int EC_GROUP_get_asn1_flag(const EC_GROUP *group); |
274 |
|
275 |
void EC_GROUP_set_point_conversion_form(EC_GROUP *group,
|
276 |
point_conversion_form_t form); |
277 |
point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);
|
278 |
|
279 |
unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); |
280 |
size_t EC_GROUP_get_seed_len(const EC_GROUP *);
|
281 |
size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); |
282 |
|
283 |
/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b
|
284 |
* \param group EC_GROUP object
|
285 |
* \param p BIGNUM with the prime number
|
286 |
* \param a BIGNUM with parameter a of the equation
|
287 |
* \param b BIGNUM with parameter b of the equation
|
288 |
* \param ctx BN_CTX object (optional)
|
289 |
* \return 1 on success and 0 if an error occured
|
290 |
*/
|
291 |
int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, |
292 |
const BIGNUM *b, BN_CTX *ctx);
|
293 |
|
294 |
/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b
|
295 |
* \param group EC_GROUP object
|
296 |
* \param p BIGNUM for the prime number
|
297 |
* \param a BIGNUM for parameter a of the equation
|
298 |
* \param b BIGNUM for parameter b of the equation
|
299 |
* \param ctx BN_CTX object (optional)
|
300 |
* \return 1 on success and 0 if an error occured
|
301 |
*/
|
302 |
int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, |
303 |
BIGNUM *b, BN_CTX *ctx); |
304 |
|
305 |
# ifndef OPENSSL_NO_EC2M
|
306 |
/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
|
307 |
* \param group EC_GROUP object
|
308 |
* \param p BIGNUM with the polynomial defining the underlying field
|
309 |
* \param a BIGNUM with parameter a of the equation
|
310 |
* \param b BIGNUM with parameter b of the equation
|
311 |
* \param ctx BN_CTX object (optional)
|
312 |
* \return 1 on success and 0 if an error occured
|
313 |
*/
|
314 |
int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, |
315 |
const BIGNUM *b, BN_CTX *ctx);
|
316 |
|
317 |
/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
|
318 |
* \param group EC_GROUP object
|
319 |
* \param p BIGNUM for the polynomial defining the underlying field
|
320 |
* \param a BIGNUM for parameter a of the equation
|
321 |
* \param b BIGNUM for parameter b of the equation
|
322 |
* \param ctx BN_CTX object (optional)
|
323 |
* \return 1 on success and 0 if an error occured
|
324 |
*/
|
325 |
int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, |
326 |
BIGNUM *b, BN_CTX *ctx); |
327 |
# endif
|
328 |
/** Returns the number of bits needed to represent a field element
|
329 |
* \param group EC_GROUP object
|
330 |
* \return number of bits needed to represent a field element
|
331 |
*/
|
332 |
int EC_GROUP_get_degree(const EC_GROUP *group); |
333 |
|
334 |
/** Checks whether the parameter in the EC_GROUP define a valid ec group
|
335 |
* \param group EC_GROUP object
|
336 |
* \param ctx BN_CTX object (optional)
|
337 |
* \return 1 if group is a valid ec group and 0 otherwise
|
338 |
*/
|
339 |
int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); |
340 |
|
341 |
/** Checks whether the discriminant of the elliptic curve is zero or not
|
342 |
* \param group EC_GROUP object
|
343 |
* \param ctx BN_CTX object (optional)
|
344 |
* \return 1 if the discriminant is not zero and 0 otherwise
|
345 |
*/
|
346 |
int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); |
347 |
|
348 |
/** Compares two EC_GROUP objects
|
349 |
* \param a first EC_GROUP object
|
350 |
* \param b second EC_GROUP object
|
351 |
* \param ctx BN_CTX object (optional)
|
352 |
* \return 0 if both groups are equal and 1 otherwise
|
353 |
*/
|
354 |
int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); |
355 |
|
356 |
/*
|
357 |
* EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after
|
358 |
* choosing an appropriate EC_METHOD
|
359 |
*/
|
360 |
|
361 |
/** Creates a new EC_GROUP object with the specified parameters defined
|
362 |
* over GFp (defined by the equation y^2 = x^3 + a*x + b)
|
363 |
* \param p BIGNUM with the prime number
|
364 |
* \param a BIGNUM with the parameter a of the equation
|
365 |
* \param b BIGNUM with the parameter b of the equation
|
366 |
* \param ctx BN_CTX object (optional)
|
367 |
* \return newly created EC_GROUP object with the specified parameters
|
368 |
*/
|
369 |
EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, |
370 |
const BIGNUM *b, BN_CTX *ctx);
|
371 |
# ifndef OPENSSL_NO_EC2M
|
372 |
/** Creates a new EC_GROUP object with the specified parameters defined
|
373 |
* over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b)
|
374 |
* \param p BIGNUM with the polynomial defining the underlying field
|
375 |
* \param a BIGNUM with the parameter a of the equation
|
376 |
* \param b BIGNUM with the parameter b of the equation
|
377 |
* \param ctx BN_CTX object (optional)
|
378 |
* \return newly created EC_GROUP object with the specified parameters
|
379 |
*/
|
380 |
EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, |
381 |
const BIGNUM *b, BN_CTX *ctx);
|
382 |
# endif
|
383 |
/** Creates a EC_GROUP object with a curve specified by a NID
|
384 |
* \param nid NID of the OID of the curve name
|
385 |
* \return newly created EC_GROUP object with specified curve or NULL
|
386 |
* if an error occurred
|
387 |
*/
|
388 |
EC_GROUP *EC_GROUP_new_by_curve_name(int nid);
|
389 |
|
390 |
/********************************************************************/
|
391 |
/* handling of internal curves */
|
392 |
/********************************************************************/
|
393 |
|
394 |
typedef struct { |
395 |
int nid;
|
396 |
const char *comment; |
397 |
} EC_builtin_curve; |
398 |
|
399 |
/*
|
400 |
* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all
|
401 |
* available curves or zero if a error occurred. In case r ist not zero
|
402 |
* nitems EC_builtin_curve structures are filled with the data of the first
|
403 |
* nitems internal groups
|
404 |
*/
|
405 |
size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); |
406 |
|
407 |
/********************************************************************/
|
408 |
/* EC_POINT functions */
|
409 |
/********************************************************************/
|
410 |
|
411 |
/** Creates a new EC_POINT object for the specified EC_GROUP
|
412 |
* \param group EC_GROUP the underlying EC_GROUP object
|
413 |
* \return newly created EC_POINT object or NULL if an error occurred
|
414 |
*/
|
415 |
EC_POINT *EC_POINT_new(const EC_GROUP *group);
|
416 |
|
417 |
/** Frees a EC_POINT object
|
418 |
* \param point EC_POINT object to be freed
|
419 |
*/
|
420 |
void EC_POINT_free(EC_POINT *point);
|
421 |
|
422 |
/** Clears and frees a EC_POINT object
|
423 |
* \param point EC_POINT object to be cleared and freed
|
424 |
*/
|
425 |
void EC_POINT_clear_free(EC_POINT *point);
|
426 |
|
427 |
/** Copies EC_POINT object
|
428 |
* \param dst destination EC_POINT object
|
429 |
* \param src source EC_POINT object
|
430 |
* \return 1 on success and 0 if an error occured
|
431 |
*/
|
432 |
int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); |
433 |
|
434 |
/** Creates a new EC_POINT object and copies the content of the supplied
|
435 |
* EC_POINT
|
436 |
* \param src source EC_POINT object
|
437 |
* \param group underlying the EC_GROUP object
|
438 |
* \return newly created EC_POINT object or NULL if an error occurred
|
439 |
*/
|
440 |
EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); |
441 |
|
442 |
/** Returns the EC_METHOD used in EC_POINT object
|
443 |
* \param point EC_POINT object
|
444 |
* \return the EC_METHOD used
|
445 |
*/
|
446 |
const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); |
447 |
|
448 |
/** Sets a point to infinity (neutral element)
|
449 |
* \param group underlying EC_GROUP object
|
450 |
* \param point EC_POINT to set to infinity
|
451 |
* \return 1 on success and 0 if an error occured
|
452 |
*/
|
453 |
int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); |
454 |
|
455 |
/** Sets the jacobian projective coordinates of a EC_POINT over GFp
|
456 |
* \param group underlying EC_GROUP object
|
457 |
* \param p EC_POINT object
|
458 |
* \param x BIGNUM with the x-coordinate
|
459 |
* \param y BIGNUM with the y-coordinate
|
460 |
* \param z BIGNUM with the z-coordinate
|
461 |
* \param ctx BN_CTX object (optional)
|
462 |
* \return 1 on success and 0 if an error occured
|
463 |
*/
|
464 |
int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, |
465 |
EC_POINT *p, const BIGNUM *x,
|
466 |
const BIGNUM *y, const BIGNUM *z, |
467 |
BN_CTX *ctx); |
468 |
|
469 |
/** Gets the jacobian projective coordinates of a EC_POINT over GFp
|
470 |
* \param group underlying EC_GROUP object
|
471 |
* \param p EC_POINT object
|
472 |
* \param x BIGNUM for the x-coordinate
|
473 |
* \param y BIGNUM for the y-coordinate
|
474 |
* \param z BIGNUM for the z-coordinate
|
475 |
* \param ctx BN_CTX object (optional)
|
476 |
* \return 1 on success and 0 if an error occured
|
477 |
*/
|
478 |
int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, |
479 |
const EC_POINT *p, BIGNUM *x,
|
480 |
BIGNUM *y, BIGNUM *z, |
481 |
BN_CTX *ctx); |
482 |
|
483 |
/** Sets the affine coordinates of a EC_POINT over GFp
|
484 |
* \param group underlying EC_GROUP object
|
485 |
* \param p EC_POINT object
|
486 |
* \param x BIGNUM with the x-coordinate
|
487 |
* \param y BIGNUM with the y-coordinate
|
488 |
* \param ctx BN_CTX object (optional)
|
489 |
* \return 1 on success and 0 if an error occured
|
490 |
*/
|
491 |
int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, |
492 |
const BIGNUM *x, const BIGNUM *y, |
493 |
BN_CTX *ctx); |
494 |
|
495 |
/** Gets the affine coordinates of a EC_POINT over GFp
|
496 |
* \param group underlying EC_GROUP object
|
497 |
* \param p EC_POINT object
|
498 |
* \param x BIGNUM for the x-coordinate
|
499 |
* \param y BIGNUM for the y-coordinate
|
500 |
* \param ctx BN_CTX object (optional)
|
501 |
* \return 1 on success and 0 if an error occured
|
502 |
*/
|
503 |
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, |
504 |
const EC_POINT *p, BIGNUM *x,
|
505 |
BIGNUM *y, BN_CTX *ctx); |
506 |
|
507 |
/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp
|
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_GFp(const EC_GROUP *group, |
516 |
EC_POINT *p, const BIGNUM *x,
|
517 |
int y_bit, BN_CTX *ctx);
|
518 |
# ifndef OPENSSL_NO_EC2M
|
519 |
/** Sets the affine coordinates of a EC_POINT over GF2m
|
520 |
* \param group underlying EC_GROUP object
|
521 |
* \param p EC_POINT object
|
522 |
* \param x BIGNUM with the x-coordinate
|
523 |
* \param y BIGNUM with the y-coordinate
|
524 |
* \param ctx BN_CTX object (optional)
|
525 |
* \return 1 on success and 0 if an error occured
|
526 |
*/
|
527 |
int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, |
528 |
const BIGNUM *x, const BIGNUM *y, |
529 |
BN_CTX *ctx); |
530 |
|
531 |
/** Gets the affine coordinates of a EC_POINT over GF2m
|
532 |
* \param group underlying EC_GROUP object
|
533 |
* \param p EC_POINT object
|
534 |
* \param x BIGNUM for the x-coordinate
|
535 |
* \param y BIGNUM for the y-coordinate
|
536 |
* \param ctx BN_CTX object (optional)
|
537 |
* \return 1 on success and 0 if an error occured
|
538 |
*/
|
539 |
int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, |
540 |
const EC_POINT *p, BIGNUM *x,
|
541 |
BIGNUM *y, BN_CTX *ctx); |
542 |
|
543 |
/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m
|
544 |
* \param group underlying EC_GROUP object
|
545 |
* \param p EC_POINT object
|
546 |
* \param x BIGNUM with x-coordinate
|
547 |
* \param y_bit integer with the y-Bit (either 0 or 1)
|
548 |
* \param ctx BN_CTX object (optional)
|
549 |
* \return 1 on success and 0 if an error occured
|
550 |
*/
|
551 |
int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, |
552 |
EC_POINT *p, const BIGNUM *x,
|
553 |
int y_bit, BN_CTX *ctx);
|
554 |
# endif
|
555 |
/** Encodes a EC_POINT object to a octet string
|
556 |
* \param group underlying EC_GROUP object
|
557 |
* \param p EC_POINT object
|
558 |
* \param form point conversion form
|
559 |
* \param buf memory buffer for the result. If NULL the function returns
|
560 |
* required buffer size.
|
561 |
* \param len length of the memory buffer
|
562 |
* \param ctx BN_CTX object (optional)
|
563 |
* \return the length of the encoded octet string or 0 if an error occurred
|
564 |
*/
|
565 |
size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, |
566 |
point_conversion_form_t form, |
567 |
unsigned char *buf, size_t len, BN_CTX *ctx); |
568 |
|
569 |
/** Decodes a EC_POINT from a octet string
|
570 |
* \param group underlying EC_GROUP object
|
571 |
* \param p EC_POINT object
|
572 |
* \param buf memory buffer with the encoded ec point
|
573 |
* \param len length of the encoded ec point
|
574 |
* \param ctx BN_CTX object (optional)
|
575 |
* \return 1 on success and 0 if an error occured
|
576 |
*/
|
577 |
int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, |
578 |
const unsigned char *buf, size_t len, BN_CTX *ctx); |
579 |
|
580 |
/* other interfaces to point2oct/oct2point: */
|
581 |
BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, |
582 |
point_conversion_form_t form, BIGNUM *, BN_CTX *); |
583 |
EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, |
584 |
EC_POINT *, BN_CTX *); |
585 |
char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, |
586 |
point_conversion_form_t form, BN_CTX *); |
587 |
EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, |
588 |
EC_POINT *, BN_CTX *); |
589 |
|
590 |
/********************************************************************/
|
591 |
/* functions for doing EC_POINT arithmetic */
|
592 |
/********************************************************************/
|
593 |
|
594 |
/** Computes the sum of two EC_POINT
|
595 |
* \param group underlying EC_GROUP object
|
596 |
* \param r EC_POINT object for the result (r = a + b)
|
597 |
* \param a EC_POINT object with the first summand
|
598 |
* \param b EC_POINT object with the second summand
|
599 |
* \param ctx BN_CTX object (optional)
|
600 |
* \return 1 on success and 0 if an error occured
|
601 |
*/
|
602 |
int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, |
603 |
const EC_POINT *b, BN_CTX *ctx);
|
604 |
|
605 |
/** Computes the double of a EC_POINT
|
606 |
* \param group underlying EC_GROUP object
|
607 |
* \param r EC_POINT object for the result (r = 2 * a)
|
608 |
* \param a EC_POINT object
|
609 |
* \param ctx BN_CTX object (optional)
|
610 |
* \return 1 on success and 0 if an error occured
|
611 |
*/
|
612 |
int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, |
613 |
BN_CTX *ctx); |
614 |
|
615 |
/** Computes the inverse of a EC_POINT
|
616 |
* \param group underlying EC_GROUP object
|
617 |
* \param a EC_POINT object to be inverted (it's used for the result as well)
|
618 |
* \param ctx BN_CTX object (optional)
|
619 |
* \return 1 on success and 0 if an error occured
|
620 |
*/
|
621 |
int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); |
622 |
|
623 |
/** Checks whether the point is the neutral element of the group
|
624 |
* \param group the underlying EC_GROUP object
|
625 |
* \param p EC_POINT object
|
626 |
* \return 1 if the point is the neutral element and 0 otherwise
|
627 |
*/
|
628 |
int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); |
629 |
|
630 |
/** Checks whether the point is on the curve
|
631 |
* \param group underlying EC_GROUP object
|
632 |
* \param point EC_POINT object to check
|
633 |
* \param ctx BN_CTX object (optional)
|
634 |
* \return 1 if point if on the curve and 0 otherwise
|
635 |
*/
|
636 |
int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, |
637 |
BN_CTX *ctx); |
638 |
|
639 |
/** Compares two EC_POINTs
|
640 |
* \param group underlying EC_GROUP object
|
641 |
* \param a first EC_POINT object
|
642 |
* \param b second EC_POINT object
|
643 |
* \param ctx BN_CTX object (optional)
|
644 |
* \return 0 if both points are equal and a value != 0 otherwise
|
645 |
*/
|
646 |
int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, |
647 |
BN_CTX *ctx); |
648 |
|
649 |
int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); |
650 |
int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, |
651 |
EC_POINT *points[], BN_CTX *ctx); |
652 |
|
653 |
/** Computes r = generator * n sum_{i=0}^{num-1} p[i] * m[i]
|
654 |
* \param group underlying EC_GROUP object
|
655 |
* \param r EC_POINT object for the result
|
656 |
* \param n BIGNUM with the multiplier for the group generator (optional)
|
657 |
* \param num number futher summands
|
658 |
* \param p array of size num of EC_POINT objects
|
659 |
* \param m array of size num of BIGNUM objects
|
660 |
* \param ctx BN_CTX object (optional)
|
661 |
* \return 1 on success and 0 if an error occured
|
662 |
*/
|
663 |
int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, |
664 |
size_t num, const EC_POINT *p[], const BIGNUM *m[], |
665 |
BN_CTX *ctx); |
666 |
|
667 |
/** Computes r = generator * n + q * m
|
668 |
* \param group underlying EC_GROUP object
|
669 |
* \param r EC_POINT object for the result
|
670 |
* \param n BIGNUM with the multiplier for the group generator (optional)
|
671 |
* \param q EC_POINT object with the first factor of the second summand
|
672 |
* \param m BIGNUM with the second factor of the second summand
|
673 |
* \param ctx BN_CTX object (optional)
|
674 |
* \return 1 on success and 0 if an error occured
|
675 |
*/
|
676 |
int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, |
677 |
const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); |
678 |
|
679 |
/** Stores multiples of generator for faster point multiplication
|
680 |
* \param group EC_GROUP object
|
681 |
* \param ctx BN_CTX object (optional)
|
682 |
* \return 1 on success and 0 if an error occured
|
683 |
*/
|
684 |
int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
|
685 |
|
686 |
/** Reports whether a precomputation has been done
|
687 |
* \param group EC_GROUP object
|
688 |
* \return 1 if a pre-computation has been done and 0 otherwise
|
689 |
*/
|
690 |
int EC_GROUP_have_precompute_mult(const EC_GROUP *group); |
691 |
|
692 |
/********************************************************************/
|
693 |
/* ASN1 stuff */
|
694 |
/********************************************************************/
|
695 |
|
696 |
/*
|
697 |
* EC_GROUP_get_basis_type() returns the NID of the basis type used to
|
698 |
* represent the field elements
|
699 |
*/
|
700 |
int EC_GROUP_get_basis_type(const EC_GROUP *); |
701 |
# ifndef OPENSSL_NO_EC2M
|
702 |
int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); |
703 |
int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, |
704 |
unsigned int *k2, unsigned int *k3); |
705 |
# endif
|
706 |
|
707 |
# define OPENSSL_EC_NAMED_CURVE 0x001 |
708 |
|
709 |
typedef struct ecpk_parameters_st ECPKPARAMETERS; |
710 |
|
711 |
EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); |
712 |
int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); |
713 |
|
714 |
# define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) |
715 |
# define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x)
|
716 |
# define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ |
717 |
(char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) |
718 |
# define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \
|
719 |
(unsigned char *)(x)) |
720 |
|
721 |
# ifndef OPENSSL_NO_BIO
|
722 |
int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); |
723 |
# endif
|
724 |
# ifndef OPENSSL_NO_FP_API
|
725 |
int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); |
726 |
# endif
|
727 |
|
728 |
/********************************************************************/
|
729 |
/* EC_KEY functions */
|
730 |
/********************************************************************/
|
731 |
|
732 |
typedef struct ec_key_st EC_KEY; |
733 |
|
734 |
/* some values for the encoding_flag */
|
735 |
# define EC_PKEY_NO_PARAMETERS 0x001 |
736 |
# define EC_PKEY_NO_PUBKEY 0x002 |
737 |
|
738 |
/* some values for the flags field */
|
739 |
# define EC_FLAG_NON_FIPS_ALLOW 0x1 |
740 |
# define EC_FLAG_FIPS_CHECKED 0x2 |
741 |
|
742 |
/** Creates a new EC_KEY object.
|
743 |
* \return EC_KEY object or NULL if an error occurred.
|
744 |
*/
|
745 |
EC_KEY *EC_KEY_new(void);
|
746 |
|
747 |
int EC_KEY_get_flags(const EC_KEY *key); |
748 |
|
749 |
void EC_KEY_set_flags(EC_KEY *key, int flags); |
750 |
|
751 |
void EC_KEY_clear_flags(EC_KEY *key, int flags); |
752 |
|
753 |
/** Creates a new EC_KEY object using a named curve as underlying
|
754 |
* EC_GROUP object.
|
755 |
* \param nid NID of the named curve.
|
756 |
* \return EC_KEY object or NULL if an error occurred.
|
757 |
*/
|
758 |
EC_KEY *EC_KEY_new_by_curve_name(int nid);
|
759 |
|
760 |
/** Frees a EC_KEY object.
|
761 |
* \param key EC_KEY object to be freed.
|
762 |
*/
|
763 |
void EC_KEY_free(EC_KEY *key);
|
764 |
|
765 |
/** Copies a EC_KEY object.
|
766 |
* \param dst destination EC_KEY object
|
767 |
* \param src src EC_KEY object
|
768 |
* \return dst or NULL if an error occurred.
|
769 |
*/
|
770 |
EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src);
|
771 |
|
772 |
/** Creates a new EC_KEY object and copies the content from src to it.
|
773 |
* \param src the source EC_KEY object
|
774 |
* \return newly created EC_KEY object or NULL if an error occurred.
|
775 |
*/
|
776 |
EC_KEY *EC_KEY_dup(const EC_KEY *src);
|
777 |
|
778 |
/** Increases the internal reference count of a EC_KEY object.
|
779 |
* \param key EC_KEY object
|
780 |
* \return 1 on success and 0 if an error occurred.
|
781 |
*/
|
782 |
int EC_KEY_up_ref(EC_KEY *key);
|
783 |
|
784 |
/** Returns the EC_GROUP object of a EC_KEY object
|
785 |
* \param key EC_KEY object
|
786 |
* \return the EC_GROUP object (possibly NULL).
|
787 |
*/
|
788 |
const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); |
789 |
|
790 |
/** Sets the EC_GROUP of a EC_KEY object.
|
791 |
* \param key EC_KEY object
|
792 |
* \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY
|
793 |
* object will use an own copy of the EC_GROUP).
|
794 |
* \return 1 on success and 0 if an error occurred.
|
795 |
*/
|
796 |
int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); |
797 |
|
798 |
/** Returns the private key of a EC_KEY object.
|
799 |
* \param key EC_KEY object
|
800 |
* \return a BIGNUM with the private key (possibly NULL).
|
801 |
*/
|
802 |
const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); |
803 |
|
804 |
/** Sets the private key of a EC_KEY object.
|
805 |
* \param key EC_KEY object
|
806 |
* \param prv BIGNUM with the private key (note: the EC_KEY object
|
807 |
* will use an own copy of the BIGNUM).
|
808 |
* \return 1 on success and 0 if an error occurred.
|
809 |
*/
|
810 |
int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); |
811 |
|
812 |
/** Returns the public key of a EC_KEY object.
|
813 |
* \param key the EC_KEY object
|
814 |
* \return a EC_POINT object with the public key (possibly NULL)
|
815 |
*/
|
816 |
const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); |
817 |
|
818 |
/** Sets the public key of a EC_KEY object.
|
819 |
* \param key EC_KEY object
|
820 |
* \param pub EC_POINT object with the public key (note: the EC_KEY object
|
821 |
* will use an own copy of the EC_POINT object).
|
822 |
* \return 1 on success and 0 if an error occurred.
|
823 |
*/
|
824 |
int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); |
825 |
|
826 |
unsigned EC_KEY_get_enc_flags(const EC_KEY *key); |
827 |
void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); |
828 |
point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key);
|
829 |
void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform);
|
830 |
/* functions to set/get method specific data */
|
831 |
void *EC_KEY_get_key_method_data(EC_KEY *key,
|
832 |
void *(*dup_func) (void *), |
833 |
void (*free_func) (void *), |
834 |
void (*clear_free_func) (void *)); |
835 |
/** Sets the key method data of an EC_KEY object, if none has yet been set.
|
836 |
* \param key EC_KEY object
|
837 |
* \param data opaque data to install.
|
838 |
* \param dup_func a function that duplicates |data|.
|
839 |
* \param free_func a function that frees |data|.
|
840 |
* \param clear_free_func a function that wipes and frees |data|.
|
841 |
* \return the previously set data pointer, or NULL if |data| was inserted.
|
842 |
*/
|
843 |
void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, |
844 |
void *(*dup_func) (void *), |
845 |
void (*free_func) (void *), |
846 |
void (*clear_free_func) (void *)); |
847 |
/* wrapper functions for the underlying EC_GROUP object */
|
848 |
void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); |
849 |
|
850 |
/** Creates a table of pre-computed multiples of the generator to
|
851 |
* accelerate further EC_KEY operations.
|
852 |
* \param key EC_KEY object
|
853 |
* \param ctx BN_CTX object (optional)
|
854 |
* \return 1 on success and 0 if an error occurred.
|
855 |
*/
|
856 |
int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx);
|
857 |
|
858 |
/** Creates a new ec private (and optional a new public) key.
|
859 |
* \param key EC_KEY object
|
860 |
* \return 1 on success and 0 if an error occurred.
|
861 |
*/
|
862 |
int EC_KEY_generate_key(EC_KEY *key);
|
863 |
|
864 |
/** Verifies that a private and/or public key is valid.
|
865 |
* \param key the EC_KEY object
|
866 |
* \return 1 on success and 0 otherwise.
|
867 |
*/
|
868 |
int EC_KEY_check_key(const EC_KEY *key); |
869 |
|
870 |
/** Sets a public key from affine coordindates performing
|
871 |
* neccessary NIST PKV tests.
|
872 |
* \param key the EC_KEY object
|
873 |
* \param x public key x coordinate
|
874 |
* \param y public key y coordinate
|
875 |
* \return 1 on success and 0 otherwise.
|
876 |
*/
|
877 |
int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
|
878 |
BIGNUM *y); |
879 |
|
880 |
/********************************************************************/
|
881 |
/* de- and encoding functions for SEC1 ECPrivateKey */
|
882 |
/********************************************************************/
|
883 |
|
884 |
/** Decodes a private key from a memory buffer.
|
885 |
* \param key a pointer to a EC_KEY object which should be used (or NULL)
|
886 |
* \param in pointer to memory with the DER encoded private key
|
887 |
* \param len length of the DER encoded private key
|
888 |
* \return the decoded private key or NULL if an error occurred.
|
889 |
*/
|
890 |
EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); |
891 |
|
892 |
/** Encodes a private key object and stores the result in a buffer.
|
893 |
* \param key the EC_KEY object to encode
|
894 |
* \param out the buffer for the result (if NULL the function returns number
|
895 |
* of bytes needed).
|
896 |
* \return 1 on success and 0 if an error occurred.
|
897 |
*/
|
898 |
int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); |
899 |
|
900 |
/********************************************************************/
|
901 |
/* de- and encoding functions for EC parameters */
|
902 |
/********************************************************************/
|
903 |
|
904 |
/** Decodes ec parameter from a memory buffer.
|
905 |
* \param key a pointer to a EC_KEY object which should be used (or NULL)
|
906 |
* \param in pointer to memory with the DER encoded ec parameters
|
907 |
* \param len length of the DER encoded ec parameters
|
908 |
* \return a EC_KEY object with the decoded parameters or NULL if an error
|
909 |
* occurred.
|
910 |
*/
|
911 |
EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); |
912 |
|
913 |
/** Encodes ec parameter and stores the result in a buffer.
|
914 |
* \param key the EC_KEY object with ec paramters to encode
|
915 |
* \param out the buffer for the result (if NULL the function returns number
|
916 |
* of bytes needed).
|
917 |
* \return 1 on success and 0 if an error occurred.
|
918 |
*/
|
919 |
int i2d_ECParameters(EC_KEY *key, unsigned char **out); |
920 |
|
921 |
/********************************************************************/
|
922 |
/* de- and encoding functions for EC public key */
|
923 |
/* (octet string, not DER -- hence 'o2i' and 'i2o') */
|
924 |
/********************************************************************/
|
925 |
|
926 |
/** Decodes a ec public key from a octet string.
|
927 |
* \param key a pointer to a EC_KEY object which should be used
|
928 |
* \param in memory buffer with the encoded public key
|
929 |
* \param len length of the encoded public key
|
930 |
* \return EC_KEY object with decoded public key or NULL if an error
|
931 |
* occurred.
|
932 |
*/
|
933 |
EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); |
934 |
|
935 |
/** Encodes a ec public key in an octet string.
|
936 |
* \param key the EC_KEY object with the public key
|
937 |
* \param out the buffer for the result (if NULL the function returns number
|
938 |
* of bytes needed).
|
939 |
* \return 1 on success and 0 if an error occurred
|
940 |
*/
|
941 |
int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); |
942 |
|
943 |
# ifndef OPENSSL_NO_BIO
|
944 |
/** Prints out the ec parameters on human readable form.
|
945 |
* \param bp BIO object to which the information is printed
|
946 |
* \param key EC_KEY object
|
947 |
* \return 1 on success and 0 if an error occurred
|
948 |
*/
|
949 |
int ECParameters_print(BIO *bp, const EC_KEY *key); |
950 |
|
951 |
/** Prints out the contents of a EC_KEY object
|
952 |
* \param bp BIO object to which the information is printed
|
953 |
* \param key EC_KEY object
|
954 |
* \param off line offset
|
955 |
* \return 1 on success and 0 if an error occurred
|
956 |
*/
|
957 |
int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); |
958 |
|
959 |
# endif
|
960 |
# ifndef OPENSSL_NO_FP_API
|
961 |
/** Prints out the ec parameters on human readable form.
|
962 |
* \param fp file descriptor to which the information is printed
|
963 |
* \param key EC_KEY object
|
964 |
* \return 1 on success and 0 if an error occurred
|
965 |
*/
|
966 |
int ECParameters_print_fp(FILE *fp, const EC_KEY *key); |
967 |
|
968 |
/** Prints out the contents of a EC_KEY object
|
969 |
* \param fp file descriptor to which the information is printed
|
970 |
* \param key EC_KEY object
|
971 |
* \param off line offset
|
972 |
* \return 1 on success and 0 if an error occurred
|
973 |
*/
|
974 |
int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); |
975 |
|
976 |
# endif
|
977 |
|
978 |
# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x)
|
979 |
|
980 |
# ifndef __cplusplus
|
981 |
# if defined(__SUNPRO_C)
|
982 |
# if __SUNPRO_C >= 0x520 |
983 |
# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) |
984 |
# endif
|
985 |
# endif
|
986 |
# endif
|
987 |
|
988 |
# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \
|
989 |
EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, EVP_PKEY_OP_PARAMGEN, \ |
990 |
EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL)
|
991 |
|
992 |
# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) |
993 |
|
994 |
/* BEGIN ERROR CODES */
|
995 |
/*
|
996 |
* The following lines are auto generated by the script mkerr.pl. Any changes
|
997 |
* made after this point may be overwritten when the script is next run.
|
998 |
*/
|
999 |
void ERR_load_EC_strings(void); |
1000 |
|
1001 |
/* Error codes for the EC functions. */
|
1002 |
|
1003 |
/* Function codes. */
|
1004 |
# define EC_F_BN_TO_FELEM 224 |
1005 |
# define EC_F_COMPUTE_WNAF 143 |
1006 |
# define EC_F_D2I_ECPARAMETERS 144 |
1007 |
# define EC_F_D2I_ECPKPARAMETERS 145 |
1008 |
# define EC_F_D2I_ECPRIVATEKEY 146 |
1009 |
# define EC_F_DO_EC_KEY_PRINT 221 |
1010 |
# define EC_F_ECKEY_PARAM2TYPE 223 |
1011 |
# define EC_F_ECKEY_PARAM_DECODE 212 |
1012 |
# define EC_F_ECKEY_PRIV_DECODE 213 |
1013 |
# define EC_F_ECKEY_PRIV_ENCODE 214 |
1014 |
# define EC_F_ECKEY_PUB_DECODE 215 |
1015 |
# define EC_F_ECKEY_PUB_ENCODE 216 |
1016 |
# define EC_F_ECKEY_TYPE2PARAM 220 |
1017 |
# define EC_F_ECPARAMETERS_PRINT 147 |
1018 |
# define EC_F_ECPARAMETERS_PRINT_FP 148 |
1019 |
# define EC_F_ECPKPARAMETERS_PRINT 149 |
1020 |
# define EC_F_ECPKPARAMETERS_PRINT_FP 150 |
1021 |
# define EC_F_ECP_NIST_MOD_192 203 |
1022 |
# define EC_F_ECP_NIST_MOD_224 204 |
1023 |
# define EC_F_ECP_NIST_MOD_256 205 |
1024 |
# define EC_F_ECP_NIST_MOD_521 206 |
1025 |
# define EC_F_EC_ASN1_GROUP2CURVE 153 |
1026 |
# define EC_F_EC_ASN1_GROUP2FIELDID 154 |
1027 |
# define EC_F_EC_ASN1_GROUP2PARAMETERS 155 |
1028 |
# define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 |
1029 |
# define EC_F_EC_ASN1_PARAMETERS2GROUP 157 |
1030 |
# define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 |
1031 |
# define EC_F_EC_EX_DATA_SET_DATA 211 |
1032 |
# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 |
1033 |
# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 |
1034 |
# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 |
1035 |
# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 |
1036 |
# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 |
1037 |
# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 |
1038 |
# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 |
1039 |
# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 |
1040 |
# define EC_F_EC_GFP_MONT_FIELD_DECODE 133 |
1041 |
# define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 |
1042 |
# define EC_F_EC_GFP_MONT_FIELD_MUL 131 |
1043 |
# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 |
1044 |
# define EC_F_EC_GFP_MONT_FIELD_SQR 132 |
1045 |
# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 |
1046 |
# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 |
1047 |
# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 |
1048 |
# define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 |
1049 |
# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 |
1050 |
# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 |
1051 |
# define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 |
1052 |
# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 |
1053 |
# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 |
1054 |
# define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 |
1055 |
# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 |
1056 |
# define EC_F_EC_GFP_NIST_FIELD_MUL 200 |
1057 |
# define EC_F_EC_GFP_NIST_FIELD_SQR 201 |
1058 |
# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 |
1059 |
# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 |
1060 |
# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 |
1061 |
# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 |
1062 |
# define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 |
1063 |
# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 |
1064 |
# define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 |
1065 |
# define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 |
1066 |
# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 |
1067 |
# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 |
1068 |
# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 |
1069 |
# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 |
1070 |
# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 |
1071 |
# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 |
1072 |
# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 |
1073 |
# define EC_F_EC_GROUP_CHECK 170 |
1074 |
# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 |
1075 |
# define EC_F_EC_GROUP_COPY 106 |
1076 |
# define EC_F_EC_GROUP_GET0_GENERATOR 139 |
1077 |
# define EC_F_EC_GROUP_GET_COFACTOR 140 |
1078 |
# define EC_F_EC_GROUP_GET_CURVE_GF2M 172 |
1079 |
# define EC_F_EC_GROUP_GET_CURVE_GFP 130 |
1080 |
# define EC_F_EC_GROUP_GET_DEGREE 173 |
1081 |
# define EC_F_EC_GROUP_GET_ORDER 141 |
1082 |
# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 |
1083 |
# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 |
1084 |
# define EC_F_EC_GROUP_NEW 108 |
1085 |
# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 |
1086 |
# define EC_F_EC_GROUP_NEW_FROM_DATA 175 |
1087 |
# define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 |
1088 |
# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 |
1089 |
# define EC_F_EC_GROUP_SET_CURVE_GFP 109 |
1090 |
# define EC_F_EC_GROUP_SET_EXTRA_DATA 110 |
1091 |
# define EC_F_EC_GROUP_SET_GENERATOR 111 |
1092 |
# define EC_F_EC_KEY_CHECK_KEY 177 |
1093 |
# define EC_F_EC_KEY_COPY 178 |
1094 |
# define EC_F_EC_KEY_GENERATE_KEY 179 |
1095 |
# define EC_F_EC_KEY_NEW 182 |
1096 |
# define EC_F_EC_KEY_PRINT 180 |
1097 |
# define EC_F_EC_KEY_PRINT_FP 181 |
1098 |
# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 |
1099 |
# define EC_F_EC_POINTS_MAKE_AFFINE 136 |
1100 |
# define EC_F_EC_POINT_ADD 112 |
1101 |
# define EC_F_EC_POINT_CMP 113 |
1102 |
# define EC_F_EC_POINT_COPY 114 |
1103 |
# define EC_F_EC_POINT_DBL 115 |
1104 |
# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 |
1105 |
# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 |
1106 |
# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 |
1107 |
# define EC_F_EC_POINT_INVERT 210 |
1108 |
# define EC_F_EC_POINT_IS_AT_INFINITY 118 |
1109 |
# define EC_F_EC_POINT_IS_ON_CURVE 119 |
1110 |
# define EC_F_EC_POINT_MAKE_AFFINE 120 |
1111 |
# define EC_F_EC_POINT_MUL 184 |
1112 |
# define EC_F_EC_POINT_NEW 121 |
1113 |
# define EC_F_EC_POINT_OCT2POINT 122 |
1114 |
# define EC_F_EC_POINT_POINT2OCT 123 |
1115 |
# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 |
1116 |
# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 |
1117 |
# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 |
1118 |
# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 |
1119 |
# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 |
1120 |
# define EC_F_EC_POINT_SET_TO_INFINITY 127 |
1121 |
# define EC_F_EC_PRE_COMP_DUP 207 |
1122 |
# define EC_F_EC_PRE_COMP_NEW 196 |
1123 |
# define EC_F_EC_WNAF_MUL 187 |
1124 |
# define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 |
1125 |
# define EC_F_I2D_ECPARAMETERS 190 |
1126 |
# define EC_F_I2D_ECPKPARAMETERS 191 |
1127 |
# define EC_F_I2D_ECPRIVATEKEY 192 |
1128 |
# define EC_F_I2O_ECPUBLICKEY 151 |
1129 |
# define EC_F_NISTP224_PRE_COMP_NEW 227 |
1130 |
# define EC_F_NISTP256_PRE_COMP_NEW 236 |
1131 |
# define EC_F_NISTP521_PRE_COMP_NEW 237 |
1132 |
# define EC_F_O2I_ECPUBLICKEY 152 |
1133 |
# define EC_F_OLD_EC_PRIV_DECODE 222 |
1134 |
# define EC_F_PKEY_EC_CTRL 197 |
1135 |
# define EC_F_PKEY_EC_CTRL_STR 198 |
1136 |
# define EC_F_PKEY_EC_DERIVE 217 |
1137 |
# define EC_F_PKEY_EC_KEYGEN 199 |
1138 |
# define EC_F_PKEY_EC_PARAMGEN 219 |
1139 |
# define EC_F_PKEY_EC_SIGN 218 |
1140 |
|
1141 |
/* Reason codes. */
|
1142 |
# define EC_R_ASN1_ERROR 115 |
1143 |
# define EC_R_ASN1_UNKNOWN_FIELD 116 |
1144 |
# define EC_R_BIGNUM_OUT_OF_RANGE 144 |
1145 |
# define EC_R_BUFFER_TOO_SMALL 100 |
1146 |
# define EC_R_COORDINATES_OUT_OF_RANGE 146 |
1147 |
# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 |
1148 |
# define EC_R_DECODE_ERROR 142 |
1149 |
# define EC_R_DISCRIMINANT_IS_ZERO 118 |
1150 |
# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 |
1151 |
# define EC_R_FIELD_TOO_LARGE 143 |
1152 |
# define EC_R_GF2M_NOT_SUPPORTED 147 |
1153 |
# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 |
1154 |
# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 |
1155 |
# define EC_R_INCOMPATIBLE_OBJECTS 101 |
1156 |
# define EC_R_INVALID_ARGUMENT 112 |
1157 |
# define EC_R_INVALID_COMPRESSED_POINT 110 |
1158 |
# define EC_R_INVALID_COMPRESSION_BIT 109 |
1159 |
# define EC_R_INVALID_CURVE 141 |
1160 |
# define EC_R_INVALID_DIGEST_TYPE 138 |
1161 |
# define EC_R_INVALID_ENCODING 102 |
1162 |
# define EC_R_INVALID_FIELD 103 |
1163 |
# define EC_R_INVALID_FORM 104 |
1164 |
# define EC_R_INVALID_GROUP_ORDER 122 |
1165 |
# define EC_R_INVALID_PENTANOMIAL_BASIS 132 |
1166 |
# define EC_R_INVALID_PRIVATE_KEY 123 |
1167 |
# define EC_R_INVALID_TRINOMIAL_BASIS 137 |
1168 |
# define EC_R_KEYS_NOT_SET 140 |
1169 |
# define EC_R_MISSING_PARAMETERS 124 |
1170 |
# define EC_R_MISSING_PRIVATE_KEY 125 |
1171 |
# define EC_R_NOT_A_NIST_PRIME 135 |
1172 |
# define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 |
1173 |
# define EC_R_NOT_IMPLEMENTED 126 |
1174 |
# define EC_R_NOT_INITIALIZED 111 |
1175 |
# define EC_R_NO_FIELD_MOD 133 |
1176 |
# define EC_R_NO_PARAMETERS_SET 139 |
1177 |
# define EC_R_PASSED_NULL_PARAMETER 134 |
1178 |
# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 |
1179 |
# define EC_R_POINT_AT_INFINITY 106 |
1180 |
# define EC_R_POINT_IS_NOT_ON_CURVE 107 |
1181 |
# define EC_R_SLOT_FULL 108 |
1182 |
# define EC_R_UNDEFINED_GENERATOR 113 |
1183 |
# define EC_R_UNDEFINED_ORDER 128 |
1184 |
# define EC_R_UNKNOWN_GROUP 129 |
1185 |
# define EC_R_UNKNOWN_ORDER 114 |
1186 |
# define EC_R_UNSUPPORTED_FIELD 131 |
1187 |
# define EC_R_WRONG_CURVE_PARAMETERS 145 |
1188 |
# define EC_R_WRONG_ORDER 130 |
1189 |
|
1190 |
#ifdef __cplusplus
|
1191 |
} |
1192 |
#endif
|
1193 |
#endif
|