Coverage Report

Created: 2023-05-05 14:19

/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