/src/openssl/include/openssl/ec.h
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /*  | 
2  |  |  * Copyright 2002-2018 The OpenSSL Project Authors. All Rights Reserved.  | 
3  |  |  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved  | 
4  |  |  *  | 
5  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use  | 
6  |  |  * this file except in compliance with the License.  You can obtain a copy  | 
7  |  |  * in the file LICENSE in the source distribution or at  | 
8  |  |  * https://www.openssl.org/source/license.html  | 
9  |  |  */  | 
10  |  |  | 
11  |  | #ifndef OPENSSL_EC_H  | 
12  |  | # define OPENSSL_EC_H  | 
13  |  | # pragma once  | 
14  |  |  | 
15  |  | # include <openssl/macros.h>  | 
16  |  | # ifndef OPENSSL_NO_DEPRECATED_3_0  | 
17  |  | #  define HEADER_EC_H  | 
18  |  | # endif  | 
19  |  |  | 
20  |  | # include <openssl/opensslconf.h>  | 
21  |  |  | 
22  |  | # ifndef OPENSSL_NO_EC  | 
23  |  | #  include <openssl/asn1.h>  | 
24  |  | #  include <openssl/symhacks.h>  | 
25  |  | #  ifndef OPENSSL_NO_DEPRECATED_1_1_0  | 
26  |  | #   include <openssl/bn.h>  | 
27  |  | #  endif  | 
28  |  | #  include <openssl/ecerr.h>  | 
29  |  | #  ifdef  __cplusplus  | 
30  |  | extern "C" { | 
31  |  | #  endif  | 
32  |  |  | 
33  |  | #  ifndef OPENSSL_ECC_MAX_FIELD_BITS  | 
34  | 162  | #   define OPENSSL_ECC_MAX_FIELD_BITS 661  | 
35  |  | #  endif  | 
36  |  |  | 
37  |  | /** Enum for the point conversion form as defined in X9.62 (ECDSA)  | 
38  |  |  *  for the encoding of a elliptic curve point (x,y) */  | 
39  |  | typedef enum { | 
40  |  |         /** the point is encoded as z||x, where the octet z specifies  | 
41  |  |          *  which solution of the quadratic equation y is  */  | 
42  |  |     POINT_CONVERSION_COMPRESSED = 2,  | 
43  |  |         /** the point is encoded as z||x||y, where z is the octet 0x04  */  | 
44  |  |     POINT_CONVERSION_UNCOMPRESSED = 4,  | 
45  |  |         /** the point is encoded as z||x||y, where the octet z specifies  | 
46  |  |          *  which solution of the quadratic equation y is  */  | 
47  |  |     POINT_CONVERSION_HYBRID = 6  | 
48  |  | } point_conversion_form_t;  | 
49  |  |  | 
50  |  | typedef struct ec_method_st EC_METHOD;  | 
51  |  | typedef struct ec_group_st EC_GROUP;  | 
52  |  | typedef struct ec_point_st EC_POINT;  | 
53  |  | typedef struct ecpk_parameters_st ECPKPARAMETERS;  | 
54  |  | typedef struct ec_parameters_st ECPARAMETERS;  | 
55  |  |  | 
56  |  | /********************************************************************/  | 
57  |  | /*               EC_METHODs for curves over GF(p)                   */  | 
58  |  | /********************************************************************/  | 
59  |  |  | 
60  |  | /** Returns the basic GFp ec methods which provides the basis for the  | 
61  |  |  *  optimized methods.  | 
62  |  |  *  \return  EC_METHOD object  | 
63  |  |  */  | 
64  |  | const EC_METHOD *EC_GFp_simple_method(void);  | 
65  |  |  | 
66  |  | /** Returns GFp methods using montgomery multiplication.  | 
67  |  |  *  \return  EC_METHOD object  | 
68  |  |  */  | 
69  |  | const EC_METHOD *EC_GFp_mont_method(void);  | 
70  |  |  | 
71  |  | /** Returns GFp methods using optimized methods for NIST recommended curves  | 
72  |  |  *  \return  EC_METHOD object  | 
73  |  |  */  | 
74  |  | const EC_METHOD *EC_GFp_nist_method(void);  | 
75  |  |  | 
76  |  | #  ifndef OPENSSL_NO_EC_NISTP_64_GCC_128  | 
77  |  | /** Returns 64-bit optimized methods for nistp224  | 
78  |  |  *  \return  EC_METHOD object  | 
79  |  |  */  | 
80  |  | const EC_METHOD *EC_GFp_nistp224_method(void);  | 
81  |  |  | 
82  |  | /** Returns 64-bit optimized methods for nistp256  | 
83  |  |  *  \return  EC_METHOD object  | 
84  |  |  */  | 
85  |  | const EC_METHOD *EC_GFp_nistp256_method(void);  | 
86  |  |  | 
87  |  | /** Returns 64-bit optimized methods for nistp521  | 
88  |  |  *  \return  EC_METHOD object  | 
89  |  |  */  | 
90  |  | const EC_METHOD *EC_GFp_nistp521_method(void);  | 
91  |  | #  endif  | 
92  |  |  | 
93  |  | #  ifndef OPENSSL_NO_EC2M  | 
94  |  | /********************************************************************/  | 
95  |  | /*           EC_METHOD for curves over GF(2^m)                      */  | 
96  |  | /********************************************************************/  | 
97  |  |  | 
98  |  | /** Returns the basic GF2m ec method  | 
99  |  |  *  \return  EC_METHOD object  | 
100  |  |  */  | 
101  |  | const EC_METHOD *EC_GF2m_simple_method(void);  | 
102  |  |  | 
103  |  | #  endif  | 
104  |  |  | 
105  |  | /********************************************************************/  | 
106  |  | /*                   EC_GROUP functions                             */  | 
107  |  | /********************************************************************/  | 
108  |  |  | 
109  |  | /**  | 
110  |  |  *  Creates a new EC_GROUP object  | 
111  |  |  *  \param   libctx The associated library context or NULL for the default  | 
112  |  |  *                  library context  | 
113  |  |  *  \param   meth   EC_METHOD to use  | 
114  |  |  *  \return  newly created EC_GROUP object or NULL in case of an error.  | 
115  |  |  */  | 
116  |  | EC_GROUP *EC_GROUP_new_ex(OPENSSL_CTX *libctx, const EC_METHOD *meth);  | 
117  |  |  | 
118  |  | /**  | 
119  |  |  *  Creates a new EC_GROUP object. Same as EC_GROUP_new_ex with NULL for the  | 
120  |  |  *  library context.  | 
121  |  |  *  \param   meth   EC_METHOD to use  | 
122  |  |  *  \return  newly created EC_GROUP object or NULL in case of an error.  | 
123  |  |  */  | 
124  |  | EC_GROUP *EC_GROUP_new(const EC_METHOD *meth);  | 
125  |  |  | 
126  |  | /** Frees a EC_GROUP object  | 
127  |  |  *  \param  group  EC_GROUP object to be freed.  | 
128  |  |  */  | 
129  |  | void EC_GROUP_free(EC_GROUP *group);  | 
130  |  |  | 
131  |  | /** Clears and frees a EC_GROUP object  | 
132  |  |  *  \param  group  EC_GROUP object to be cleared and freed.  | 
133  |  |  */  | 
134  |  | DEPRECATEDIN_3_0(void EC_GROUP_clear_free(EC_GROUP *group))  | 
135  |  |  | 
136  |  | /** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD.  | 
137  |  |  *  \param  dst  destination EC_GROUP object  | 
138  |  |  *  \param  src  source EC_GROUP object  | 
139  |  |  *  \return 1 on success and 0 if an error occurred.  | 
140  |  |  */  | 
141  |  | int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src);  | 
142  |  |  | 
143  |  | /** Creates a new EC_GROUP object and copies the content  | 
144  |  |  *  form src to the newly created EC_KEY object  | 
145  |  |  *  \param  src  source EC_GROUP object  | 
146  |  |  *  \return newly created EC_GROUP object or NULL in case of an error.  | 
147  |  |  */  | 
148  |  | EC_GROUP *EC_GROUP_dup(const EC_GROUP *src);  | 
149  |  |  | 
150  |  | /** Returns the EC_METHOD of the EC_GROUP object.  | 
151  |  |  *  \param  group  EC_GROUP object  | 
152  |  |  *  \return EC_METHOD used in this EC_GROUP object.  | 
153  |  |  */  | 
154  |  | const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group);  | 
155  |  |  | 
156  |  | /** Returns the field type of the EC_METHOD.  | 
157  |  |  *  \param  meth  EC_METHOD object  | 
158  |  |  *  \return NID of the underlying field type OID.  | 
159  |  |  */  | 
160  |  | int EC_METHOD_get_field_type(const EC_METHOD *meth);  | 
161  |  |  | 
162  |  | /** Sets the generator and its order/cofactor of a EC_GROUP object.  | 
163  |  |  *  \param  group      EC_GROUP object  | 
164  |  |  *  \param  generator  EC_POINT object with the generator.  | 
165  |  |  *  \param  order      the order of the group generated by the generator.  | 
166  |  |  *  \param  cofactor   the index of the sub-group generated by the generator  | 
167  |  |  *                     in the group of all points on the elliptic curve.  | 
168  |  |  *  \return 1 on success and 0 if an error occurred  | 
169  |  |  */  | 
170  |  | int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator,  | 
171  |  |                            const BIGNUM *order, const BIGNUM *cofactor);  | 
172  |  |  | 
173  |  | /** Returns the generator of a EC_GROUP object.  | 
174  |  |  *  \param  group  EC_GROUP object  | 
175  |  |  *  \return the currently used generator (possibly NULL).  | 
176  |  |  */  | 
177  |  | const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group);  | 
178  |  |  | 
179  |  | /** Returns the montgomery data for order(Generator)  | 
180  |  |  *  \param  group  EC_GROUP object  | 
181  |  |  *  \return the currently used montgomery data (possibly NULL).  | 
182  |  | */  | 
183  |  | BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group);  | 
184  |  |  | 
185  |  | /** Gets the order of a EC_GROUP  | 
186  |  |  *  \param  group  EC_GROUP object  | 
187  |  |  *  \param  order  BIGNUM to which the order is copied  | 
188  |  |  *  \param  ctx    unused  | 
189  |  |  *  \return 1 on success and 0 if an error occurred  | 
190  |  |  */  | 
191  |  | int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx);  | 
192  |  |  | 
193  |  | /** Gets the order of an EC_GROUP  | 
194  |  |  *  \param  group  EC_GROUP object  | 
195  |  |  *  \return the group order  | 
196  |  |  */  | 
197  |  | const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group);  | 
198  |  |  | 
199  |  | /** Gets the number of bits of the order of an EC_GROUP  | 
200  |  |  *  \param  group  EC_GROUP object  | 
201  |  |  *  \return number of bits of group order.  | 
202  |  |  */  | 
203  |  | int EC_GROUP_order_bits(const EC_GROUP *group);  | 
204  |  |  | 
205  |  | /** Gets the cofactor of a EC_GROUP  | 
206  |  |  *  \param  group     EC_GROUP object  | 
207  |  |  *  \param  cofactor  BIGNUM to which the cofactor is copied  | 
208  |  |  *  \param  ctx       unused  | 
209  |  |  *  \return 1 on success and 0 if an error occurred  | 
210  |  |  */  | 
211  |  | int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor,  | 
212  |  |                           BN_CTX *ctx);  | 
213  |  |  | 
214  |  | /** Gets the cofactor of an EC_GROUP  | 
215  |  |  *  \param  group  EC_GROUP object  | 
216  |  |  *  \return the group cofactor  | 
217  |  |  */  | 
218  |  | const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group);  | 
219  |  |  | 
220  |  | /** Sets the name of a EC_GROUP object  | 
221  |  |  *  \param  group  EC_GROUP object  | 
222  |  |  *  \param  nid    NID of the curve name OID  | 
223  |  |  */  | 
224  |  | void EC_GROUP_set_curve_name(EC_GROUP *group, int nid);  | 
225  |  |  | 
226  |  | /** Returns the curve name of a EC_GROUP object  | 
227  |  |  *  \param  group  EC_GROUP object  | 
228  |  |  *  \return NID of the curve name OID or 0 if not set.  | 
229  |  |  */  | 
230  |  | int EC_GROUP_get_curve_name(const EC_GROUP *group);  | 
231  |  |  | 
232  |  | /** Gets the field of an EC_GROUP  | 
233  |  |  *  \param  group  EC_GROUP object  | 
234  |  |  *  \return the group field  | 
235  |  |  */  | 
236  |  | const BIGNUM *EC_GROUP_get0_field(const EC_GROUP *group);  | 
237  |  |  | 
238  |  | void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag);  | 
239  |  | int EC_GROUP_get_asn1_flag(const EC_GROUP *group);  | 
240  |  |  | 
241  |  | void EC_GROUP_set_point_conversion_form(EC_GROUP *group,  | 
242  |  |                                         point_conversion_form_t form);  | 
243  |  | point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);  | 
244  |  |  | 
245  |  | unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x);  | 
246  |  | size_t EC_GROUP_get_seed_len(const EC_GROUP *);  | 
247  |  | size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len);  | 
248  |  |  | 
249  |  | /** Sets the parameters of a ec curve defined by y^2 = x^3 + a*x + b (for GFp)  | 
250  |  |  *  or y^2 + x*y = x^3 + a*x^2 + b (for GF2m)  | 
251  |  |  *  \param  group  EC_GROUP object  | 
252  |  |  *  \param  p      BIGNUM with the prime number (GFp) or the polynomial  | 
253  |  |  *                 defining the underlying field (GF2m)  | 
254  |  |  *  \param  a      BIGNUM with parameter a of the equation  | 
255  |  |  *  \param  b      BIGNUM with parameter b of the equation  | 
256  |  |  *  \param  ctx    BN_CTX object (optional)  | 
257  |  |  *  \return 1 on success and 0 if an error occurred  | 
258  |  |  */  | 
259  |  | int EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,  | 
260  |  |                        const BIGNUM *b, BN_CTX *ctx);  | 
261  |  |  | 
262  |  | /** Gets the parameters of the ec curve defined by y^2 = x^3 + a*x + b (for GFp)  | 
263  |  |  *  or y^2 + x*y = x^3 + a*x^2 + b (for GF2m)  | 
264  |  |  *  \param  group  EC_GROUP object  | 
265  |  |  *  \param  p      BIGNUM with the prime number (GFp) or the polynomial  | 
266  |  |  *                 defining the underlying field (GF2m)  | 
267  |  |  *  \param  a      BIGNUM for parameter a of the equation  | 
268  |  |  *  \param  b      BIGNUM for parameter b of the equation  | 
269  |  |  *  \param  ctx    BN_CTX object (optional)  | 
270  |  |  *  \return 1 on success and 0 if an error occurred  | 
271  |  |  */  | 
272  |  | int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b,  | 
273  |  |                        BN_CTX *ctx);  | 
274  |  |  | 
275  |  | /** Sets the parameters of an ec curve. Synonym for EC_GROUP_set_curve  | 
276  |  |  *  \param  group  EC_GROUP object  | 
277  |  |  *  \param  p      BIGNUM with the prime number (GFp) or the polynomial  | 
278  |  |  *                 defining the underlying field (GF2m)  | 
279  |  |  *  \param  a      BIGNUM with parameter a of the equation  | 
280  |  |  *  \param  b      BIGNUM with parameter b of the equation  | 
281  |  |  *  \param  ctx    BN_CTX object (optional)  | 
282  |  |  *  \return 1 on success and 0 if an error occurred  | 
283  |  |  */  | 
284  |  | DEPRECATEDIN_3_0(int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p,  | 
285  |  |                                           const BIGNUM *a, const BIGNUM *b,  | 
286  |  |                                           BN_CTX *ctx))  | 
287  |  |  | 
288  |  | /** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve  | 
289  |  |  *  \param  group  EC_GROUP object  | 
290  |  |  *  \param  p      BIGNUM with the prime number (GFp) or the polynomial  | 
291  |  |  *                 defining the underlying field (GF2m)  | 
292  |  |  *  \param  a      BIGNUM for parameter a of the equation  | 
293  |  |  *  \param  b      BIGNUM for parameter b of the equation  | 
294  |  |  *  \param  ctx    BN_CTX object (optional)  | 
295  |  |  *  \return 1 on success and 0 if an error occurred  | 
296  |  |  */  | 
297  |  | DEPRECATEDIN_3_0(int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p,  | 
298  |  |                                           BIGNUM *a, BIGNUM *b,  | 
299  |  |                                           BN_CTX *ctx))  | 
300  |  |  | 
301  |  | #  ifndef OPENSSL_NO_EC2M  | 
302  |  | /** Sets the parameter of an ec curve. Synonym for EC_GROUP_set_curve  | 
303  |  |  *  \param  group  EC_GROUP object  | 
304  |  |  *  \param  p      BIGNUM with the prime number (GFp) or the polynomial  | 
305  |  |  *                 defining the underlying field (GF2m)  | 
306  |  |  *  \param  a      BIGNUM with parameter a of the equation  | 
307  |  |  *  \param  b      BIGNUM with parameter b of the equation  | 
308  |  |  *  \param  ctx    BN_CTX object (optional)  | 
309  |  |  *  \return 1 on success and 0 if an error occurred  | 
310  |  |  */  | 
311  |  | DEPRECATEDIN_3_0(int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p,  | 
312  |  |                                            const BIGNUM *a, const BIGNUM *b,  | 
313  |  |                                            BN_CTX *ctx))  | 
314  |  |  | 
315  |  | /** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve  | 
316  |  |  *  \param  group  EC_GROUP object  | 
317  |  |  *  \param  p      BIGNUM with the prime number (GFp) or the polynomial  | 
318  |  |  *                 defining the underlying field (GF2m)  | 
319  |  |  *  \param  a      BIGNUM for parameter a of the equation  | 
320  |  |  *  \param  b      BIGNUM for parameter b of the equation  | 
321  |  |  *  \param  ctx    BN_CTX object (optional)  | 
322  |  |  *  \return 1 on success and 0 if an error occurred  | 
323  |  |  */  | 
324  |  | DEPRECATEDIN_3_0(int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p,  | 
325  |  |                                            BIGNUM *a, BIGNUM *b,  | 
326  |  |                                            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 the groups are equal, 1 if not, or -1 on error  | 
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  |  |  | 
384  |  | /**  | 
385  |  |  * Creates a EC_GROUP object with a curve specified by a NID  | 
386  |  |  *  \param  libctx The associated library context or NULL for the default  | 
387  |  |  *                 context  | 
388  |  |  *  \param  nid    NID of the OID of the curve name  | 
389  |  |  *  \return newly created EC_GROUP object with specified curve or NULL  | 
390  |  |  *          if an error occurred  | 
391  |  |  */  | 
392  |  | EC_GROUP *EC_GROUP_new_by_curve_name_ex(OPENSSL_CTX *libctx, int nid);  | 
393  |  |  | 
394  |  | /**  | 
395  |  |  * Creates a EC_GROUP object with a curve specified by a NID. Same as  | 
396  |  |  * EC_GROUP_new_by_curve_name_ex but the libctx is always NULL.  | 
397  |  |  *  \param  nid    NID of the OID of the curve name  | 
398  |  |  *  \return newly created EC_GROUP object with specified curve or NULL  | 
399  |  |  *          if an error occurred  | 
400  |  |  */  | 
401  |  | EC_GROUP *EC_GROUP_new_by_curve_name(int nid);  | 
402  |  |  | 
403  |  | /** Creates a new EC_GROUP object from an ECPARAMETERS object  | 
404  |  |  *  \param  params  pointer to the ECPARAMETERS object  | 
405  |  |  *  \return newly created EC_GROUP object with specified curve or NULL  | 
406  |  |  *          if an error occurred  | 
407  |  |  */  | 
408  |  | EC_GROUP *EC_GROUP_new_from_ecparameters(const ECPARAMETERS *params);  | 
409  |  |  | 
410  |  | /** Creates an ECPARAMETERS object for the given EC_GROUP object.  | 
411  |  |  *  \param  group   pointer to the EC_GROUP object  | 
412  |  |  *  \param  params  pointer to an existing ECPARAMETERS object or NULL  | 
413  |  |  *  \return pointer to the new ECPARAMETERS object or NULL  | 
414  |  |  *          if an error occurred.  | 
415  |  |  */  | 
416  |  | ECPARAMETERS *EC_GROUP_get_ecparameters(const EC_GROUP *group,  | 
417  |  |                                         ECPARAMETERS *params);  | 
418  |  |  | 
419  |  | /** Creates a new EC_GROUP object from an ECPKPARAMETERS object  | 
420  |  |  *  \param  params  pointer to an existing ECPKPARAMETERS object, or NULL  | 
421  |  |  *  \return newly created EC_GROUP object with specified curve, or NULL  | 
422  |  |  *          if an error occurred  | 
423  |  |  */  | 
424  |  | EC_GROUP *EC_GROUP_new_from_ecpkparameters(const ECPKPARAMETERS *params);  | 
425  |  |  | 
426  |  | /** Creates an ECPKPARAMETERS object for the given EC_GROUP object.  | 
427  |  |  *  \param  group   pointer to the EC_GROUP object  | 
428  |  |  *  \param  params  pointer to an existing ECPKPARAMETERS object or NULL  | 
429  |  |  *  \return pointer to the new ECPKPARAMETERS object or NULL  | 
430  |  |  *          if an error occurred.  | 
431  |  |  */  | 
432  |  | ECPKPARAMETERS *EC_GROUP_get_ecpkparameters(const EC_GROUP *group,  | 
433  |  |                                             ECPKPARAMETERS *params);  | 
434  |  |  | 
435  |  | /********************************************************************/  | 
436  |  | /*               handling of internal curves                        */  | 
437  |  | /********************************************************************/  | 
438  |  |  | 
439  |  | typedef struct { | 
440  |  |     int nid;  | 
441  |  |     const char *comment;  | 
442  |  | } EC_builtin_curve;  | 
443  |  |  | 
444  |  | /*  | 
445  |  |  * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all  | 
446  |  |  * available curves or zero if a error occurred. In case r is not zero,  | 
447  |  |  * nitems EC_builtin_curve structures are filled with the data of the first  | 
448  |  |  * nitems internal groups  | 
449  |  |  */  | 
450  |  | size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);  | 
451  |  |  | 
452  |  | const char *EC_curve_nid2nist(int nid);  | 
453  |  | int EC_curve_nist2nid(const char *name);  | 
454  |  | int EC_GROUP_check_named_curve(const EC_GROUP *group, int nist_only,  | 
455  |  |                                BN_CTX *ctx);  | 
456  |  |  | 
457  |  | /********************************************************************/  | 
458  |  | /*                    EC_POINT functions                            */  | 
459  |  | /********************************************************************/  | 
460  |  |  | 
461  |  | /** Creates a new EC_POINT object for the specified EC_GROUP  | 
462  |  |  *  \param  group  EC_GROUP the underlying EC_GROUP object  | 
463  |  |  *  \return newly created EC_POINT object or NULL if an error occurred  | 
464  |  |  */  | 
465  |  | EC_POINT *EC_POINT_new(const EC_GROUP *group);  | 
466  |  |  | 
467  |  | /** Frees a EC_POINT object  | 
468  |  |  *  \param  point  EC_POINT object to be freed  | 
469  |  |  */  | 
470  |  | void EC_POINT_free(EC_POINT *point);  | 
471  |  |  | 
472  |  | /** Clears and frees a EC_POINT object  | 
473  |  |  *  \param  point  EC_POINT object to be cleared and freed  | 
474  |  |  */  | 
475  |  | void EC_POINT_clear_free(EC_POINT *point);  | 
476  |  |  | 
477  |  | /** Copies EC_POINT object  | 
478  |  |  *  \param  dst  destination EC_POINT object  | 
479  |  |  *  \param  src  source EC_POINT object  | 
480  |  |  *  \return 1 on success and 0 if an error occurred  | 
481  |  |  */  | 
482  |  | int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src);  | 
483  |  |  | 
484  |  | /** Creates a new EC_POINT object and copies the content of the supplied  | 
485  |  |  *  EC_POINT  | 
486  |  |  *  \param  src    source EC_POINT object  | 
487  |  |  *  \param  group  underlying the EC_GROUP object  | 
488  |  |  *  \return newly created EC_POINT object or NULL if an error occurred  | 
489  |  |  */  | 
490  |  | EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group);  | 
491  |  |  | 
492  |  | /** Returns the EC_METHOD used in EC_POINT object  | 
493  |  |  *  \param  point  EC_POINT object  | 
494  |  |  *  \return the EC_METHOD used  | 
495  |  |  */  | 
496  |  | const EC_METHOD *EC_POINT_method_of(const EC_POINT *point);  | 
497  |  |  | 
498  |  | /** Sets a point to infinity (neutral element)  | 
499  |  |  *  \param  group  underlying EC_GROUP object  | 
500  |  |  *  \param  point  EC_POINT to set to infinity  | 
501  |  |  *  \return 1 on success and 0 if an error occurred  | 
502  |  |  */  | 
503  |  | int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point);  | 
504  |  |  | 
505  |  | /** Sets the jacobian projective coordinates of a EC_POINT over GFp  | 
506  |  |  *  \param  group  underlying EC_GROUP object  | 
507  |  |  *  \param  p      EC_POINT object  | 
508  |  |  *  \param  x      BIGNUM with the x-coordinate  | 
509  |  |  *  \param  y      BIGNUM with the y-coordinate  | 
510  |  |  *  \param  z      BIGNUM with the z-coordinate  | 
511  |  |  *  \param  ctx    BN_CTX object (optional)  | 
512  |  |  *  \return 1 on success and 0 if an error occurred  | 
513  |  |  */  | 
514  |  | int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group,  | 
515  |  |                                              EC_POINT *p, const BIGNUM *x,  | 
516  |  |                                              const BIGNUM *y, const BIGNUM *z,  | 
517  |  |                                              BN_CTX *ctx);  | 
518  |  |  | 
519  |  | /** Gets the jacobian projective coordinates of a EC_POINT over GFp  | 
520  |  |  *  \param  group  underlying EC_GROUP object  | 
521  |  |  *  \param  p      EC_POINT object  | 
522  |  |  *  \param  x      BIGNUM for the x-coordinate  | 
523  |  |  *  \param  y      BIGNUM for the y-coordinate  | 
524  |  |  *  \param  z      BIGNUM for the z-coordinate  | 
525  |  |  *  \param  ctx    BN_CTX object (optional)  | 
526  |  |  *  \return 1 on success and 0 if an error occurred  | 
527  |  |  */  | 
528  |  | int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group,  | 
529  |  |                                              const EC_POINT *p, BIGNUM *x,  | 
530  |  |                                              BIGNUM *y, BIGNUM *z,  | 
531  |  |                                              BN_CTX *ctx);  | 
532  |  |  | 
533  |  | /** Sets the affine coordinates of an EC_POINT  | 
534  |  |  *  \param  group  underlying EC_GROUP object  | 
535  |  |  *  \param  p      EC_POINT object  | 
536  |  |  *  \param  x      BIGNUM with the x-coordinate  | 
537  |  |  *  \param  y      BIGNUM with the y-coordinate  | 
538  |  |  *  \param  ctx    BN_CTX object (optional)  | 
539  |  |  *  \return 1 on success and 0 if an error occurred  | 
540  |  |  */  | 
541  |  | int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p,  | 
542  |  |                                     const BIGNUM *x, const BIGNUM *y,  | 
543  |  |                                     BN_CTX *ctx);  | 
544  |  |  | 
545  |  | /** Gets the affine coordinates of an EC_POINT.  | 
546  |  |  *  \param  group  underlying EC_GROUP object  | 
547  |  |  *  \param  p      EC_POINT object  | 
548  |  |  *  \param  x      BIGNUM for the x-coordinate  | 
549  |  |  *  \param  y      BIGNUM for the y-coordinate  | 
550  |  |  *  \param  ctx    BN_CTX object (optional)  | 
551  |  |  *  \return 1 on success and 0 if an error occurred  | 
552  |  |  */  | 
553  |  | int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p,  | 
554  |  |                                     BIGNUM *x, BIGNUM *y, BN_CTX *ctx);  | 
555  |  |  | 
556  |  | /** Sets the affine coordinates of an EC_POINT. A synonym of  | 
557  |  |  *  EC_POINT_set_affine_coordinates  | 
558  |  |  *  \param  group  underlying EC_GROUP object  | 
559  |  |  *  \param  p      EC_POINT object  | 
560  |  |  *  \param  x      BIGNUM with the x-coordinate  | 
561  |  |  *  \param  y      BIGNUM with the y-coordinate  | 
562  |  |  *  \param  ctx    BN_CTX object (optional)  | 
563  |  |  *  \return 1 on success and 0 if an error occurred  | 
564  |  |  */  | 
565  |  | DEPRECATEDIN_3_0(int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group,  | 
566  |  |                                                        EC_POINT *p,  | 
567  |  |                                                        const BIGNUM *x,  | 
568  |  |                                                        const BIGNUM *y,  | 
569  |  |                                                        BN_CTX *ctx))  | 
570  |  |  | 
571  |  | /** Gets the affine coordinates of an EC_POINT. A synonym of  | 
572  |  |  *  EC_POINT_get_affine_coordinates  | 
573  |  |  *  \param  group  underlying EC_GROUP object  | 
574  |  |  *  \param  p      EC_POINT object  | 
575  |  |  *  \param  x      BIGNUM for the x-coordinate  | 
576  |  |  *  \param  y      BIGNUM for the y-coordinate  | 
577  |  |  *  \param  ctx    BN_CTX object (optional)  | 
578  |  |  *  \return 1 on success and 0 if an error occurred  | 
579  |  |  */  | 
580  |  | DEPRECATEDIN_3_0(int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,  | 
581  |  |                                                        const EC_POINT *p,  | 
582  |  |                                                        BIGNUM *x,  | 
583  |  |                                                        BIGNUM *y,  | 
584  |  |                                                        BN_CTX *ctx))  | 
585  |  |  | 
586  |  | /** Sets the x9.62 compressed coordinates of a EC_POINT  | 
587  |  |  *  \param  group  underlying EC_GROUP object  | 
588  |  |  *  \param  p      EC_POINT object  | 
589  |  |  *  \param  x      BIGNUM with x-coordinate  | 
590  |  |  *  \param  y_bit  integer with the y-Bit (either 0 or 1)  | 
591  |  |  *  \param  ctx    BN_CTX object (optional)  | 
592  |  |  *  \return 1 on success and 0 if an error occurred  | 
593  |  |  */  | 
594  |  | int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *p,  | 
595  |  |                                         const BIGNUM *x, int y_bit,  | 
596  |  |                                         BN_CTX *ctx);  | 
597  |  |  | 
598  |  | /** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of  | 
599  |  |  *  EC_POINT_set_compressed_coordinates  | 
600  |  |  *  \param  group  underlying EC_GROUP object  | 
601  |  |  *  \param  p      EC_POINT object  | 
602  |  |  *  \param  x      BIGNUM with x-coordinate  | 
603  |  |  *  \param  y_bit  integer with the y-Bit (either 0 or 1)  | 
604  |  |  *  \param  ctx    BN_CTX object (optional)  | 
605  |  |  *  \return 1 on success and 0 if an error occurred  | 
606  |  |  */  | 
607  |  | DEPRECATEDIN_3_0(int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,  | 
608  |  |                                                            EC_POINT *p,  | 
609  |  |                                                            const BIGNUM *x,  | 
610  |  |                                                            int y_bit,  | 
611  |  |                                                            BN_CTX *ctx))  | 
612  |  | #  ifndef OPENSSL_NO_EC2M  | 
613  |  | /** Sets the affine coordinates of an EC_POINT. A synonym of  | 
614  |  |  *  EC_POINT_set_affine_coordinates  | 
615  |  |  *  \param  group  underlying EC_GROUP object  | 
616  |  |  *  \param  p      EC_POINT object  | 
617  |  |  *  \param  x      BIGNUM with the x-coordinate  | 
618  |  |  *  \param  y      BIGNUM with the y-coordinate  | 
619  |  |  *  \param  ctx    BN_CTX object (optional)  | 
620  |  |  *  \return 1 on success and 0 if an error occurred  | 
621  |  |  */  | 
622  |  | DEPRECATEDIN_3_0(int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group,  | 
623  |  |                                                         EC_POINT *p,  | 
624  |  |                                                         const BIGNUM *x,  | 
625  |  |                                                         const BIGNUM *y,  | 
626  |  |                                                         BN_CTX *ctx))  | 
627  |  |  | 
628  |  | /** Gets the affine coordinates of an EC_POINT. A synonym of  | 
629  |  |  *  EC_POINT_get_affine_coordinates  | 
630  |  |  *  \param  group  underlying EC_GROUP object  | 
631  |  |  *  \param  p      EC_POINT object  | 
632  |  |  *  \param  x      BIGNUM for the x-coordinate  | 
633  |  |  *  \param  y      BIGNUM for the y-coordinate  | 
634  |  |  *  \param  ctx    BN_CTX object (optional)  | 
635  |  |  *  \return 1 on success and 0 if an error occurred  | 
636  |  |  */  | 
637  |  | DEPRECATEDIN_3_0(int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,  | 
638  |  |                                                         const EC_POINT *p,  | 
639  |  |                                                         BIGNUM *x,  | 
640  |  |                                                         BIGNUM *y,  | 
641  |  |                                                         BN_CTX *ctx))  | 
642  |  |  | 
643  |  | /** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of  | 
644  |  |  *  EC_POINT_set_compressed_coordinates  | 
645  |  |  *  \param  group  underlying EC_GROUP object  | 
646  |  |  *  \param  p      EC_POINT object  | 
647  |  |  *  \param  x      BIGNUM with x-coordinate  | 
648  |  |  *  \param  y_bit  integer with the y-Bit (either 0 or 1)  | 
649  |  |  *  \param  ctx    BN_CTX object (optional)  | 
650  |  |  *  \return 1 on success and 0 if an error occurred  | 
651  |  |  */  | 
652  |  | DEPRECATEDIN_3_0(int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group,  | 
653  |  |                                                             EC_POINT *p,  | 
654  |  |                                                             const BIGNUM *x,  | 
655  |  |                                                             int y_bit,  | 
656  |  |                                                             BN_CTX *ctx))  | 
657  |  | #  endif  | 
658  |  | /** Encodes a EC_POINT object to a octet string  | 
659  |  |  *  \param  group  underlying EC_GROUP object  | 
660  |  |  *  \param  p      EC_POINT object  | 
661  |  |  *  \param  form   point conversion form  | 
662  |  |  *  \param  buf    memory buffer for the result. If NULL the function returns  | 
663  |  |  *                 required buffer size.  | 
664  |  |  *  \param  len    length of the memory buffer  | 
665  |  |  *  \param  ctx    BN_CTX object (optional)  | 
666  |  |  *  \return the length of the encoded octet string or 0 if an error occurred  | 
667  |  |  */  | 
668  |  | size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p,  | 
669  |  |                           point_conversion_form_t form,  | 
670  |  |                           unsigned char *buf, size_t len, BN_CTX *ctx);  | 
671  |  |  | 
672  |  | /** Decodes a EC_POINT from a octet string  | 
673  |  |  *  \param  group  underlying EC_GROUP object  | 
674  |  |  *  \param  p      EC_POINT object  | 
675  |  |  *  \param  buf    memory buffer with the encoded ec point  | 
676  |  |  *  \param  len    length of the encoded ec point  | 
677  |  |  *  \param  ctx    BN_CTX object (optional)  | 
678  |  |  *  \return 1 on success and 0 if an error occurred  | 
679  |  |  */  | 
680  |  | int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p,  | 
681  |  |                        const unsigned char *buf, size_t len, BN_CTX *ctx);  | 
682  |  |  | 
683  |  | /** Encodes an EC_POINT object to an allocated octet string  | 
684  |  |  *  \param  group  underlying EC_GROUP object  | 
685  |  |  *  \param  point  EC_POINT object  | 
686  |  |  *  \param  form   point conversion form  | 
687  |  |  *  \param  pbuf   returns pointer to allocated buffer  | 
688  |  |  *  \param  ctx    BN_CTX object (optional)  | 
689  |  |  *  \return the length of the encoded octet string or 0 if an error occurred  | 
690  |  |  */  | 
691  |  | size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point,  | 
692  |  |                           point_conversion_form_t form,  | 
693  |  |                           unsigned char **pbuf, BN_CTX *ctx);  | 
694  |  |  | 
695  |  | /* other interfaces to point2oct/oct2point: */  | 
696  |  | BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *,  | 
697  |  |                           point_conversion_form_t form, BIGNUM *, BN_CTX *);  | 
698  |  | EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *,  | 
699  |  |                             EC_POINT *, BN_CTX *);  | 
700  |  | char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *,  | 
701  |  |                          point_conversion_form_t form, BN_CTX *);  | 
702  |  | EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *,  | 
703  |  |                              EC_POINT *, BN_CTX *);  | 
704  |  |  | 
705  |  | /********************************************************************/  | 
706  |  | /*         functions for doing EC_POINT arithmetic                  */  | 
707  |  | /********************************************************************/  | 
708  |  |  | 
709  |  | /** Computes the sum of two EC_POINT  | 
710  |  |  *  \param  group  underlying EC_GROUP object  | 
711  |  |  *  \param  r      EC_POINT object for the result (r = a + b)  | 
712  |  |  *  \param  a      EC_POINT object with the first summand  | 
713  |  |  *  \param  b      EC_POINT object with the second summand  | 
714  |  |  *  \param  ctx    BN_CTX object (optional)  | 
715  |  |  *  \return 1 on success and 0 if an error occurred  | 
716  |  |  */  | 
717  |  | int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,  | 
718  |  |                  const EC_POINT *b, BN_CTX *ctx);  | 
719  |  |  | 
720  |  | /** Computes the double of a EC_POINT  | 
721  |  |  *  \param  group  underlying EC_GROUP object  | 
722  |  |  *  \param  r      EC_POINT object for the result (r = 2 * a)  | 
723  |  |  *  \param  a      EC_POINT object  | 
724  |  |  *  \param  ctx    BN_CTX object (optional)  | 
725  |  |  *  \return 1 on success and 0 if an error occurred  | 
726  |  |  */  | 
727  |  | int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,  | 
728  |  |                  BN_CTX *ctx);  | 
729  |  |  | 
730  |  | /** Computes the inverse of a EC_POINT  | 
731  |  |  *  \param  group  underlying EC_GROUP object  | 
732  |  |  *  \param  a      EC_POINT object to be inverted (it's used for the result as well)  | 
733  |  |  *  \param  ctx    BN_CTX object (optional)  | 
734  |  |  *  \return 1 on success and 0 if an error occurred  | 
735  |  |  */  | 
736  |  | int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx);  | 
737  |  |  | 
738  |  | /** Checks whether the point is the neutral element of the group  | 
739  |  |  *  \param  group  the underlying EC_GROUP object  | 
740  |  |  *  \param  p      EC_POINT object  | 
741  |  |  *  \return 1 if the point is the neutral element and 0 otherwise  | 
742  |  |  */  | 
743  |  | int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p);  | 
744  |  |  | 
745  |  | /** Checks whether the point is on the curve  | 
746  |  |  *  \param  group  underlying EC_GROUP object  | 
747  |  |  *  \param  point  EC_POINT object to check  | 
748  |  |  *  \param  ctx    BN_CTX object (optional)  | 
749  |  |  *  \return 1 if the point is on the curve, 0 if not, or -1 on error  | 
750  |  |  */  | 
751  |  | int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point,  | 
752  |  |                          BN_CTX *ctx);  | 
753  |  |  | 
754  |  | /** Compares two EC_POINTs  | 
755  |  |  *  \param  group  underlying EC_GROUP object  | 
756  |  |  *  \param  a      first EC_POINT object  | 
757  |  |  *  \param  b      second EC_POINT object  | 
758  |  |  *  \param  ctx    BN_CTX object (optional)  | 
759  |  |  *  \return 1 if the points are not equal, 0 if they are, or -1 on error  | 
760  |  |  */  | 
761  |  | int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b,  | 
762  |  |                  BN_CTX *ctx);  | 
763  |  |  | 
764  |  | int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx);  | 
765  |  | int EC_POINTs_make_affine(const EC_GROUP *group, size_t num,  | 
766  |  |                           EC_POINT *points[], BN_CTX *ctx);  | 
767  |  |  | 
768  |  | /** Computes r = generator * n + sum_{i=0}^{num-1} p[i] * m[i] | 
769  |  |  *  \param  group  underlying EC_GROUP object  | 
770  |  |  *  \param  r      EC_POINT object for the result  | 
771  |  |  *  \param  n      BIGNUM with the multiplier for the group generator (optional)  | 
772  |  |  *  \param  num    number further summands  | 
773  |  |  *  \param  p      array of size num of EC_POINT objects  | 
774  |  |  *  \param  m      array of size num of BIGNUM objects  | 
775  |  |  *  \param  ctx    BN_CTX object (optional)  | 
776  |  |  *  \return 1 on success and 0 if an error occurred  | 
777  |  |  */  | 
778  |  | int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n,  | 
779  |  |                   size_t num, const EC_POINT *p[], const BIGNUM *m[],  | 
780  |  |                   BN_CTX *ctx);  | 
781  |  |  | 
782  |  | /** Computes r = generator * n + q * m  | 
783  |  |  *  \param  group  underlying EC_GROUP object  | 
784  |  |  *  \param  r      EC_POINT object for the result  | 
785  |  |  *  \param  n      BIGNUM with the multiplier for the group generator (optional)  | 
786  |  |  *  \param  q      EC_POINT object with the first factor of the second summand  | 
787  |  |  *  \param  m      BIGNUM with the second factor of the second summand  | 
788  |  |  *  \param  ctx    BN_CTX object (optional)  | 
789  |  |  *  \return 1 on success and 0 if an error occurred  | 
790  |  |  */  | 
791  |  | int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n,  | 
792  |  |                  const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx);  | 
793  |  |  | 
794  |  | /** Stores multiples of generator for faster point multiplication  | 
795  |  |  *  \param  group  EC_GROUP object  | 
796  |  |  *  \param  ctx    BN_CTX object (optional)  | 
797  |  |  *  \return 1 on success and 0 if an error occurred  | 
798  |  |  */  | 
799  |  | int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx);  | 
800  |  |  | 
801  |  | /** Reports whether a precomputation has been done  | 
802  |  |  *  \param  group  EC_GROUP object  | 
803  |  |  *  \return 1 if a pre-computation has been done and 0 otherwise  | 
804  |  |  */  | 
805  |  | int EC_GROUP_have_precompute_mult(const EC_GROUP *group);  | 
806  |  |  | 
807  |  | /********************************************************************/  | 
808  |  | /*                       ASN1 stuff                                 */  | 
809  |  | /********************************************************************/  | 
810  |  |  | 
811  |  | DECLARE_ASN1_ITEM(ECPKPARAMETERS)  | 
812  |  | DECLARE_ASN1_ALLOC_FUNCTIONS(ECPKPARAMETERS)  | 
813  |  | DECLARE_ASN1_ITEM(ECPARAMETERS)  | 
814  |  | DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS)  | 
815  |  |  | 
816  |  | /*  | 
817  |  |  * EC_GROUP_get_basis_type() returns the NID of the basis type used to  | 
818  |  |  * represent the field elements  | 
819  |  |  */  | 
820  |  | int EC_GROUP_get_basis_type(const EC_GROUP *);  | 
821  |  | #  ifndef OPENSSL_NO_EC2M  | 
822  |  | int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k);  | 
823  |  | int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1,  | 
824  |  |                                    unsigned int *k2, unsigned int *k3);  | 
825  |  | #  endif  | 
826  |  |  | 
827  | 3  | #  define OPENSSL_EC_EXPLICIT_CURVE  0x000  | 
828  | 3.22k  | #  define OPENSSL_EC_NAMED_CURVE     0x001  | 
829  |  |  | 
830  |  | EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len);  | 
831  |  | int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out);  | 
832  |  |  | 
833  |  | #  define d2i_ECPKParameters_bio(bp,x) \  | 
834  |  |     ASN1_d2i_bio_of(EC_GROUP, NULL, d2i_ECPKParameters, bp, x)  | 
835  |  | #  define i2d_ECPKParameters_bio(bp,x) \  | 
836  |  |     ASN1_i2d_bio_of(EC_GROUP, i2d_ECPKParameters, bp, x)  | 
837  |  | #  define d2i_ECPKParameters_fp(fp,x) \  | 
838  |  |     (EC_GROUP *)ASN1_d2i_fp(NULL, (char *(*)())d2i_ECPKParameters, (fp), \  | 
839  |  |                             (unsigned char **)(x))  | 
840  |  | #  define i2d_ECPKParameters_fp(fp,x) \  | 
841  |  |     ASN1_i2d_fp(i2d_ECPKParameters,(fp), (unsigned char *)(x))  | 
842  |  |  | 
843  |  | int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off);  | 
844  |  | #  ifndef OPENSSL_NO_STDIO  | 
845  |  | int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off);  | 
846  |  | #  endif  | 
847  |  |  | 
848  |  | /********************************************************************/  | 
849  |  | /*                      EC_KEY functions                            */  | 
850  |  | /********************************************************************/  | 
851  |  |  | 
852  |  | /* some values for the encoding_flag */  | 
853  | 0  | #  define EC_PKEY_NO_PARAMETERS   0x001  | 
854  | 0  | #  define EC_PKEY_NO_PUBKEY       0x002  | 
855  |  |  | 
856  |  | /* some values for the flags field */  | 
857  |  | #  define EC_FLAG_NON_FIPS_ALLOW  0x1  | 
858  |  | #  define EC_FLAG_FIPS_CHECKED    0x2  | 
859  | 0  | #  define EC_FLAG_COFACTOR_ECDH   0x1000  | 
860  |  |  | 
861  |  | /**  | 
862  |  |  *  Creates a new EC_KEY object.  | 
863  |  |  *  \param  ctx  The library context for to use for this EC_KEY. May be NULL in  | 
864  |  |  *               which case the default library context is used.  | 
865  |  |  *  \return EC_KEY object or NULL if an error occurred.  | 
866  |  |  */  | 
867  |  | EC_KEY *EC_KEY_new_ex(OPENSSL_CTX *ctx);  | 
868  |  |  | 
869  |  | /**  | 
870  |  |  *  Creates a new EC_KEY object. Same as calling EC_KEY_new_ex with a NULL  | 
871  |  |  *  library context  | 
872  |  |  *  \return EC_KEY object or NULL if an error occurred.  | 
873  |  |  */  | 
874  |  | EC_KEY *EC_KEY_new(void);  | 
875  |  |  | 
876  |  | int EC_KEY_get_flags(const EC_KEY *key);  | 
877  |  |  | 
878  |  | void EC_KEY_set_flags(EC_KEY *key, int flags);  | 
879  |  |  | 
880  |  | void EC_KEY_clear_flags(EC_KEY *key, int flags);  | 
881  |  |  | 
882  |  | /**  | 
883  |  |  *  Creates a new EC_KEY object using a named curve as underlying  | 
884  |  |  *  EC_GROUP object.  | 
885  |  |  *  \param  ctx  The library context for to use for this EC_KEY. May be NULL in  | 
886  |  |  *               which case the default library context is used.  | 
887  |  |  *  \param  nid  NID of the named curve.  | 
888  |  |  *  \return EC_KEY object or NULL if an error occurred.  | 
889  |  |  */  | 
890  |  | EC_KEY *EC_KEY_new_by_curve_name_ex(OPENSSL_CTX *ctx, int nid);  | 
891  |  |  | 
892  |  | /**  | 
893  |  |  *  Creates a new EC_KEY object using a named curve as underlying  | 
894  |  |  *  EC_GROUP object. Same as calling EC_KEY_new_by_curve_name_ex with a NULL  | 
895  |  |  *  library context.  | 
896  |  |  *  \param  nid  NID of the named curve.  | 
897  |  |  *  \return EC_KEY object or NULL if an error occurred.  | 
898  |  |  */  | 
899  |  | EC_KEY *EC_KEY_new_by_curve_name(int nid);  | 
900  |  |  | 
901  |  |  | 
902  |  | /** Frees a EC_KEY object.  | 
903  |  |  *  \param  key  EC_KEY object to be freed.  | 
904  |  |  */  | 
905  |  | void EC_KEY_free(EC_KEY *key);  | 
906  |  |  | 
907  |  | /** Copies a EC_KEY object.  | 
908  |  |  *  \param  dst  destination EC_KEY object  | 
909  |  |  *  \param  src  src EC_KEY object  | 
910  |  |  *  \return dst or NULL if an error occurred.  | 
911  |  |  */  | 
912  |  | EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src);  | 
913  |  |  | 
914  |  | /** Creates a new EC_KEY object and copies the content from src to it.  | 
915  |  |  *  \param  src  the source EC_KEY object  | 
916  |  |  *  \return newly created EC_KEY object or NULL if an error occurred.  | 
917  |  |  */  | 
918  |  | EC_KEY *EC_KEY_dup(const EC_KEY *src);  | 
919  |  |  | 
920  |  | /** Increases the internal reference count of a EC_KEY object.  | 
921  |  |  *  \param  key  EC_KEY object  | 
922  |  |  *  \return 1 on success and 0 if an error occurred.  | 
923  |  |  */  | 
924  |  | int EC_KEY_up_ref(EC_KEY *key);  | 
925  |  |  | 
926  |  | /** Returns the ENGINE object of a EC_KEY object  | 
927  |  |  *  \param  eckey  EC_KEY object  | 
928  |  |  *  \return the ENGINE object (possibly NULL).  | 
929  |  |  */  | 
930  |  | ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey);  | 
931  |  |  | 
932  |  | /** Returns the EC_GROUP object of a EC_KEY object  | 
933  |  |  *  \param  key  EC_KEY object  | 
934  |  |  *  \return the EC_GROUP object (possibly NULL).  | 
935  |  |  */  | 
936  |  | const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key);  | 
937  |  |  | 
938  |  | /** Sets the EC_GROUP of a EC_KEY object.  | 
939  |  |  *  \param  key    EC_KEY object  | 
940  |  |  *  \param  group  EC_GROUP to use in the EC_KEY object (note: the EC_KEY  | 
941  |  |  *                 object will use an own copy of the EC_GROUP).  | 
942  |  |  *  \return 1 on success and 0 if an error occurred.  | 
943  |  |  */  | 
944  |  | int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group);  | 
945  |  |  | 
946  |  | /** Returns the private key of a EC_KEY object.  | 
947  |  |  *  \param  key  EC_KEY object  | 
948  |  |  *  \return a BIGNUM with the private key (possibly NULL).  | 
949  |  |  */  | 
950  |  | const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key);  | 
951  |  |  | 
952  |  | /** Sets the private key of a EC_KEY object.  | 
953  |  |  *  \param  key  EC_KEY object  | 
954  |  |  *  \param  prv  BIGNUM with the private key (note: the EC_KEY object  | 
955  |  |  *               will use an own copy of the BIGNUM).  | 
956  |  |  *  \return 1 on success and 0 if an error occurred.  | 
957  |  |  */  | 
958  |  | int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv);  | 
959  |  |  | 
960  |  | /** Returns the public key of a EC_KEY object.  | 
961  |  |  *  \param  key  the EC_KEY object  | 
962  |  |  *  \return a EC_POINT object with the public key (possibly NULL)  | 
963  |  |  */  | 
964  |  | const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key);  | 
965  |  |  | 
966  |  | /** Sets the public key of a EC_KEY object.  | 
967  |  |  *  \param  key  EC_KEY object  | 
968  |  |  *  \param  pub  EC_POINT object with the public key (note: the EC_KEY object  | 
969  |  |  *               will use an own copy of the EC_POINT object).  | 
970  |  |  *  \return 1 on success and 0 if an error occurred.  | 
971  |  |  */  | 
972  |  | int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub);  | 
973  |  |  | 
974  |  | unsigned EC_KEY_get_enc_flags(const EC_KEY *key);  | 
975  |  | void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags);  | 
976  |  | point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key);  | 
977  |  | void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform);  | 
978  |  |  | 
979  |  | # define EC_KEY_get_ex_new_index(l, p, newf, dupf, freef) \  | 
980  |  |     CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_EC_KEY, l, p, newf, dupf, freef)  | 
981  |  | int EC_KEY_set_ex_data(EC_KEY *key, int idx, void *arg);  | 
982  |  | void *EC_KEY_get_ex_data(const EC_KEY *key, int idx);  | 
983  |  |  | 
984  |  | /* wrapper functions for the underlying EC_GROUP object */  | 
985  |  | void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag);  | 
986  |  |  | 
987  |  | /** Creates a table of pre-computed multiples of the generator to  | 
988  |  |  *  accelerate further EC_KEY operations.  | 
989  |  |  *  \param  key  EC_KEY object  | 
990  |  |  *  \param  ctx  BN_CTX object (optional)  | 
991  |  |  *  \return 1 on success and 0 if an error occurred.  | 
992  |  |  */  | 
993  |  | int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx);  | 
994  |  |  | 
995  |  | /** Creates a new ec private (and optional a new public) key.  | 
996  |  |  *  \param  key  EC_KEY object  | 
997  |  |  *  \return 1 on success and 0 if an error occurred.  | 
998  |  |  */  | 
999  |  | int EC_KEY_generate_key(EC_KEY *key);  | 
1000  |  |  | 
1001  |  | /** Verifies that a private and/or public key is valid.  | 
1002  |  |  *  \param  key  the EC_KEY object  | 
1003  |  |  *  \return 1 on success and 0 otherwise.  | 
1004  |  |  */  | 
1005  |  | int EC_KEY_check_key(const EC_KEY *key);  | 
1006  |  |  | 
1007  |  | /** Indicates if an EC_KEY can be used for signing.  | 
1008  |  |  *  \param  eckey  the EC_KEY object  | 
1009  |  |  *  \return 1 if can can sign and 0 otherwise.  | 
1010  |  |  */  | 
1011  |  | int EC_KEY_can_sign(const EC_KEY *eckey);  | 
1012  |  |  | 
1013  |  | /** Sets a public key from affine coordinates performing  | 
1014  |  |  *  necessary NIST PKV tests.  | 
1015  |  |  *  \param  key  the EC_KEY object  | 
1016  |  |  *  \param  x    public key x coordinate  | 
1017  |  |  *  \param  y    public key y coordinate  | 
1018  |  |  *  \return 1 on success and 0 otherwise.  | 
1019  |  |  */  | 
1020  |  | int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,  | 
1021  |  |                                              BIGNUM *y);  | 
1022  |  |  | 
1023  |  | /** Encodes an EC_KEY public key to an allocated octet string  | 
1024  |  |  *  \param  key    key to encode  | 
1025  |  |  *  \param  form   point conversion form  | 
1026  |  |  *  \param  pbuf   returns pointer to allocated buffer  | 
1027  |  |  *  \param  ctx    BN_CTX object (optional)  | 
1028  |  |  *  \return the length of the encoded octet string or 0 if an error occurred  | 
1029  |  |  */  | 
1030  |  | size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form,  | 
1031  |  |                       unsigned char **pbuf, BN_CTX *ctx);  | 
1032  |  |  | 
1033  |  | /** Decodes a EC_KEY public key from a octet string  | 
1034  |  |  *  \param  key    key to decode  | 
1035  |  |  *  \param  buf    memory buffer with the encoded ec point  | 
1036  |  |  *  \param  len    length of the encoded ec point  | 
1037  |  |  *  \param  ctx    BN_CTX object (optional)  | 
1038  |  |  *  \return 1 on success and 0 if an error occurred  | 
1039  |  |  */  | 
1040  |  |  | 
1041  |  | int EC_KEY_oct2key(EC_KEY *key, const unsigned char *buf, size_t len,  | 
1042  |  |                    BN_CTX *ctx);  | 
1043  |  |  | 
1044  |  | /** Decodes an EC_KEY private key from an octet string  | 
1045  |  |  *  \param  key    key to decode  | 
1046  |  |  *  \param  buf    memory buffer with the encoded private key  | 
1047  |  |  *  \param  len    length of the encoded key  | 
1048  |  |  *  \return 1 on success and 0 if an error occurred  | 
1049  |  |  */  | 
1050  |  |  | 
1051  |  | int EC_KEY_oct2priv(EC_KEY *key, const unsigned char *buf, size_t len);  | 
1052  |  |  | 
1053  |  | /** Encodes a EC_KEY private key to an octet string  | 
1054  |  |  *  \param  key    key to encode  | 
1055  |  |  *  \param  buf    memory buffer for the result. If NULL the function returns  | 
1056  |  |  *                 required buffer size.  | 
1057  |  |  *  \param  len    length of the memory buffer  | 
1058  |  |  *  \return the length of the encoded octet string or 0 if an error occurred  | 
1059  |  |  */  | 
1060  |  |  | 
1061  |  | size_t EC_KEY_priv2oct(const EC_KEY *key, unsigned char *buf, size_t len);  | 
1062  |  |  | 
1063  |  | /** Encodes an EC_KEY private key to an allocated octet string  | 
1064  |  |  *  \param  eckey  key to encode  | 
1065  |  |  *  \param  pbuf   returns pointer to allocated buffer  | 
1066  |  |  *  \return the length of the encoded octet string or 0 if an error occurred  | 
1067  |  |  */  | 
1068  |  | size_t EC_KEY_priv2buf(const EC_KEY *eckey, unsigned char **pbuf);  | 
1069  |  |  | 
1070  |  | /********************************************************************/  | 
1071  |  | /*        de- and encoding functions for SEC1 ECPrivateKey          */  | 
1072  |  | /********************************************************************/  | 
1073  |  |  | 
1074  |  | /** Decodes a private key from a memory buffer.  | 
1075  |  |  *  \param  key  a pointer to a EC_KEY object which should be used (or NULL)  | 
1076  |  |  *  \param  in   pointer to memory with the DER encoded private key  | 
1077  |  |  *  \param  len  length of the DER encoded private key  | 
1078  |  |  *  \return the decoded private key or NULL if an error occurred.  | 
1079  |  |  */  | 
1080  |  | EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len);  | 
1081  |  |  | 
1082  |  | /** Encodes a private key object and stores the result in a buffer.  | 
1083  |  |  *  \param  key  the EC_KEY object to encode  | 
1084  |  |  *  \param  out  the buffer for the result (if NULL the function returns number  | 
1085  |  |  *               of bytes needed).  | 
1086  |  |  *  \return 1 on success and 0 if an error occurred.  | 
1087  |  |  */  | 
1088  |  | int i2d_ECPrivateKey(const EC_KEY *key, unsigned char **out);  | 
1089  |  |  | 
1090  |  | /********************************************************************/  | 
1091  |  | /*        de- and encoding functions for EC parameters              */  | 
1092  |  | /********************************************************************/  | 
1093  |  |  | 
1094  |  | /** Decodes ec parameter from a memory buffer.  | 
1095  |  |  *  \param  key  a pointer to a EC_KEY object which should be used (or NULL)  | 
1096  |  |  *  \param  in   pointer to memory with the DER encoded ec parameters  | 
1097  |  |  *  \param  len  length of the DER encoded ec parameters  | 
1098  |  |  *  \return a EC_KEY object with the decoded parameters or NULL if an error  | 
1099  |  |  *          occurred.  | 
1100  |  |  */  | 
1101  |  | EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len);  | 
1102  |  |  | 
1103  |  | /** Encodes ec parameter and stores the result in a buffer.  | 
1104  |  |  *  \param  key  the EC_KEY object with ec parameters to encode  | 
1105  |  |  *  \param  out  the buffer for the result (if NULL the function returns number  | 
1106  |  |  *               of bytes needed).  | 
1107  |  |  *  \return 1 on success and 0 if an error occurred.  | 
1108  |  |  */  | 
1109  |  | int i2d_ECParameters(const EC_KEY *key, unsigned char **out);  | 
1110  |  |  | 
1111  |  | /********************************************************************/  | 
1112  |  | /*         de- and encoding functions for EC public key             */  | 
1113  |  | /*         (octet string, not DER -- hence 'o2i' and 'i2o')         */  | 
1114  |  | /********************************************************************/  | 
1115  |  |  | 
1116  |  | /** Decodes a ec public key from a octet string.  | 
1117  |  |  *  \param  key  a pointer to a EC_KEY object which should be used  | 
1118  |  |  *  \param  in   memory buffer with the encoded public key  | 
1119  |  |  *  \param  len  length of the encoded public key  | 
1120  |  |  *  \return EC_KEY object with decoded public key or NULL if an error  | 
1121  |  |  *          occurred.  | 
1122  |  |  */  | 
1123  |  | EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len);  | 
1124  |  |  | 
1125  |  | /** Encodes a ec public key in an octet string.  | 
1126  |  |  *  \param  key  the EC_KEY object with the public key  | 
1127  |  |  *  \param  out  the buffer for the result (if NULL the function returns number  | 
1128  |  |  *               of bytes needed).  | 
1129  |  |  *  \return 1 on success and 0 if an error occurred  | 
1130  |  |  */  | 
1131  |  | int i2o_ECPublicKey(const EC_KEY *key, unsigned char **out);  | 
1132  |  |  | 
1133  |  | /** Prints out the ec parameters on human readable form.  | 
1134  |  |  *  \param  bp   BIO object to which the information is printed  | 
1135  |  |  *  \param  key  EC_KEY object  | 
1136  |  |  *  \return 1 on success and 0 if an error occurred  | 
1137  |  |  */  | 
1138  |  | int ECParameters_print(BIO *bp, const EC_KEY *key);  | 
1139  |  |  | 
1140  |  | /** Prints out the contents of a EC_KEY object  | 
1141  |  |  *  \param  bp   BIO object to which the information is printed  | 
1142  |  |  *  \param  key  EC_KEY object  | 
1143  |  |  *  \param  off  line offset  | 
1144  |  |  *  \return 1 on success and 0 if an error occurred  | 
1145  |  |  */  | 
1146  |  | int EC_KEY_print(BIO *bp, const EC_KEY *key, int off);  | 
1147  |  |  | 
1148  |  | #  ifndef OPENSSL_NO_STDIO  | 
1149  |  | /** Prints out the ec parameters on human readable form.  | 
1150  |  |  *  \param  fp   file descriptor to which the information is printed  | 
1151  |  |  *  \param  key  EC_KEY object  | 
1152  |  |  *  \return 1 on success and 0 if an error occurred  | 
1153  |  |  */  | 
1154  |  | int ECParameters_print_fp(FILE *fp, const EC_KEY *key);  | 
1155  |  |  | 
1156  |  | /** Prints out the contents of a EC_KEY object  | 
1157  |  |  *  \param  fp   file descriptor to which the information is printed  | 
1158  |  |  *  \param  key  EC_KEY object  | 
1159  |  |  *  \param  off  line offset  | 
1160  |  |  *  \return 1 on success and 0 if an error occurred  | 
1161  |  |  */  | 
1162  |  | int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off);  | 
1163  |  |  | 
1164  |  | #  endif  | 
1165  |  |  | 
1166  |  | const EC_KEY_METHOD *EC_KEY_OpenSSL(void);  | 
1167  |  | const EC_KEY_METHOD *EC_KEY_get_default_method(void);  | 
1168  |  | void EC_KEY_set_default_method(const EC_KEY_METHOD *meth);  | 
1169  |  | const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key);  | 
1170  |  | int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth);  | 
1171  |  | EC_KEY *EC_KEY_new_method(ENGINE *engine);  | 
1172  |  |  | 
1173  |  | /** The old name for ecdh_KDF_X9_63  | 
1174  |  |  *  The ECDH KDF specification has been mistakingly attributed to ANSI X9.62,  | 
1175  |  |  *  it is actually specified in ANSI X9.63.  | 
1176  |  |  *  This identifier is retained for backwards compatibility  | 
1177  |  |  */  | 
1178  |  | DEPRECATEDIN_3_0(int ECDH_KDF_X9_62(unsigned char *out, size_t outlen,  | 
1179  |  |                                     const unsigned char *Z, size_t Zlen,  | 
1180  |  |                                     const unsigned char *sinfo, size_t sinfolen,  | 
1181  |  |                                     const EVP_MD *md))  | 
1182  |  |  | 
1183  |  | DEPRECATEDIN_3_0(int ECDH_compute_key(void *out, size_t outlen,  | 
1184  |  |                                       const EC_POINT *pub_key,  | 
1185  |  |                                       const EC_KEY *ecdh,  | 
1186  |  |                                       void *(*KDF)(const void *in, size_t inlen,  | 
1187  |  |                                                    void *out, size_t *outlen)))  | 
1188  |  |  | 
1189  |  | typedef struct ECDSA_SIG_st ECDSA_SIG;  | 
1190  |  |  | 
1191  |  | /** Allocates and initialize a ECDSA_SIG structure  | 
1192  |  |  *  \return pointer to a ECDSA_SIG structure or NULL if an error occurred  | 
1193  |  |  */  | 
1194  |  | ECDSA_SIG *ECDSA_SIG_new(void);  | 
1195  |  |  | 
1196  |  | /** frees a ECDSA_SIG structure  | 
1197  |  |  *  \param  sig  pointer to the ECDSA_SIG structure  | 
1198  |  |  */  | 
1199  |  | void ECDSA_SIG_free(ECDSA_SIG *sig);  | 
1200  |  |  | 
1201  |  | /** i2d_ECDSA_SIG encodes content of ECDSA_SIG (note: this function modifies *pp  | 
1202  |  |  *  (*pp += length of the DER encoded signature)).  | 
1203  |  |  *  \param  sig  pointer to the ECDSA_SIG object  | 
1204  |  |  *  \param  pp   pointer to a unsigned char pointer for the output or NULL  | 
1205  |  |  *  \return the length of the DER encoded ECDSA_SIG object or a negative value  | 
1206  |  |  *          on error  | 
1207  |  |  */  | 
1208  |  | DECLARE_ASN1_ENCODE_FUNCTIONS_only(ECDSA_SIG, ECDSA_SIG)  | 
1209  |  |  | 
1210  |  | /** d2i_ECDSA_SIG decodes an ECDSA signature (note: this function modifies *pp  | 
1211  |  |  *  (*pp += len)).  | 
1212  |  |  *  \param  sig  pointer to ECDSA_SIG pointer (may be NULL)  | 
1213  |  |  *  \param  pp   memory buffer with the DER encoded signature  | 
1214  |  |  *  \param  len  length of the buffer  | 
1215  |  |  *  \return pointer to the decoded ECDSA_SIG structure (or NULL)  | 
1216  |  |  */  | 
1217  |  |  | 
1218  |  | /** Accessor for r and s fields of ECDSA_SIG  | 
1219  |  |  *  \param  sig  pointer to ECDSA_SIG structure  | 
1220  |  |  *  \param  pr   pointer to BIGNUM pointer for r (may be NULL)  | 
1221  |  |  *  \param  ps   pointer to BIGNUM pointer for s (may be NULL)  | 
1222  |  |  */  | 
1223  |  | void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps);  | 
1224  |  |  | 
1225  |  | /** Accessor for r field of ECDSA_SIG  | 
1226  |  |  *  \param  sig  pointer to ECDSA_SIG structure  | 
1227  |  |  */  | 
1228  |  | const BIGNUM *ECDSA_SIG_get0_r(const ECDSA_SIG *sig);  | 
1229  |  |  | 
1230  |  | /** Accessor for s field of ECDSA_SIG  | 
1231  |  |  *  \param  sig  pointer to ECDSA_SIG structure  | 
1232  |  |  */  | 
1233  |  | const BIGNUM *ECDSA_SIG_get0_s(const ECDSA_SIG *sig);  | 
1234  |  |  | 
1235  |  | /** Setter for r and s fields of ECDSA_SIG  | 
1236  |  |  *  \param  sig  pointer to ECDSA_SIG structure  | 
1237  |  |  *  \param  r    pointer to BIGNUM for r (may be NULL)  | 
1238  |  |  *  \param  s    pointer to BIGNUM for s (may be NULL)  | 
1239  |  |  */  | 
1240  |  | int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s);  | 
1241  |  |  | 
1242  |  | /** Computes the ECDSA signature of the given hash value using  | 
1243  |  |  *  the supplied private key and returns the created signature.  | 
1244  |  |  *  \param  dgst      pointer to the hash value  | 
1245  |  |  *  \param  dgst_len  length of the hash value  | 
1246  |  |  *  \param  eckey     EC_KEY object containing a private EC key  | 
1247  |  |  *  \return pointer to a ECDSA_SIG structure or NULL if an error occurred  | 
1248  |  |  */  | 
1249  |  | DEPRECATEDIN_3_0(ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst,  | 
1250  |  |                                           int dgst_len, EC_KEY *eckey))  | 
1251  |  |  | 
1252  |  | /** Computes ECDSA signature of a given hash value using the supplied  | 
1253  |  |  *  private key (note: sig must point to ECDSA_size(eckey) bytes of memory).  | 
1254  |  |  *  \param  dgst     pointer to the hash value to sign  | 
1255  |  |  *  \param  dgstlen  length of the hash value  | 
1256  |  |  *  \param  kinv     BIGNUM with a pre-computed inverse k (optional)  | 
1257  |  |  *  \param  rp       BIGNUM with a pre-computed rp value (optional),  | 
1258  |  |  *                   see ECDSA_sign_setup  | 
1259  |  |  *  \param  eckey    EC_KEY object containing a private EC key  | 
1260  |  |  *  \return pointer to a ECDSA_SIG structure or NULL if an error occurred  | 
1261  |  |  */  | 
1262  |  | DEPRECATEDIN_3_0(ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst,  | 
1263  |  |                                              int dgstlen, const BIGNUM *kinv,  | 
1264  |  |                                              const BIGNUM *rp, EC_KEY *eckey))  | 
1265  |  |  | 
1266  |  | /** Verifies that the supplied signature is a valid ECDSA  | 
1267  |  |  *  signature of the supplied hash value using the supplied public key.  | 
1268  |  |  *  \param  dgst      pointer to the hash value  | 
1269  |  |  *  \param  dgst_len  length of the hash value  | 
1270  |  |  *  \param  sig       ECDSA_SIG structure  | 
1271  |  |  *  \param  eckey     EC_KEY object containing a public EC key  | 
1272  |  |  *  \return 1 if the signature is valid, 0 if the signature is invalid  | 
1273  |  |  *          and -1 on error  | 
1274  |  |  */  | 
1275  |  | DEPRECATEDIN_3_0(int ECDSA_do_verify(const unsigned char *dgst, int dgst_len,  | 
1276  |  |                                      const ECDSA_SIG *sig, EC_KEY *eckey))  | 
1277  |  |  | 
1278  |  | /** Precompute parts of the signing operation  | 
1279  |  |  *  \param  eckey  EC_KEY object containing a private EC key  | 
1280  |  |  *  \param  ctx    BN_CTX object (optional)  | 
1281  |  |  *  \param  kinv   BIGNUM pointer for the inverse of k  | 
1282  |  |  *  \param  rp     BIGNUM pointer for x coordinate of k * generator  | 
1283  |  |  *  \return 1 on success and 0 otherwise  | 
1284  |  |  */  | 
1285  |  | DEPRECATEDIN_3_0(int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx,  | 
1286  |  |                                       BIGNUM **kinv, BIGNUM **rp))  | 
1287  |  |  | 
1288  |  | /** Computes ECDSA signature of a given hash value using the supplied  | 
1289  |  |  *  private key (note: sig must point to ECDSA_size(eckey) bytes of memory).  | 
1290  |  |  *  \param  type     this parameter is ignored  | 
1291  |  |  *  \param  dgst     pointer to the hash value to sign  | 
1292  |  |  *  \param  dgstlen  length of the hash value  | 
1293  |  |  *  \param  sig      memory for the DER encoded created signature  | 
1294  |  |  *  \param  siglen   pointer to the length of the returned signature  | 
1295  |  |  *  \param  eckey    EC_KEY object containing a private EC key  | 
1296  |  |  *  \return 1 on success and 0 otherwise  | 
1297  |  |  */  | 
1298  |  | DEPRECATEDIN_3_0(int ECDSA_sign(int type, const unsigned char *dgst,  | 
1299  |  |                                 int dgstlen, unsigned char *sig,  | 
1300  |  |                                 unsigned int *siglen, EC_KEY *eckey))  | 
1301  |  |  | 
1302  |  | /** Computes ECDSA signature of a given hash value using the supplied  | 
1303  |  |  *  private key (note: sig must point to ECDSA_size(eckey) bytes of memory).  | 
1304  |  |  *  \param  type     this parameter is ignored  | 
1305  |  |  *  \param  dgst     pointer to the hash value to sign  | 
1306  |  |  *  \param  dgstlen  length of the hash value  | 
1307  |  |  *  \param  sig      buffer to hold the DER encoded signature  | 
1308  |  |  *  \param  siglen   pointer to the length of the returned signature  | 
1309  |  |  *  \param  kinv     BIGNUM with a pre-computed inverse k (optional)  | 
1310  |  |  *  \param  rp       BIGNUM with a pre-computed rp value (optional),  | 
1311  |  |  *                   see ECDSA_sign_setup  | 
1312  |  |  *  \param  eckey    EC_KEY object containing a private EC key  | 
1313  |  |  *  \return 1 on success and 0 otherwise  | 
1314  |  |  */  | 
1315  |  | DEPRECATEDIN_3_0(int ECDSA_sign_ex(int type, const unsigned char *dgst,  | 
1316  |  |                                    int dgstlen, unsigned char *sig,  | 
1317  |  |                                    unsigned int *siglen, const BIGNUM *kinv,  | 
1318  |  |                                    const BIGNUM *rp, EC_KEY *eckey))  | 
1319  |  |  | 
1320  |  | /** Verifies that the given signature is valid ECDSA signature  | 
1321  |  |  *  of the supplied hash value using the specified public key.  | 
1322  |  |  *  \param  type     this parameter is ignored  | 
1323  |  |  *  \param  dgst     pointer to the hash value  | 
1324  |  |  *  \param  dgstlen  length of the hash value  | 
1325  |  |  *  \param  sig      pointer to the DER encoded signature  | 
1326  |  |  *  \param  siglen   length of the DER encoded signature  | 
1327  |  |  *  \param  eckey    EC_KEY object containing a public EC key  | 
1328  |  |  *  \return 1 if the signature is valid, 0 if the signature is invalid  | 
1329  |  |  *          and -1 on error  | 
1330  |  |  */  | 
1331  |  | DEPRECATEDIN_3_0(int ECDSA_verify(int type, const unsigned char *dgst,  | 
1332  |  |                                   int dgstlen, const unsigned char *sig,  | 
1333  |  |                                   int siglen, EC_KEY *eckey))  | 
1334  |  |  | 
1335  |  | /** Returns the maximum length of the DER encoded signature  | 
1336  |  |  *  \param  eckey  EC_KEY object  | 
1337  |  |  *  \return numbers of bytes required for the DER encoded signature  | 
1338  |  |  */  | 
1339  |  | DEPRECATEDIN_3_0(int ECDSA_size(const EC_KEY *eckey))  | 
1340  |  |  | 
1341  |  | /********************************************************************/  | 
1342  |  | /*  EC_KEY_METHOD constructors, destructors, writers and accessors  */  | 
1343  |  | /********************************************************************/  | 
1344  |  |  | 
1345  |  | DEPRECATEDIN_3_0(EC_KEY_METHOD *EC_KEY_METHOD_new(const EC_KEY_METHOD *meth))  | 
1346  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_free(EC_KEY_METHOD *meth))  | 
1347  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_set_init  | 
1348  |  |                  (EC_KEY_METHOD *meth,  | 
1349  |  |                   int (*init)(EC_KEY *key),  | 
1350  |  |                   void (*finish)(EC_KEY *key),  | 
1351  |  |                   int (*copy)(EC_KEY *dest, const EC_KEY *src),  | 
1352  |  |                   int (*set_group)(EC_KEY *key, const EC_GROUP *grp),  | 
1353  |  |                   int (*set_private)(EC_KEY *key,  | 
1354  |  |                                      const BIGNUM *priv_key),  | 
1355  |  |                   int (*set_public)(EC_KEY *key,  | 
1356  |  |                                     const EC_POINT *pub_key)))  | 
1357  |  |  | 
1358  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth,  | 
1359  |  |                                                int (*keygen)(EC_KEY *key)))  | 
1360  |  |  | 
1361  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_set_compute_key  | 
1362  |  |                  (EC_KEY_METHOD *meth,  | 
1363  |  |                   int (*ckey)(unsigned char **psec,  | 
1364  |  |                               size_t *pseclen,  | 
1365  |  |                               const EC_POINT *pub_key,  | 
1366  |  |                               const EC_KEY *ecdh)))  | 
1367  |  |  | 
1368  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_set_sign  | 
1369  |  |                  (EC_KEY_METHOD *meth,  | 
1370  |  |                   int (*sign)(int type, const unsigned char *dgst,  | 
1371  |  |                               int dlen, unsigned char *sig,  | 
1372  |  |                               unsigned int *siglen,  | 
1373  |  |                               const BIGNUM *kinv, const BIGNUM *r,  | 
1374  |  |                               EC_KEY *eckey),  | 
1375  |  |                   int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in,  | 
1376  |  |                                     BIGNUM **kinvp, BIGNUM **rp),  | 
1377  |  |                   ECDSA_SIG *(*sign_sig)(const unsigned char *dgst,  | 
1378  |  |                                          int dgst_len,  | 
1379  |  |                                          const BIGNUM *in_kinv,  | 
1380  |  |                                          const BIGNUM *in_r,  | 
1381  |  |                                          EC_KEY *eckey)))  | 
1382  |  |  | 
1383  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_set_verify  | 
1384  |  |                  (EC_KEY_METHOD *meth,  | 
1385  |  |                   int (*verify)(int type, const unsigned  | 
1386  |  |                                 char *dgst, int dgst_len,  | 
1387  |  |                                 const unsigned char *sigbuf,  | 
1388  |  |                                 int sig_len, EC_KEY *eckey),  | 
1389  |  |                   int (*verify_sig)(const unsigned char *dgst,  | 
1390  |  |                                     int dgst_len,  | 
1391  |  |                                     const ECDSA_SIG *sig,  | 
1392  |  |                                     EC_KEY *eckey)))  | 
1393  |  |  | 
1394  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_get_init  | 
1395  |  |                  (const EC_KEY_METHOD *meth,  | 
1396  |  |                   int (**pinit)(EC_KEY *key),  | 
1397  |  |                   void (**pfinish)(EC_KEY *key),  | 
1398  |  |                   int (**pcopy)(EC_KEY *dest, const EC_KEY *src),  | 
1399  |  |                   int (**pset_group)(EC_KEY *key,  | 
1400  |  |                                      const EC_GROUP *grp),  | 
1401  |  |                   int (**pset_private)(EC_KEY *key,  | 
1402  |  |                                        const BIGNUM *priv_key),  | 
1403  |  |                   int (**pset_public)(EC_KEY *key,  | 
1404  |  |                                       const EC_POINT *pub_key)))  | 
1405  |  |  | 
1406  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_get_keygen(const EC_KEY_METHOD *meth,  | 
1407  |  |                                                int (**pkeygen)(EC_KEY *key)))  | 
1408  |  |  | 
1409  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_get_compute_key  | 
1410  |  |                  (const EC_KEY_METHOD *meth,  | 
1411  |  |                   int (**pck)(unsigned char **psec,  | 
1412  |  |                               size_t *pseclen,  | 
1413  |  |                               const EC_POINT *pub_key,  | 
1414  |  |                               const EC_KEY *ecdh)))  | 
1415  |  |  | 
1416  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_get_sign  | 
1417  |  |                  (const EC_KEY_METHOD *meth,  | 
1418  |  |                   int (**psign)(int type, const unsigned char *dgst,  | 
1419  |  |                                 int dlen, unsigned char *sig,  | 
1420  |  |                                 unsigned int *siglen,  | 
1421  |  |                                 const BIGNUM *kinv, const BIGNUM *r,  | 
1422  |  |                                 EC_KEY *eckey),  | 
1423  |  |                   int (**psign_setup)(EC_KEY *eckey, BN_CTX *ctx_in,  | 
1424  |  |                                       BIGNUM **kinvp, BIGNUM **rp),  | 
1425  |  |                   ECDSA_SIG *(**psign_sig)(const unsigned char *dgst,  | 
1426  |  |                                            int dgst_len,  | 
1427  |  |                                            const BIGNUM *in_kinv,  | 
1428  |  |                                            const BIGNUM *in_r,  | 
1429  |  |                                            EC_KEY *eckey)))  | 
1430  |  |  | 
1431  |  | DEPRECATEDIN_3_0(void EC_KEY_METHOD_get_verify  | 
1432  |  |                  (const EC_KEY_METHOD *meth,  | 
1433  |  |                   int (**pverify)(int type, const unsigned  | 
1434  |  |                                   char *dgst, int dgst_len,  | 
1435  |  |                                   const unsigned char *sigbuf,  | 
1436  |  |                                   int sig_len, EC_KEY *eckey),  | 
1437  |  |                   int (**pverify_sig)(const unsigned char *dgst,  | 
1438  |  |                                       int dgst_len,  | 
1439  |  |                                       const ECDSA_SIG *sig,  | 
1440  |  |                                       EC_KEY *eckey)))  | 
1441  |  |  | 
1442  |  | #  define ECParameters_dup(x) ASN1_dup_of(EC_KEY, i2d_ECParameters, \  | 
1443  |  |                                            d2i_ECParameters, x)  | 
1444  |  |  | 
1445  |  | #  ifndef __cplusplus  | 
1446  |  | #   if defined(__SUNPRO_C)  | 
1447  |  | #    if __SUNPRO_C >= 0x520  | 
1448  |  | #     pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)  | 
1449  |  | #    endif  | 
1450  |  | #   endif  | 
1451  |  | #  endif  | 
1452  |  |  | 
1453  |  | #  define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \  | 
1454  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1455  | 0  |                           EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \  | 
1456  | 0  |                           EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL)  | 
1457  |  |  | 
1458  |  | #  define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \  | 
1459  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1460  | 0  |                           EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \  | 
1461  | 0  |                           EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL)  | 
1462  |  |  | 
1463  |  | #  define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \  | 
1464  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1465  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1466  | 0  |                           EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL)  | 
1467  |  |  | 
1468  |  | #  define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \  | 
1469  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1470  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1471  | 0  |                           EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL)  | 
1472  |  |  | 
1473  |  | #  define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \  | 
1474  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1475  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1476  | 0  |                           EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL)  | 
1477  |  |  | 
1478  |  | #  define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \  | 
1479  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1480  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1481  | 0  |                           EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL)  | 
1482  |  |  | 
1483  |  | #  define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \  | 
1484  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1485  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1486  | 0  |                           EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)(md))  | 
1487  |  |  | 
1488  |  | #  define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \  | 
1489  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1490  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1491  | 0  |                           EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)(pmd))  | 
1492  |  |  | 
1493  |  | #  define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \  | 
1494  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1495  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1496  | 0  |                           EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL)  | 
1497  |  |  | 
1498  |  | #  define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \  | 
1499  |  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1500  |  |                           EVP_PKEY_OP_DERIVE, \  | 
1501  |  |                           EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, (void *)(plen))  | 
1502  |  |  | 
1503  |  | #  define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \  | 
1504  | 0  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1505  | 0  |                           EVP_PKEY_OP_DERIVE, \  | 
1506  | 0  |                           EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)(p))  | 
1507  |  |  | 
1508  |  | #  define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \  | 
1509  |  |         EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \  | 
1510  |  |                           EVP_PKEY_OP_DERIVE, \  | 
1511  |  |                           EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)(p))  | 
1512  |  |  | 
1513  |  | /* SM2 will skip the operation check so no need to pass operation here */  | 
1514  |  | #  define EVP_PKEY_CTX_set1_id(ctx, id, id_len) \  | 
1515  | 0  |         EVP_PKEY_CTX_ctrl(ctx, -1, -1, \  | 
1516  | 0  |                           EVP_PKEY_CTRL_SET1_ID, (int)id_len, (void*)(id))  | 
1517  |  | #  define EVP_PKEY_CTX_get1_id(ctx, id) \  | 
1518  |  |         EVP_PKEY_CTX_ctrl(ctx, -1, -1, \  | 
1519  |  |                           EVP_PKEY_CTRL_GET1_ID, 0, (void*)(id))  | 
1520  |  |  | 
1521  |  | #  define EVP_PKEY_CTX_get1_id_len(ctx, id_len) \  | 
1522  |  |         EVP_PKEY_CTX_ctrl(ctx, -1, -1, \  | 
1523  |  |                           EVP_PKEY_CTRL_GET1_ID_LEN, 0, (void*)(id_len))  | 
1524  |  |  | 
1525  | 0  | #  define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID         (EVP_PKEY_ALG_CTRL + 1)  | 
1526  | 0  | #  define EVP_PKEY_CTRL_EC_PARAM_ENC                  (EVP_PKEY_ALG_CTRL + 2)  | 
1527  | 0  | #  define EVP_PKEY_CTRL_EC_ECDH_COFACTOR              (EVP_PKEY_ALG_CTRL + 3)  | 
1528  | 0  | #  define EVP_PKEY_CTRL_EC_KDF_TYPE                   (EVP_PKEY_ALG_CTRL + 4)  | 
1529  | 0  | #  define EVP_PKEY_CTRL_EC_KDF_MD                     (EVP_PKEY_ALG_CTRL + 5)  | 
1530  | 0  | #  define EVP_PKEY_CTRL_GET_EC_KDF_MD                 (EVP_PKEY_ALG_CTRL + 6)  | 
1531  | 0  | #  define EVP_PKEY_CTRL_EC_KDF_OUTLEN                 (EVP_PKEY_ALG_CTRL + 7)  | 
1532  | 0  | #  define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN             (EVP_PKEY_ALG_CTRL + 8)  | 
1533  | 0  | #  define EVP_PKEY_CTRL_EC_KDF_UKM                    (EVP_PKEY_ALG_CTRL + 9)  | 
1534  | 0  | #  define EVP_PKEY_CTRL_GET_EC_KDF_UKM                (EVP_PKEY_ALG_CTRL + 10)  | 
1535  | 0  | #  define EVP_PKEY_CTRL_SET1_ID                       (EVP_PKEY_ALG_CTRL + 11)  | 
1536  | 0  | #  define EVP_PKEY_CTRL_GET1_ID                       (EVP_PKEY_ALG_CTRL + 12)  | 
1537  | 0  | #  define EVP_PKEY_CTRL_GET1_ID_LEN                   (EVP_PKEY_ALG_CTRL + 13)  | 
1538  |  |  | 
1539  |  | /* KDF types */  | 
1540  | 0  | #  define EVP_PKEY_ECDH_KDF_NONE                      1  | 
1541  | 0  | #  define EVP_PKEY_ECDH_KDF_X9_63                     2  | 
1542  |  | /** The old name for EVP_PKEY_ECDH_KDF_X9_63  | 
1543  |  |  *  The ECDH KDF specification has been mistakingly attributed to ANSI X9.62,  | 
1544  |  |  *  it is actually specified in ANSI X9.63.  | 
1545  |  |  *  This identifier is retained for backwards compatibility  | 
1546  |  |  */  | 
1547  |  | #  define EVP_PKEY_ECDH_KDF_X9_62   EVP_PKEY_ECDH_KDF_X9_63  | 
1548  |  |  | 
1549  |  | #  ifdef  __cplusplus  | 
1550  |  | }  | 
1551  |  | #  endif  | 
1552  |  | # endif  | 
1553  |  | #endif  |