Add pairwise consistency self tests to asym keygenerators
[oweals/openssl.git] / crypto / ec / ec_key.c
1 /*
2  * Copyright 2002-2020 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 /*
12  * ECDSA low level APIs are deprecated for public use, but still ok for
13  * internal use.
14  */
15 #include "internal/deprecated.h"
16
17 #include "internal/cryptlib.h"
18 #include <string.h>
19 #include "ec_local.h"
20 #include "internal/refcount.h"
21 #include <openssl/err.h>
22 #include <openssl/engine.h>
23 #include <openssl/self_test.h>
24 #include "crypto/bn.h"
25
26 static int ecdsa_keygen_pairwise_test(EC_KEY *eckey, OSSL_CALLBACK *cb,
27                                       void *cbarg);
28
29 #ifndef FIPS_MODE
30 EC_KEY *EC_KEY_new(void)
31 {
32     return ec_key_new_method_int(NULL, NULL);
33 }
34 #endif
35
36 EC_KEY *EC_KEY_new_ex(OPENSSL_CTX *ctx)
37 {
38     return ec_key_new_method_int(ctx, NULL);
39 }
40
41 EC_KEY *EC_KEY_new_by_curve_name_ex(OPENSSL_CTX *ctx, int nid)
42 {
43     EC_KEY *ret = EC_KEY_new_ex(ctx);
44     if (ret == NULL)
45         return NULL;
46     ret->group = EC_GROUP_new_by_curve_name_ex(ctx, nid);
47     if (ret->group == NULL) {
48         EC_KEY_free(ret);
49         return NULL;
50     }
51     if (ret->meth->set_group != NULL
52         && ret->meth->set_group(ret, ret->group) == 0) {
53         EC_KEY_free(ret);
54         return NULL;
55     }
56     return ret;
57 }
58
59 #ifndef FIPS_MODE
60 EC_KEY *EC_KEY_new_by_curve_name(int nid)
61 {
62     return EC_KEY_new_by_curve_name_ex(NULL, nid);
63 }
64 #endif
65
66 void EC_KEY_free(EC_KEY *r)
67 {
68     int i;
69
70     if (r == NULL)
71         return;
72
73     CRYPTO_DOWN_REF(&r->references, &i, r->lock);
74     REF_PRINT_COUNT("EC_KEY", r);
75     if (i > 0)
76         return;
77     REF_ASSERT_ISNT(i < 0);
78
79     if (r->meth != NULL && r->meth->finish != NULL)
80         r->meth->finish(r);
81
82 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
83     ENGINE_finish(r->engine);
84 #endif
85
86     if (r->group && r->group->meth->keyfinish)
87         r->group->meth->keyfinish(r);
88
89 #ifndef FIPS_MODE
90     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EC_KEY, r, &r->ex_data);
91 #endif
92     CRYPTO_THREAD_lock_free(r->lock);
93     EC_GROUP_free(r->group);
94     EC_POINT_free(r->pub_key);
95     BN_clear_free(r->priv_key);
96
97     OPENSSL_clear_free((void *)r, sizeof(EC_KEY));
98 }
99
100 EC_KEY *EC_KEY_copy(EC_KEY *dest, const EC_KEY *src)
101 {
102     if (dest == NULL || src == NULL) {
103         ECerr(EC_F_EC_KEY_COPY, ERR_R_PASSED_NULL_PARAMETER);
104         return NULL;
105     }
106     if (src->meth != dest->meth) {
107         if (dest->meth->finish != NULL)
108             dest->meth->finish(dest);
109         if (dest->group && dest->group->meth->keyfinish)
110             dest->group->meth->keyfinish(dest);
111 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
112         if (ENGINE_finish(dest->engine) == 0)
113             return 0;
114         dest->engine = NULL;
115 #endif
116     }
117     dest->libctx = src->libctx;
118     /* copy the parameters */
119     if (src->group != NULL) {
120         const EC_METHOD *meth = EC_GROUP_method_of(src->group);
121         /* clear the old group */
122         EC_GROUP_free(dest->group);
123         dest->group = EC_GROUP_new_ex(src->libctx, meth);
124         if (dest->group == NULL)
125             return NULL;
126         if (!EC_GROUP_copy(dest->group, src->group))
127             return NULL;
128
129         /*  copy the public key */
130         if (src->pub_key != NULL) {
131             EC_POINT_free(dest->pub_key);
132             dest->pub_key = EC_POINT_new(src->group);
133             if (dest->pub_key == NULL)
134                 return NULL;
135             if (!EC_POINT_copy(dest->pub_key, src->pub_key))
136                 return NULL;
137         }
138         /* copy the private key */
139         if (src->priv_key != NULL) {
140             if (dest->priv_key == NULL) {
141                 dest->priv_key = BN_new();
142                 if (dest->priv_key == NULL)
143                     return NULL;
144             }
145             if (!BN_copy(dest->priv_key, src->priv_key))
146                 return NULL;
147             if (src->group->meth->keycopy
148                 && src->group->meth->keycopy(dest, src) == 0)
149                 return NULL;
150         }
151     }
152
153
154     /* copy the rest */
155     dest->enc_flag = src->enc_flag;
156     dest->conv_form = src->conv_form;
157     dest->version = src->version;
158     dest->flags = src->flags;
159 #ifndef FIPS_MODE
160     if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_EC_KEY,
161                             &dest->ex_data, &src->ex_data))
162         return NULL;
163 #endif
164
165     if (src->meth != dest->meth) {
166 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
167         if (src->engine != NULL && ENGINE_init(src->engine) == 0)
168             return NULL;
169         dest->engine = src->engine;
170 #endif
171         dest->meth = src->meth;
172     }
173
174     if (src->meth->copy != NULL && src->meth->copy(dest, src) == 0)
175         return NULL;
176
177     dest->dirty_cnt++;
178
179     return dest;
180 }
181
182 EC_KEY *EC_KEY_dup(const EC_KEY *ec_key)
183 {
184     EC_KEY *ret = ec_key_new_method_int(ec_key->libctx, ec_key->engine);
185
186     if (ret == NULL)
187         return NULL;
188
189     if (EC_KEY_copy(ret, ec_key) == NULL) {
190         EC_KEY_free(ret);
191         return NULL;
192     }
193     return ret;
194 }
195
196 int EC_KEY_up_ref(EC_KEY *r)
197 {
198     int i;
199
200     if (CRYPTO_UP_REF(&r->references, &i, r->lock) <= 0)
201         return 0;
202
203     REF_PRINT_COUNT("EC_KEY", r);
204     REF_ASSERT_ISNT(i < 2);
205     return ((i > 1) ? 1 : 0);
206 }
207
208 ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey)
209 {
210     return eckey->engine;
211 }
212
213 int EC_KEY_generate_key(EC_KEY *eckey)
214 {
215     if (eckey == NULL || eckey->group == NULL) {
216         ECerr(EC_F_EC_KEY_GENERATE_KEY, ERR_R_PASSED_NULL_PARAMETER);
217         return 0;
218     }
219     if (eckey->meth->keygen != NULL) {
220         int ret;
221
222         ret = eckey->meth->keygen(eckey);
223         if (ret == 1)
224             eckey->dirty_cnt++;
225
226         return ret;
227     }
228     ECerr(EC_F_EC_KEY_GENERATE_KEY, EC_R_OPERATION_NOT_SUPPORTED);
229     return 0;
230 }
231
232 int ossl_ec_key_gen(EC_KEY *eckey)
233 {
234     int ret;
235
236     ret = eckey->group->meth->keygen(eckey);
237
238     if (ret == 1)
239         eckey->dirty_cnt++;
240     return ret;
241 }
242
243 /*
244  * ECC Key generation.
245  * See SP800-56AR3 5.6.1.2.2 "Key Pair Generation by Testing Candidates"
246  *
247  * Params:
248  *     libctx A context containing an optional self test callback.
249  *     eckey An EC key object that contains domain params. The generated keypair
250  *           is stored in this object.
251  *     pairwise_test Set to non zero to perform a pairwise test. If the test
252  *                   fails then the keypair is not generated,
253  * Returns 1 if the keypair was generated or 0 otherwise.
254  */
255 int ec_generate_key(OPENSSL_CTX *libctx, EC_KEY *eckey, int pairwise_test)
256 {
257     int ok = 0;
258     BIGNUM *priv_key = NULL;
259     const BIGNUM *order = NULL;
260     EC_POINT *pub_key = NULL;
261     const EC_GROUP *group = eckey->group;
262     BN_CTX *ctx = BN_CTX_secure_new_ex(eckey->libctx);
263
264     if (ctx == NULL)
265         goto err;
266
267     if (eckey->priv_key == NULL) {
268         priv_key = BN_secure_new();
269         if (priv_key == NULL)
270             goto err;
271     } else
272         priv_key = eckey->priv_key;
273
274     /*
275      * Steps (1-2): Check domain parameters and security strength.
276      * These steps must be done by the user. This would need to be
277      * stated in the security policy.
278      */
279
280     order = EC_GROUP_get0_order(group);
281     if (order == NULL)
282         goto err;
283
284     /*
285      * Steps (3-7): priv_key = DRBG_RAND(order_n_bits) (range [1, n-1]).
286      * Although this is slightly different from the standard, it is effectively
287      * equivalent as it gives an unbiased result ranging from 1..n-1. It is also
288      * faster as the standard needs to retry more often. Also doing
289      * 1 + rand[0..n-2] would effect the way that tests feed dummy entropy into
290      * rand so the simpler backward compatible method has been used here.
291      */
292     do
293         if (!BN_priv_rand_range_ex(priv_key, order, ctx))
294             goto err;
295     while (BN_is_zero(priv_key)) ;
296
297     if (eckey->pub_key == NULL) {
298         pub_key = EC_POINT_new(group);
299         if (pub_key == NULL)
300             goto err;
301     } else
302         pub_key = eckey->pub_key;
303
304     /* Step (8) : pub_key = priv_key * G (where G is a point on the curve) */
305     if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx))
306         goto err;
307
308     eckey->priv_key = priv_key;
309     eckey->pub_key = pub_key;
310     priv_key = NULL;
311     pub_key = NULL;
312
313     eckey->dirty_cnt++;
314
315 #ifdef FIPS_MODE
316     pairwise_test = 1;
317 #endif /* FIPS_MODE */
318
319     ok = 1;
320     if (pairwise_test) {
321         OSSL_CALLBACK *cb = NULL;
322         void *cbarg = NULL;
323
324         OSSL_SELF_TEST_get_callback(libctx, &cb, &cbarg);
325         ok = ecdsa_keygen_pairwise_test(eckey, cb, cbarg);
326     }
327 err:
328     /* Step (9): If there is an error return an invalid keypair. */
329     if (!ok) {
330         BN_clear(eckey->priv_key);
331         if (eckey->pub_key != NULL)
332             EC_POINT_set_to_infinity(group, eckey->pub_key);
333     }
334
335     EC_POINT_free(pub_key);
336     BN_clear_free(priv_key);
337     BN_CTX_free(ctx);
338     return ok;
339 }
340
341 int ec_key_simple_generate_key(EC_KEY *eckey)
342 {
343     return ec_generate_key(NULL, eckey, 0);
344 }
345
346 int ec_key_simple_generate_public_key(EC_KEY *eckey)
347 {
348     int ret;
349
350     /*
351      * See SP800-56AR3 5.6.1.2.2: Step (8)
352      * pub_key = priv_key * G (where G is a point on the curve)
353      */
354     ret = EC_POINT_mul(eckey->group, eckey->pub_key, eckey->priv_key, NULL,
355                        NULL, NULL);
356
357     if (ret == 1)
358         eckey->dirty_cnt++;
359
360     return ret;
361 }
362
363 int EC_KEY_check_key(const EC_KEY *eckey)
364 {
365     if (eckey == NULL || eckey->group == NULL || eckey->pub_key == NULL) {
366         ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_PASSED_NULL_PARAMETER);
367         return 0;
368     }
369
370     if (eckey->group->meth->keycheck == NULL) {
371         ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
372         return 0;
373     }
374
375     return eckey->group->meth->keycheck(eckey);
376 }
377
378 /*
379  * Check the range of the EC public key.
380  * See SP800-56A R3 Section 5.6.2.3.3 (Part 2)
381  * i.e.
382  *  - If q = odd prime p: Verify that xQ and yQ are integers in the
383  *    interval[0, p - 1], OR
384  *  - If q = 2m: Verify that xQ and yQ are bit strings of length m bits.
385  * Returns 1 if the public key has a valid range, otherwise it returns 0.
386  */
387 static int ec_key_public_range_check(BN_CTX *ctx, const EC_KEY *key)
388 {
389     int ret = 0;
390     BIGNUM *x, *y;
391
392     BN_CTX_start(ctx);
393     x = BN_CTX_get(ctx);
394     y = BN_CTX_get(ctx);
395     if (y == NULL)
396         goto err;
397
398     if (!EC_POINT_get_affine_coordinates(key->group, key->pub_key, x, y, ctx))
399         goto err;
400
401     if (EC_METHOD_get_field_type(key->group->meth) == NID_X9_62_prime_field) {
402         if (BN_is_negative(x)
403             || BN_cmp(x, key->group->field) >= 0
404             || BN_is_negative(y)
405             || BN_cmp(y, key->group->field) >= 0) {
406             goto err;
407         }
408     } else {
409         int m = EC_GROUP_get_degree(key->group);
410         if (BN_num_bits(x) > m || BN_num_bits(y) > m) {
411             goto err;
412         }
413     }
414     ret = 1;
415 err:
416     BN_CTX_end(ctx);
417     return ret;
418 }
419
420 /*
421  * ECC Key validation as specified in SP800-56A R3.
422  *    Section 5.6.2.3.3 ECC Full Public-Key Validation
423  *    Section 5.6.2.1.2 Owner Assurance of Private-Key Validity
424  *    Section 5.6.2.1.4 Owner Assurance of Pair-wise Consistency
425  * NOTES:
426  *    Before calling this method in fips mode, there should be an assurance that
427  *    an approved elliptic-curve group is used.
428  * Returns 1 if the key is valid, otherwise it returns 0.
429  */
430 int ec_key_simple_check_key(const EC_KEY *eckey)
431 {
432     int ok = 0;
433     BN_CTX *ctx = NULL;
434     const BIGNUM *order = NULL;
435     EC_POINT *point = NULL;
436
437     if (eckey == NULL || eckey->group == NULL || eckey->pub_key == NULL) {
438         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, ERR_R_PASSED_NULL_PARAMETER);
439         return 0;
440     }
441
442     /* 5.6.2.3.3 (Step 1): Q != infinity */
443     if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key)) {
444         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_POINT_AT_INFINITY);
445         goto err;
446     }
447
448     if ((ctx = BN_CTX_new_ex(eckey->libctx)) == NULL)
449         goto err;
450
451     if ((point = EC_POINT_new(eckey->group)) == NULL)
452         goto err;
453
454     /* 5.6.2.3.3 (Step 2) Test if the public key is in range */
455     if (!ec_key_public_range_check(ctx, eckey)) {
456         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_COORDINATES_OUT_OF_RANGE);
457         goto err;
458     }
459
460     /* 5.6.2.3.3 (Step 3) is the pub_key on the elliptic curve */
461     if (EC_POINT_is_on_curve(eckey->group, eckey->pub_key, ctx) <= 0) {
462         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_POINT_IS_NOT_ON_CURVE);
463         goto err;
464     }
465
466     order = eckey->group->order;
467     if (BN_is_zero(order)) {
468         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_INVALID_GROUP_ORDER);
469         goto err;
470     }
471     /* 5.6.2.3.3 (Step 4) : pub_key * order is the point at infinity. */
472     if (!EC_POINT_mul(eckey->group, point, NULL, eckey->pub_key, order, ctx)) {
473         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, ERR_R_EC_LIB);
474         goto err;
475     }
476     if (!EC_POINT_is_at_infinity(eckey->group, point)) {
477         ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_WRONG_ORDER);
478         goto err;
479     }
480
481     if (eckey->priv_key != NULL) {
482         /*
483          * 5.6.2.1.2 Owner Assurance of Private-Key Validity
484          * The private key is in the range [1, order-1]
485          */
486         if (BN_cmp(eckey->priv_key, BN_value_one()) < 0
487                 || BN_cmp(eckey->priv_key, order) >= 0) {
488             ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_WRONG_ORDER);
489             goto err;
490         }
491         /*
492          * Section 5.6.2.1.4 Owner Assurance of Pair-wise Consistency (b)
493          * Check if generator * priv_key = pub_key
494          */
495         if (!EC_POINT_mul(eckey->group, point, eckey->priv_key,
496                           NULL, NULL, ctx)) {
497             ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, ERR_R_EC_LIB);
498             goto err;
499         }
500         if (EC_POINT_cmp(eckey->group, point, eckey->pub_key, ctx) != 0) {
501             ECerr(EC_F_EC_KEY_SIMPLE_CHECK_KEY, EC_R_INVALID_PRIVATE_KEY);
502             goto err;
503         }
504     }
505     ok = 1;
506  err:
507     BN_CTX_free(ctx);
508     EC_POINT_free(point);
509     return ok;
510 }
511
512 int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
513                                              BIGNUM *y)
514 {
515     BN_CTX *ctx = NULL;
516     BIGNUM *tx, *ty;
517     EC_POINT *point = NULL;
518     int ok = 0;
519
520     if (key == NULL || key->group == NULL || x == NULL || y == NULL) {
521         ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES,
522               ERR_R_PASSED_NULL_PARAMETER);
523         return 0;
524     }
525     ctx = BN_CTX_new_ex(key->libctx);
526     if (ctx == NULL)
527         return 0;
528
529     BN_CTX_start(ctx);
530     point = EC_POINT_new(key->group);
531
532     if (point == NULL)
533         goto err;
534
535     tx = BN_CTX_get(ctx);
536     ty = BN_CTX_get(ctx);
537     if (ty == NULL)
538         goto err;
539
540     if (!EC_POINT_set_affine_coordinates(key->group, point, x, y, ctx))
541         goto err;
542     if (!EC_POINT_get_affine_coordinates(key->group, point, tx, ty, ctx))
543         goto err;
544
545     /*
546      * Check if retrieved coordinates match originals. The range check is done
547      * inside EC_KEY_check_key().
548      */
549     if (BN_cmp(x, tx) || BN_cmp(y, ty)) {
550         ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES,
551               EC_R_COORDINATES_OUT_OF_RANGE);
552         goto err;
553     }
554
555     /* EC_KEY_set_public_key updates dirty_cnt */
556     if (!EC_KEY_set_public_key(key, point))
557         goto err;
558
559     if (EC_KEY_check_key(key) == 0)
560         goto err;
561
562     ok = 1;
563
564  err:
565     BN_CTX_end(ctx);
566     BN_CTX_free(ctx);
567     EC_POINT_free(point);
568     return ok;
569
570 }
571
572 const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key)
573 {
574     return key->group;
575 }
576
577 int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group)
578 {
579     if (key->meth->set_group != NULL && key->meth->set_group(key, group) == 0)
580         return 0;
581     EC_GROUP_free(key->group);
582     key->group = EC_GROUP_dup(group);
583     key->dirty_cnt++;
584     return (key->group == NULL) ? 0 : 1;
585 }
586
587 const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key)
588 {
589     return key->priv_key;
590 }
591
592 int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *priv_key)
593 {
594     int fixed_top;
595     const BIGNUM *order = NULL;
596     BIGNUM *tmp_key = NULL;
597
598     if (key->group == NULL || key->group->meth == NULL)
599         return 0;
600
601     /*
602      * Not only should key->group be set, but it should also be in a valid
603      * fully initialized state.
604      *
605      * Specifically, to operate in constant time, we need that the group order
606      * is set, as we use its length as the fixed public size of any scalar used
607      * as an EC private key.
608      */
609     order = EC_GROUP_get0_order(key->group);
610     if (order == NULL || BN_is_zero(order))
611         return 0; /* This should never happen */
612
613     if (key->group->meth->set_private != NULL
614         && key->group->meth->set_private(key, priv_key) == 0)
615         return 0;
616     if (key->meth->set_private != NULL
617         && key->meth->set_private(key, priv_key) == 0)
618         return 0;
619
620     /*
621      * We should never leak the bit length of the secret scalar in the key,
622      * so we always set the `BN_FLG_CONSTTIME` flag on the internal `BIGNUM`
623      * holding the secret scalar.
624      *
625      * This is important also because `BN_dup()` (and `BN_copy()`) do not
626      * propagate the `BN_FLG_CONSTTIME` flag from the source `BIGNUM`, and
627      * this brings an extra risk of inadvertently losing the flag, even when
628      * the called specifically set it.
629      *
630      * The propagation has been turned on and off a few times in the past
631      * years because in some conditions has shown unintended consequences in
632      * some code paths, so at the moment we can't fix this in the BN layer.
633      *
634      * In `EC_KEY_set_private_key()` we can work around the propagation by
635      * manually setting the flag after `BN_dup()` as we know for sure that
636      * inside the EC module the `BN_FLG_CONSTTIME` is always treated
637      * correctly and should not generate unintended consequences.
638      *
639      * Setting the BN_FLG_CONSTTIME flag alone is never enough, we also have
640      * to preallocate the BIGNUM internal buffer to a fixed public size big
641      * enough that operations performed during the processing never trigger
642      * a realloc which would leak the size of the scalar through memory
643      * accesses.
644      *
645      * Fixed Length
646      * ------------
647      *
648      * The order of the large prime subgroup of the curve is our choice for
649      * a fixed public size, as that is generally the upper bound for
650      * generating a private key in EC cryptosystems and should fit all valid
651      * secret scalars.
652      *
653      * For preallocating the BIGNUM storage we look at the number of "words"
654      * required for the internal representation of the order, and we
655      * preallocate 2 extra "words" in case any of the subsequent processing
656      * might temporarily overflow the order length.
657      */
658     tmp_key = BN_dup(priv_key);
659     if (tmp_key == NULL)
660         return 0;
661
662     BN_set_flags(tmp_key, BN_FLG_CONSTTIME);
663
664     fixed_top = bn_get_top(order) + 2;
665     if (bn_wexpand(tmp_key, fixed_top) == NULL) {
666         BN_clear_free(tmp_key);
667         return 0;
668     }
669
670     BN_clear_free(key->priv_key);
671     key->priv_key = tmp_key;
672     key->dirty_cnt++;
673
674     return 1;
675 }
676
677 const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key)
678 {
679     return key->pub_key;
680 }
681
682 int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub_key)
683 {
684     if (key->meth->set_public != NULL
685         && key->meth->set_public(key, pub_key) == 0)
686         return 0;
687     EC_POINT_free(key->pub_key);
688     key->pub_key = EC_POINT_dup(pub_key, key->group);
689     key->dirty_cnt++;
690     return (key->pub_key == NULL) ? 0 : 1;
691 }
692
693 unsigned int EC_KEY_get_enc_flags(const EC_KEY *key)
694 {
695     return key->enc_flag;
696 }
697
698 void EC_KEY_set_enc_flags(EC_KEY *key, unsigned int flags)
699 {
700     key->enc_flag = flags;
701 }
702
703 point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key)
704 {
705     return key->conv_form;
706 }
707
708 void EC_KEY_set_conv_form(EC_KEY *key, point_conversion_form_t cform)
709 {
710     key->conv_form = cform;
711     if (key->group != NULL)
712         EC_GROUP_set_point_conversion_form(key->group, cform);
713 }
714
715 void EC_KEY_set_asn1_flag(EC_KEY *key, int flag)
716 {
717     if (key->group != NULL)
718         EC_GROUP_set_asn1_flag(key->group, flag);
719 }
720
721 int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx)
722 {
723     if (key->group == NULL)
724         return 0;
725     return EC_GROUP_precompute_mult(key->group, ctx);
726 }
727
728 int EC_KEY_get_flags(const EC_KEY *key)
729 {
730     return key->flags;
731 }
732
733 void EC_KEY_set_flags(EC_KEY *key, int flags)
734 {
735     key->flags |= flags;
736     key->dirty_cnt++;
737 }
738
739 void EC_KEY_clear_flags(EC_KEY *key, int flags)
740 {
741     key->flags &= ~flags;
742     key->dirty_cnt++;
743 }
744
745 size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form,
746                         unsigned char **pbuf, BN_CTX *ctx)
747 {
748     if (key == NULL || key->pub_key == NULL || key->group == NULL)
749         return 0;
750     return EC_POINT_point2buf(key->group, key->pub_key, form, pbuf, ctx);
751 }
752
753 int EC_KEY_oct2key(EC_KEY *key, const unsigned char *buf, size_t len,
754                    BN_CTX *ctx)
755 {
756     if (key == NULL || key->group == NULL)
757         return 0;
758     if (key->pub_key == NULL)
759         key->pub_key = EC_POINT_new(key->group);
760     if (key->pub_key == NULL)
761         return 0;
762     if (EC_POINT_oct2point(key->group, key->pub_key, buf, len, ctx) == 0)
763         return 0;
764     key->dirty_cnt++;
765     /*
766      * Save the point conversion form.
767      * For non-custom curves the first octet of the buffer (excluding
768      * the last significant bit) contains the point conversion form.
769      * EC_POINT_oct2point() has already performed sanity checking of
770      * the buffer so we know it is valid.
771      */
772     if ((key->group->meth->flags & EC_FLAGS_CUSTOM_CURVE) == 0)
773         key->conv_form = (point_conversion_form_t)(buf[0] & ~0x01);
774     return 1;
775 }
776
777 size_t EC_KEY_priv2oct(const EC_KEY *eckey,
778                        unsigned char *buf, size_t len)
779 {
780     if (eckey->group == NULL || eckey->group->meth == NULL)
781         return 0;
782     if (eckey->group->meth->priv2oct == NULL) {
783         ECerr(EC_F_EC_KEY_PRIV2OCT, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
784         return 0;
785     }
786
787     return eckey->group->meth->priv2oct(eckey, buf, len);
788 }
789
790 size_t ec_key_simple_priv2oct(const EC_KEY *eckey,
791                               unsigned char *buf, size_t len)
792 {
793     size_t buf_len;
794
795     buf_len = (EC_GROUP_order_bits(eckey->group) + 7) / 8;
796     if (eckey->priv_key == NULL)
797         return 0;
798     if (buf == NULL)
799         return buf_len;
800     else if (len < buf_len)
801         return 0;
802
803     /* Octetstring may need leading zeros if BN is to short */
804
805     if (BN_bn2binpad(eckey->priv_key, buf, buf_len) == -1) {
806         ECerr(EC_F_EC_KEY_SIMPLE_PRIV2OCT, EC_R_BUFFER_TOO_SMALL);
807         return 0;
808     }
809
810     return buf_len;
811 }
812
813 int EC_KEY_oct2priv(EC_KEY *eckey, const unsigned char *buf, size_t len)
814 {
815     int ret;
816
817     if (eckey->group == NULL || eckey->group->meth == NULL)
818         return 0;
819     if (eckey->group->meth->oct2priv == NULL) {
820         ECerr(EC_F_EC_KEY_OCT2PRIV, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
821         return 0;
822     }
823     ret = eckey->group->meth->oct2priv(eckey, buf, len);
824     if (ret == 1)
825         eckey->dirty_cnt++;
826     return ret;
827 }
828
829 int ec_key_simple_oct2priv(EC_KEY *eckey, const unsigned char *buf, size_t len)
830 {
831     if (eckey->priv_key == NULL)
832         eckey->priv_key = BN_secure_new();
833     if (eckey->priv_key == NULL) {
834         ECerr(EC_F_EC_KEY_SIMPLE_OCT2PRIV, ERR_R_MALLOC_FAILURE);
835         return 0;
836     }
837     eckey->priv_key = BN_bin2bn(buf, len, eckey->priv_key);
838     if (eckey->priv_key == NULL) {
839         ECerr(EC_F_EC_KEY_SIMPLE_OCT2PRIV, ERR_R_BN_LIB);
840         return 0;
841     }
842     eckey->dirty_cnt++;
843     return 1;
844 }
845
846 size_t EC_KEY_priv2buf(const EC_KEY *eckey, unsigned char **pbuf)
847 {
848     size_t len;
849     unsigned char *buf;
850
851     len = EC_KEY_priv2oct(eckey, NULL, 0);
852     if (len == 0)
853         return 0;
854     if ((buf = OPENSSL_malloc(len)) == NULL) {
855         ECerr(EC_F_EC_KEY_PRIV2BUF, ERR_R_MALLOC_FAILURE);
856         return 0;
857     }
858     len = EC_KEY_priv2oct(eckey, buf, len);
859     if (len == 0) {
860         OPENSSL_free(buf);
861         return 0;
862     }
863     *pbuf = buf;
864     return len;
865 }
866
867 int EC_KEY_can_sign(const EC_KEY *eckey)
868 {
869     if (eckey->group == NULL || eckey->group->meth == NULL
870         || (eckey->group->meth->flags & EC_FLAGS_NO_SIGN))
871         return 0;
872     return 1;
873 }
874
875 /*
876  * FIPS 140-2 IG 9.9 AS09.33
877  * Perform a sign/verify operation.
878  *
879  * NOTE: When generating keys for key-agreement schemes - FIPS 140-2 IG 9.9
880  * states that no additional pairwise tests are required (apart from the tests
881  * specified in SP800-56A) when generating keys. Hence pairwise ECDH tests are
882  * omitted here.
883  */
884 static int ecdsa_keygen_pairwise_test(EC_KEY *eckey, OSSL_CALLBACK *cb,
885                                       void *cbarg)
886 {
887     int ret = 0;
888     unsigned char dgst[16] = {0};
889     int dgst_len = (int)sizeof(dgst);
890     ECDSA_SIG *sig = NULL;
891     OSSL_SELF_TEST *st = NULL;
892
893     st = OSSL_SELF_TEST_new(cb, cbarg);
894     if (st == NULL)
895         return 0;
896
897     OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_PCT,
898                            OSSL_SELF_TEST_DESC_PCT_ECDSA);
899
900     sig = ECDSA_do_sign(dgst, dgst_len, eckey);
901     if (sig == NULL)
902         goto err;
903
904     OSSL_SELF_TEST_oncorrupt_byte(st, dgst);
905
906     if (ECDSA_do_verify(dgst, dgst_len, sig, eckey) != 1)
907         goto err;
908
909     ret = 1;
910 err:
911     OSSL_SELF_TEST_onend(st, ret);
912     OSSL_SELF_TEST_free(st);
913     ECDSA_SIG_free(sig);
914     return ret;
915 }