Run the withlibctx.pl script
[openssl.git] / crypto / evp / p_lib.c
1 /*
2  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 /*
11  * DSA low level APIs are deprecated for public use, but still ok for
12  * internal use.
13  */
14 #include "internal/deprecated.h"
15
16 #include <stdio.h>
17 #include "internal/cryptlib.h"
18 #include "internal/refcount.h"
19 #include <openssl/bn.h>
20 #include <openssl/err.h>
21 #include <openssl/objects.h>
22 #include <openssl/evp.h>
23 #include <openssl/x509.h>
24 #include <openssl/rsa.h>
25 #include <openssl/dsa.h>
26 #include <openssl/dh.h>
27 #include <openssl/ec.h>
28 #include <openssl/cmac.h>
29 #include <openssl/engine.h>
30 #include <openssl/params.h>
31 #include <openssl/param_build.h>
32 #include <openssl/encoder.h>
33 #include <openssl/core_names.h>
34
35 #include "crypto/asn1.h"
36 #include "crypto/evp.h"
37 #include "crypto/ecx.h"
38 #include "internal/evp.h"
39 #include "internal/provider.h"
40 #include "evp_local.h"
41
42 #include "crypto/ec.h"
43
44 /* TODO remove this when the EVP_PKEY_is_a() #legacy support hack is removed */
45 #include "e_os.h"                /* strcasecmp on Windows */
46
47 static int pkey_set_type(EVP_PKEY *pkey, ENGINE *e, int type, const char *str,
48                          int len, EVP_KEYMGMT *keymgmt);
49 static void evp_pkey_free_it(EVP_PKEY *key);
50
51 #ifndef FIPS_MODULE
52
53 /* The type of parameters selected in key parameter functions */
54 # define SELECT_PARAMETERS OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
55
56 int EVP_PKEY_bits(const EVP_PKEY *pkey)
57 {
58     if (pkey != NULL) {
59         if (pkey->ameth == NULL)
60             return pkey->cache.bits;
61         else if (pkey->ameth->pkey_bits)
62             return pkey->ameth->pkey_bits(pkey);
63     }
64     return 0;
65 }
66
67 int EVP_PKEY_security_bits(const EVP_PKEY *pkey)
68 {
69     if (pkey == NULL)
70         return 0;
71     if (pkey->ameth == NULL)
72         return pkey->cache.security_bits;
73     if (pkey->ameth->pkey_security_bits == NULL)
74         return -2;
75     return pkey->ameth->pkey_security_bits(pkey);
76 }
77
78 int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode)
79 {
80 # ifndef OPENSSL_NO_DSA
81     if (pkey->type == EVP_PKEY_DSA) {
82         int ret = pkey->save_parameters;
83
84         if (mode >= 0)
85             pkey->save_parameters = mode;
86         return ret;
87     }
88 # endif
89 # ifndef OPENSSL_NO_EC
90     if (pkey->type == EVP_PKEY_EC) {
91         int ret = pkey->save_parameters;
92
93         if (mode >= 0)
94             pkey->save_parameters = mode;
95         return ret;
96     }
97 # endif
98     return 0;
99 }
100
101 int EVP_PKEY_set_ex_data(EVP_PKEY *key, int idx, void *arg)
102 {
103     return CRYPTO_set_ex_data(&key->ex_data, idx, arg);
104 }
105
106 void *EVP_PKEY_get_ex_data(const EVP_PKEY *key, int idx)
107 {
108     return CRYPTO_get_ex_data(&key->ex_data, idx);
109 }
110
111 int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
112 {
113     /*
114      * TODO: clean up legacy stuff from this function when legacy support
115      * is gone.
116      */
117
118     /*
119      * If |to| is a legacy key and |from| isn't, we must downgrade |from|.
120      * If that fails, this function fails.
121      */
122     if (evp_pkey_is_legacy(to) && evp_pkey_is_provided(from))
123         if (!evp_pkey_downgrade((EVP_PKEY *)from))
124             return 0;
125
126     /*
127      * Make sure |to| is typed.  Content is less important at this early
128      * stage.
129      *
130      * 1.  If |to| is untyped, assign |from|'s key type to it.
131      * 2.  If |to| contains a legacy key, compare its |type| to |from|'s.
132      *     (|from| was already downgraded above)
133      *
134      * If |to| is a provided key, there's nothing more to do here, functions
135      * like evp_keymgmt_util_copy() and evp_pkey_export_to_provider() called
136      * further down help us find out if they are the same or not.
137      */
138     if (evp_pkey_is_blank(to)) {
139         if (evp_pkey_is_legacy(from)) {
140             if (EVP_PKEY_set_type(to, from->type) == 0)
141                 return 0;
142         } else {
143             if (EVP_PKEY_set_type_by_keymgmt(to, from->keymgmt) == 0)
144                 return 0;
145         }
146     } else if (evp_pkey_is_legacy(to)) {
147         if (to->type != from->type) {
148             EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_DIFFERENT_KEY_TYPES);
149             goto err;
150         }
151     }
152
153     if (EVP_PKEY_missing_parameters(from)) {
154         EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_MISSING_PARAMETERS);
155         goto err;
156     }
157
158     if (!EVP_PKEY_missing_parameters(to)) {
159         if (EVP_PKEY_parameters_eq(to, from) == 1)
160             return 1;
161         EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_DIFFERENT_PARAMETERS);
162         return 0;
163     }
164
165     /* For purely provided keys, we just call the keymgmt utility */
166     if (to->keymgmt != NULL && from->keymgmt != NULL)
167         return evp_keymgmt_util_copy(to, (EVP_PKEY *)from, SELECT_PARAMETERS);
168
169     /*
170      * If |to| is provided, we know that |from| is legacy at this point.
171      * Try exporting |from| to |to|'s keymgmt, then use evp_keymgmt_copy()
172      * to copy the appropriate data to |to|'s keydata.
173      */
174     if (to->keymgmt != NULL) {
175         EVP_KEYMGMT *to_keymgmt = to->keymgmt;
176         void *from_keydata =
177             evp_pkey_export_to_provider((EVP_PKEY *)from, NULL, &to_keymgmt,
178                                         NULL);
179
180         /*
181          * If we get a NULL, it could be an internal error, or it could be
182          * that there's a key mismatch.  We're pretending the latter...
183          */
184         if (from_keydata == NULL) {
185             ERR_raise(ERR_LIB_EVP, EVP_R_DIFFERENT_KEY_TYPES);
186             return 0;
187         }
188         return evp_keymgmt_copy(to->keymgmt, to->keydata, from_keydata,
189                                 SELECT_PARAMETERS);
190     }
191
192     /* Both keys are legacy */
193     if (from->ameth != NULL && from->ameth->param_copy != NULL)
194         return from->ameth->param_copy(to, from);
195  err:
196     return 0;
197 }
198
199 int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey)
200 {
201     if (pkey != NULL) {
202         if (pkey->keymgmt != NULL)
203             return !evp_keymgmt_util_has((EVP_PKEY *)pkey, SELECT_PARAMETERS);
204         else if (pkey->ameth != NULL && pkey->ameth->param_missing != NULL)
205             return pkey->ameth->param_missing(pkey);
206     }
207     return 0;
208 }
209
210 /*
211  * This function is called for any mixture of keys except pure legacy pair.
212  * TODO When legacy keys are gone, we replace a call to this functions with
213  * a call to evp_keymgmt_util_match().
214  */
215 static int evp_pkey_cmp_any(const EVP_PKEY *a, const EVP_PKEY *b,
216                             int selection)
217 {
218     EVP_KEYMGMT *keymgmt1 = NULL, *keymgmt2 = NULL;
219     void *keydata1 = NULL, *keydata2 = NULL, *tmp_keydata = NULL;
220
221     /* If none of them are provided, this function shouldn't have been called */
222     if (!ossl_assert(evp_pkey_is_provided(a) || evp_pkey_is_provided(b)))
223         return -2;
224
225     /* For purely provided keys, we just call the keymgmt utility */
226     if (evp_pkey_is_provided(a) && evp_pkey_is_provided(b))
227         return evp_keymgmt_util_match((EVP_PKEY *)a, (EVP_PKEY *)b, selection);
228
229     /*
230      * At this point, one of them is provided, the other not.  This allows
231      * us to compare types using legacy NIDs.
232      */
233     if (evp_pkey_is_legacy(a)
234         && !EVP_KEYMGMT_is_a(b->keymgmt, OBJ_nid2sn(a->type)))
235         return -1;               /* not the same key type */
236     if (evp_pkey_is_legacy(b)
237         && !EVP_KEYMGMT_is_a(a->keymgmt, OBJ_nid2sn(b->type)))
238         return -1;               /* not the same key type */
239
240     /*
241      * We've determined that they both are the same keytype, so the next
242      * step is to do a bit of cross export to ensure we have keydata for
243      * both keys in the same keymgmt.
244      */
245     keymgmt1 = a->keymgmt;
246     keydata1 = a->keydata;
247     keymgmt2 = b->keymgmt;
248     keydata2 = b->keydata;
249
250     if (keymgmt2 != NULL && keymgmt2->match != NULL) {
251         tmp_keydata =
252             evp_pkey_export_to_provider((EVP_PKEY *)a, NULL, &keymgmt2, NULL);
253         if (tmp_keydata != NULL) {
254             keymgmt1 = keymgmt2;
255             keydata1 = tmp_keydata;
256         }
257     }
258     if (tmp_keydata == NULL && keymgmt1 != NULL && keymgmt1->match != NULL) {
259         tmp_keydata =
260             evp_pkey_export_to_provider((EVP_PKEY *)b, NULL, &keymgmt1, NULL);
261         if (tmp_keydata != NULL) {
262             keymgmt2 = keymgmt1;
263             keydata2 = tmp_keydata;
264         }
265     }
266
267     /* If we still don't have matching keymgmt implementations, we give up */
268     if (keymgmt1 != keymgmt2)
269         return -2;
270
271     /* If the keymgmt implementations are NULL, the export failed */
272     if (keymgmt1 == NULL)
273         return -2;
274
275     return evp_keymgmt_match(keymgmt1, keydata1, keydata2, selection);
276 }
277
278 int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
279 {
280     return EVP_PKEY_parameters_eq(a, b);
281 }
282
283 int EVP_PKEY_parameters_eq(const EVP_PKEY *a, const EVP_PKEY *b)
284 {
285     /*
286      * TODO: clean up legacy stuff from this function when legacy support
287      * is gone.
288      */
289
290     if (a->keymgmt != NULL || b->keymgmt != NULL)
291         return evp_pkey_cmp_any(a, b, SELECT_PARAMETERS);
292
293     /* All legacy keys */
294     if (a->type != b->type)
295         return -1;
296     if (a->ameth != NULL && a->ameth->param_cmp != NULL)
297         return a->ameth->param_cmp(a, b);
298     return -2;
299 }
300
301 int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
302 {
303     return EVP_PKEY_eq(a, b);
304 }
305
306 int EVP_PKEY_eq(const EVP_PKEY *a, const EVP_PKEY *b)
307 {
308     /*
309      * TODO: clean up legacy stuff from this function when legacy support
310      * is gone.
311      */
312
313     if (a->keymgmt != NULL || b->keymgmt != NULL)
314         return evp_pkey_cmp_any(a, b, (SELECT_PARAMETERS
315                                        | OSSL_KEYMGMT_SELECT_PUBLIC_KEY));
316
317     /* All legacy keys */
318     if (a->type != b->type)
319         return -1;
320
321     if (a->ameth != NULL) {
322         int ret;
323         /* Compare parameters if the algorithm has them */
324         if (a->ameth->param_cmp != NULL) {
325             ret = a->ameth->param_cmp(a, b);
326             if (ret <= 0)
327                 return ret;
328         }
329
330         if (a->ameth->pub_cmp != NULL)
331             return a->ameth->pub_cmp(a, b);
332     }
333
334     return -2;
335 }
336
337
338 static EVP_PKEY *new_raw_key_int(OPENSSL_CTX *libctx,
339                                  const char *strtype,
340                                  const char *propq,
341                                  int nidtype,
342                                  ENGINE *e,
343                                  const unsigned char *key,
344                                  size_t len,
345                                  int key_is_priv)
346 {
347     EVP_PKEY *pkey = NULL;
348     EVP_PKEY_CTX *ctx = NULL;
349     const EVP_PKEY_ASN1_METHOD *ameth = NULL;
350     int result = 0;
351
352 # ifndef OPENSSL_NO_ENGINE
353     /* Check if there is an Engine for this type */
354     if (e == NULL) {
355         ENGINE *tmpe = NULL;
356
357         if (strtype != NULL)
358             ameth = EVP_PKEY_asn1_find_str(&tmpe, strtype, -1);
359         else if (nidtype != EVP_PKEY_NONE)
360             ameth = EVP_PKEY_asn1_find(&tmpe, nidtype);
361
362         /* If tmpe is NULL then no engine is claiming to support this type */
363         if (tmpe == NULL)
364             ameth = NULL;
365
366         ENGINE_finish(tmpe);
367     }
368 # endif
369
370     if (e == NULL && ameth == NULL) {
371         /*
372          * No engine is claiming to support this type, so lets see if we have
373          * a provider.
374          */
375         ctx = EVP_PKEY_CTX_new_from_name(libctx,
376                                          strtype != NULL ? strtype
377                                                          : OBJ_nid2sn(nidtype),
378                                          propq);
379         if (ctx == NULL)
380             goto err;
381         /* May fail if no provider available */
382         ERR_set_mark();
383         if (EVP_PKEY_key_fromdata_init(ctx) == 1) {
384             OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END };
385
386             ERR_clear_last_mark();
387             params[0] = OSSL_PARAM_construct_octet_string(
388                             key_is_priv ? OSSL_PKEY_PARAM_PRIV_KEY
389                                         : OSSL_PKEY_PARAM_PUB_KEY,
390                             (void *)key, len);
391
392             if (EVP_PKEY_fromdata(ctx, &pkey, params) != 1) {
393                 EVPerr(0, EVP_R_KEY_SETUP_FAILED);
394                 goto err;
395             }
396
397             EVP_PKEY_CTX_free(ctx);
398
399             return pkey;
400         }
401         ERR_pop_to_mark();
402         /* else not supported so fallback to legacy */
403     }
404
405     /* Legacy code path */
406
407     pkey = EVP_PKEY_new();
408     if (pkey == NULL) {
409         EVPerr(0, ERR_R_MALLOC_FAILURE);
410         goto err;
411     }
412
413     if (!pkey_set_type(pkey, e, nidtype, strtype, -1, NULL)) {
414         /* EVPerr already called */
415         goto err;
416     }
417
418     if (!ossl_assert(pkey->ameth != NULL))
419         goto err;
420
421     if (key_is_priv) {
422         if (pkey->ameth->set_priv_key == NULL) {
423             EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
424             goto err;
425         }
426
427         if (!pkey->ameth->set_priv_key(pkey, key, len)) {
428             EVPerr(0, EVP_R_KEY_SETUP_FAILED);
429             goto err;
430         }
431     } else {
432         if (pkey->ameth->set_pub_key == NULL) {
433             EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
434             goto err;
435         }
436
437         if (!pkey->ameth->set_pub_key(pkey, key, len)) {
438             EVPerr(0, EVP_R_KEY_SETUP_FAILED);
439             goto err;
440         }
441     }
442
443     result = 1;
444  err:
445     if (!result) {
446         EVP_PKEY_free(pkey);
447         pkey = NULL;
448     }
449     EVP_PKEY_CTX_free(ctx);
450     return pkey;
451 }
452
453 EVP_PKEY *EVP_PKEY_new_raw_private_key_ex(OPENSSL_CTX *libctx,
454                                           const char *keytype,
455                                           const char *propq,
456                                           const unsigned char *priv, size_t len)
457 {
458     return new_raw_key_int(libctx, keytype, propq, EVP_PKEY_NONE, NULL, priv,
459                            len, 1);
460 }
461
462 EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *e,
463                                        const unsigned char *priv,
464                                        size_t len)
465 {
466     return new_raw_key_int(NULL, NULL, NULL, type, e, priv, len, 1);
467 }
468
469 EVP_PKEY *EVP_PKEY_new_raw_public_key_ex(OPENSSL_CTX *libctx,
470                                          const char *keytype, const char *propq,
471                                          const unsigned char *pub, size_t len)
472 {
473     return new_raw_key_int(libctx, keytype, propq, EVP_PKEY_NONE, NULL, pub,
474                            len, 0);
475 }
476
477 EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e,
478                                       const unsigned char *pub,
479                                       size_t len)
480 {
481     return new_raw_key_int(NULL, NULL, NULL, type, e, pub, len, 0);
482 }
483
484 struct raw_key_details_st
485 {
486     unsigned char **key;
487     size_t *len;
488     int selection;
489 };
490
491 static OSSL_CALLBACK get_raw_key_details;
492 static int get_raw_key_details(const OSSL_PARAM params[], void *arg)
493 {
494     const OSSL_PARAM *p = NULL;
495     struct raw_key_details_st *raw_key = arg;
496
497     if (raw_key->selection == OSSL_KEYMGMT_SELECT_PRIVATE_KEY) {
498         if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PRIV_KEY))
499                 != NULL)
500             return OSSL_PARAM_get_octet_string(p, (void **)raw_key->key,
501                                                SIZE_MAX, raw_key->len);
502     } else if (raw_key->selection == OSSL_KEYMGMT_SELECT_PUBLIC_KEY) {
503         if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PUB_KEY))
504                 != NULL)
505             return OSSL_PARAM_get_octet_string(p, (void **)raw_key->key,
506                                                SIZE_MAX, raw_key->len);
507     }
508
509     return 0;
510 }
511
512 int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv,
513                                  size_t *len)
514 {
515     if (pkey->keymgmt != NULL) {
516         struct raw_key_details_st raw_key;
517
518         raw_key.key = priv == NULL ? NULL : &priv;
519         raw_key.len = len;
520         raw_key.selection = OSSL_KEYMGMT_SELECT_PRIVATE_KEY;
521
522         return evp_keymgmt_util_export(pkey, OSSL_KEYMGMT_SELECT_PRIVATE_KEY,
523                                        get_raw_key_details, &raw_key);
524     }
525
526     if (pkey->ameth == NULL) {
527         EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
528         return 0;
529     }
530
531     if (pkey->ameth->get_priv_key == NULL) {
532         EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
533         return 0;
534     }
535
536     if (!pkey->ameth->get_priv_key(pkey, priv, len)) {
537         EVPerr(0, EVP_R_GET_RAW_KEY_FAILED);
538         return 0;
539     }
540
541     return 1;
542 }
543
544 int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub,
545                                 size_t *len)
546 {
547     if (pkey->keymgmt != NULL) {
548         struct raw_key_details_st raw_key;
549
550         raw_key.key = pub == NULL ? NULL : &pub;
551         raw_key.len = len;
552         raw_key.selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY;
553
554         return evp_keymgmt_util_export(pkey, OSSL_KEYMGMT_SELECT_PUBLIC_KEY,
555                                        get_raw_key_details, &raw_key);
556     }
557
558     if (pkey->ameth == NULL) {
559         EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
560         return 0;
561     }
562
563      if (pkey->ameth->get_pub_key == NULL) {
564         EVPerr(EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY,
565                EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
566         return 0;
567     }
568
569     if (!pkey->ameth->get_pub_key(pkey, pub, len)) {
570         EVPerr(EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY, EVP_R_GET_RAW_KEY_FAILED);
571         return 0;
572     }
573
574     return 1;
575 }
576
577 static EVP_PKEY *new_cmac_key_int(const unsigned char *priv, size_t len,
578                                   const char *cipher_name,
579                                   const EVP_CIPHER *cipher, OPENSSL_CTX *libctx,
580                                   const char *propq, ENGINE *e)
581 {
582 # ifndef OPENSSL_NO_CMAC
583 #  ifndef OPENSSL_NO_ENGINE
584     const char *engine_id = e != NULL ? ENGINE_get_id(e) : NULL;
585 #  endif
586     OSSL_PARAM params[5], *p = params;
587     EVP_PKEY *pkey = NULL;
588     EVP_PKEY_CTX *ctx;
589
590     if (cipher != NULL)
591         cipher_name = EVP_CIPHER_name(cipher);
592
593     if (cipher_name == NULL) {
594         EVPerr(0, EVP_R_KEY_SETUP_FAILED);
595         return NULL;
596     }
597
598     ctx = EVP_PKEY_CTX_new_from_name(libctx, "CMAC", propq);
599     if (ctx == NULL)
600         goto err;
601
602     if (!EVP_PKEY_key_fromdata_init(ctx)) {
603         EVPerr(0, EVP_R_KEY_SETUP_FAILED);
604         goto err;
605     }
606
607     *p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
608                                             (void *)priv, len);
609     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_CIPHER,
610                                             (char *)cipher_name, 0);
611     if (propq != NULL)
612         *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_PROPERTIES,
613                                                 (char *)propq, 0);
614 #  ifndef OPENSSL_NO_ENGINE
615     if (engine_id != NULL)
616         *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_ENGINE,
617                                                 (char *)engine_id, 0);
618 #  endif
619     *p = OSSL_PARAM_construct_end();
620
621     if (!EVP_PKEY_fromdata(ctx, &pkey, params)) {
622         EVPerr(0, EVP_R_KEY_SETUP_FAILED);
623         goto err;
624     }
625
626  err:
627     EVP_PKEY_CTX_free(ctx);
628
629     return pkey;
630 # else
631     EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
632     return NULL;
633 # endif
634 }
635
636 EVP_PKEY *EVP_PKEY_new_CMAC_key_ex(const unsigned char *priv, size_t len,
637                                    const char *cipher_name, OPENSSL_CTX *libctx,
638                                    const char *propq)
639 {
640     return new_cmac_key_int(priv, len, cipher_name, NULL, libctx, propq, NULL);
641 }
642
643 EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv,
644                                 size_t len, const EVP_CIPHER *cipher)
645 {
646     return new_cmac_key_int(priv, len, NULL, cipher, NULL, NULL, e);
647 }
648
649 int EVP_PKEY_set_type(EVP_PKEY *pkey, int type)
650 {
651     return pkey_set_type(pkey, NULL, type, NULL, -1, NULL);
652 }
653
654 int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len)
655 {
656     return pkey_set_type(pkey, NULL, EVP_PKEY_NONE, str, len, NULL);
657 }
658
659 #ifndef OPENSSL_NO_DEPRECATED_3_0
660 int EVP_PKEY_set_alias_type(EVP_PKEY *pkey, int type)
661 {
662     if (!evp_pkey_is_legacy(pkey)) {
663         const char *name = OBJ_nid2sn(type);
664
665         if (name != NULL && EVP_PKEY_is_a(pkey, name))
666             return 1;
667
668         ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION);
669         return 0;
670     }
671
672     if (pkey->type == type) {
673         return 1; /* it already is that type */
674     }
675
676     /*
677      * The application is requesting to alias this to a different pkey type,
678      * but not one that resolves to the base type.
679      */
680     if (EVP_PKEY_type(type) != EVP_PKEY_base_id(pkey)) {
681         EVPerr(EVP_F_EVP_PKEY_SET_ALIAS_TYPE, EVP_R_UNSUPPORTED_ALGORITHM);
682         return 0;
683     }
684
685     pkey->type = type;
686     return 1;
687 }
688 #endif
689
690 # ifndef OPENSSL_NO_ENGINE
691 int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e)
692 {
693     if (e != NULL) {
694         if (!ENGINE_init(e)) {
695             EVPerr(EVP_F_EVP_PKEY_SET1_ENGINE, ERR_R_ENGINE_LIB);
696             return 0;
697         }
698         if (ENGINE_get_pkey_meth(e, pkey->type) == NULL) {
699             ENGINE_finish(e);
700             EVPerr(EVP_F_EVP_PKEY_SET1_ENGINE, EVP_R_UNSUPPORTED_ALGORITHM);
701             return 0;
702         }
703     }
704     ENGINE_finish(pkey->pmeth_engine);
705     pkey->pmeth_engine = e;
706     return 1;
707 }
708
709 ENGINE *EVP_PKEY_get0_engine(const EVP_PKEY *pkey)
710 {
711     return pkey->engine;
712 }
713 # endif
714 int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
715 {
716     int alias = type;
717
718 #ifndef OPENSSL_NO_EC
719     if ((key != NULL) && (EVP_PKEY_type(type) == EVP_PKEY_EC)) {
720         const EC_GROUP *group = EC_KEY_get0_group(key);
721
722         if (group != NULL && EC_GROUP_get_curve_name(group) == NID_sm2)
723             alias = EVP_PKEY_SM2;
724     }
725 #endif
726
727     if (pkey == NULL || !EVP_PKEY_set_type(pkey, type))
728         return 0;
729     if (!EVP_PKEY_set_alias_type(pkey, alias))
730         return 0;
731     pkey->pkey.ptr = key;
732     return (key != NULL);
733 }
734
735 void *EVP_PKEY_get0(const EVP_PKEY *pkey)
736 {
737     if (pkey == NULL)
738         return NULL;
739     if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
740         ERR_raise(ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY);
741         return NULL;
742     }
743     return pkey->pkey.ptr;
744 }
745
746 const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len)
747 {
748     ASN1_OCTET_STRING *os = NULL;
749     if (pkey->type != EVP_PKEY_HMAC) {
750         EVPerr(EVP_F_EVP_PKEY_GET0_HMAC, EVP_R_EXPECTING_AN_HMAC_KEY);
751         return NULL;
752     }
753     os = EVP_PKEY_get0(pkey);
754     *len = os->length;
755     return os->data;
756 }
757
758 # ifndef OPENSSL_NO_POLY1305
759 const unsigned char *EVP_PKEY_get0_poly1305(const EVP_PKEY *pkey, size_t *len)
760 {
761     ASN1_OCTET_STRING *os = NULL;
762     if (pkey->type != EVP_PKEY_POLY1305) {
763         EVPerr(EVP_F_EVP_PKEY_GET0_POLY1305, EVP_R_EXPECTING_A_POLY1305_KEY);
764         return NULL;
765     }
766     os = EVP_PKEY_get0(pkey);
767     *len = os->length;
768     return os->data;
769 }
770 # endif
771
772 # ifndef OPENSSL_NO_SIPHASH
773 const unsigned char *EVP_PKEY_get0_siphash(const EVP_PKEY *pkey, size_t *len)
774 {
775     ASN1_OCTET_STRING *os = NULL;
776
777     if (pkey->type != EVP_PKEY_SIPHASH) {
778         EVPerr(EVP_F_EVP_PKEY_GET0_SIPHASH, EVP_R_EXPECTING_A_SIPHASH_KEY);
779         return NULL;
780     }
781     os = EVP_PKEY_get0(pkey);
782     *len = os->length;
783     return os->data;
784 }
785 # endif
786
787 # ifndef OPENSSL_NO_RSA
788 int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key)
789 {
790     int ret = EVP_PKEY_assign_RSA(pkey, key);
791     if (ret)
792         RSA_up_ref(key);
793     return ret;
794 }
795
796 RSA *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey)
797 {
798     if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
799         ERR_raise(ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY);
800         return NULL;
801     }
802     if (pkey->type != EVP_PKEY_RSA && pkey->type != EVP_PKEY_RSA_PSS) {
803         EVPerr(EVP_F_EVP_PKEY_GET0_RSA, EVP_R_EXPECTING_AN_RSA_KEY);
804         return NULL;
805     }
806     return pkey->pkey.rsa;
807 }
808
809 RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey)
810 {
811     RSA *ret = EVP_PKEY_get0_RSA(pkey);
812     if (ret != NULL)
813         RSA_up_ref(ret);
814     return ret;
815 }
816 # endif
817
818 # ifndef OPENSSL_NO_DSA
819 DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey)
820 {
821     if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
822         ERR_raise(ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY);
823         return NULL;
824     }
825     if (pkey->type != EVP_PKEY_DSA) {
826         EVPerr(EVP_F_EVP_PKEY_GET0_DSA, EVP_R_EXPECTING_A_DSA_KEY);
827         return NULL;
828     }
829     return pkey->pkey.dsa;
830 }
831
832 int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key)
833 {
834     int ret = EVP_PKEY_assign_DSA(pkey, key);
835     if (ret)
836         DSA_up_ref(key);
837     return ret;
838 }
839 DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
840 {
841     DSA *ret = EVP_PKEY_get0_DSA(pkey);
842     if (ret != NULL)
843         DSA_up_ref(ret);
844     return ret;
845 }
846 # endif /*  OPENSSL_NO_DSA */
847 #endif /* FIPS_MODULE */
848
849 #ifndef FIPS_MODULE
850 # ifndef OPENSSL_NO_EC
851 int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key)
852 {
853     int ret = EVP_PKEY_assign_EC_KEY(pkey, key);
854     if (ret)
855         EC_KEY_up_ref(key);
856     return ret;
857 }
858
859 EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey)
860 {
861     if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
862         ERR_raise(ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY);
863         return NULL;
864     }
865     if (EVP_PKEY_base_id(pkey) != EVP_PKEY_EC) {
866         EVPerr(EVP_F_EVP_PKEY_GET0_EC_KEY, EVP_R_EXPECTING_A_EC_KEY);
867         return NULL;
868     }
869     return pkey->pkey.ec;
870 }
871
872 EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey)
873 {
874     EC_KEY *ret = EVP_PKEY_get0_EC_KEY(pkey);
875     if (ret != NULL)
876         EC_KEY_up_ref(ret);
877     return ret;
878 }
879
880 static ECX_KEY *evp_pkey_get0_ECX_KEY(const EVP_PKEY *pkey, int type)
881 {
882     if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
883         ERR_raise(ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY);
884         return NULL;
885     }
886     if (EVP_PKEY_base_id(pkey) != type) {
887         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_ECX_KEY);
888         return NULL;
889     }
890     return pkey->pkey.ecx;
891 }
892
893 static ECX_KEY *evp_pkey_get1_ECX_KEY(EVP_PKEY *pkey, int type)
894 {
895     ECX_KEY *ret = evp_pkey_get0_ECX_KEY(pkey, type);
896     if (ret != NULL)
897         ecx_key_up_ref(ret);
898     return ret;
899 }
900
901 #  define IMPLEMENT_ECX_VARIANT(NAME)                                   \
902     ECX_KEY *evp_pkey_get1_##NAME(EVP_PKEY *pkey)                       \
903     {                                                                   \
904         return evp_pkey_get1_ECX_KEY(pkey, EVP_PKEY_##NAME);            \
905     }
906 IMPLEMENT_ECX_VARIANT(X25519)
907 IMPLEMENT_ECX_VARIANT(X448)
908 IMPLEMENT_ECX_VARIANT(ED25519)
909 IMPLEMENT_ECX_VARIANT(ED448)
910
911 # endif
912
913 # ifndef OPENSSL_NO_DH
914
915 int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key)
916 {
917     int type = DH_get0_q(key) == NULL ? EVP_PKEY_DH : EVP_PKEY_DHX;
918     int ret = EVP_PKEY_assign(pkey, type, key);
919
920     if (ret)
921         DH_up_ref(key);
922     return ret;
923 }
924
925 DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey)
926 {
927     if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
928         ERR_raise(ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY);
929         return NULL;
930     }
931     if (pkey->type != EVP_PKEY_DH && pkey->type != EVP_PKEY_DHX) {
932         EVPerr(EVP_F_EVP_PKEY_GET0_DH, EVP_R_EXPECTING_A_DH_KEY);
933         return NULL;
934     }
935     return pkey->pkey.dh;
936 }
937
938 DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey)
939 {
940     DH *ret = EVP_PKEY_get0_DH(pkey);
941     if (ret != NULL)
942         DH_up_ref(ret);
943     return ret;
944 }
945 # endif
946
947 int EVP_PKEY_type(int type)
948 {
949     int ret;
950     const EVP_PKEY_ASN1_METHOD *ameth;
951     ENGINE *e;
952     ameth = EVP_PKEY_asn1_find(&e, type);
953     if (ameth)
954         ret = ameth->pkey_id;
955     else
956         ret = NID_undef;
957 # ifndef OPENSSL_NO_ENGINE
958     ENGINE_finish(e);
959 # endif
960     return ret;
961 }
962
963 int EVP_PKEY_id(const EVP_PKEY *pkey)
964 {
965     return pkey->type;
966 }
967
968 int EVP_PKEY_base_id(const EVP_PKEY *pkey)
969 {
970     return EVP_PKEY_type(pkey->type);
971 }
972
973 #ifndef FIPS_MODULE
974 int evp_pkey_name2type(const char *name)
975 {
976     /*
977      * These hard coded cases are pure hackery to get around the fact
978      * that names in crypto/objects/objects.txt are a mess.  There is
979      * no "EC", and "RSA" leads to the NID for 2.5.8.1.1, an OID that's
980      * fallen out in favor of { pkcs-1 1 }, i.e. 1.2.840.113549.1.1.1,
981      * the NID of which is used for EVP_PKEY_RSA.  Strangely enough,
982      * "DSA" is accurate...  but still, better be safe and hard-code
983      * names that we know.
984      * On a similar topic, EVP_PKEY_type(EVP_PKEY_SM2) will result in
985      * EVP_PKEY_EC, because of aliasing.
986      * TODO Clean this away along with all other #legacy support.
987      */
988     int type = NID_undef;
989
990     if (strcasecmp(name, "RSA") == 0)
991         type = EVP_PKEY_RSA;
992     else if (strcasecmp(name, "RSA-PSS") == 0)
993         type = EVP_PKEY_RSA_PSS;
994     else if (strcasecmp(name, "EC") == 0)
995         type = EVP_PKEY_EC;
996     else if (strcasecmp(name, "ED25519") == 0)
997         type = EVP_PKEY_ED25519;
998     else if (strcasecmp(name, "ED448") == 0)
999         type = EVP_PKEY_ED448;
1000     else if (strcasecmp(name, "X25519") == 0)
1001         type = EVP_PKEY_X25519;
1002     else if (strcasecmp(name, "X448") == 0)
1003         type = EVP_PKEY_X448;
1004     else if (strcasecmp(name, "SM2") == 0)
1005         type = EVP_PKEY_SM2;
1006     else if (strcasecmp(name, "DH") == 0)
1007         type = EVP_PKEY_DH;
1008     else if (strcasecmp(name, "X9.42 DH") == 0)
1009         type = EVP_PKEY_DHX;
1010     else if (strcasecmp(name, "DSA") == 0)
1011         type = EVP_PKEY_DSA;
1012
1013     if (type == NID_undef)
1014         type = EVP_PKEY_type(OBJ_sn2nid(name));
1015     if (type == NID_undef)
1016         type = EVP_PKEY_type(OBJ_ln2nid(name));
1017
1018     return type;
1019 }
1020 #endif
1021
1022 int EVP_PKEY_is_a(const EVP_PKEY *pkey, const char *name)
1023 {
1024 #ifndef FIPS_MODULE
1025     if (pkey->keymgmt == NULL) {
1026         int type = evp_pkey_name2type(name);
1027
1028         return pkey->type == type;
1029     }
1030 #endif
1031     return EVP_KEYMGMT_is_a(pkey->keymgmt, name);
1032 }
1033
1034 void EVP_PKEY_typenames_do_all(const EVP_PKEY *pkey,
1035                                void (*fn)(const char *name, void *data),
1036                                void *data)
1037 {
1038     if (!evp_pkey_is_typed(pkey))
1039         return;
1040
1041     if (!evp_pkey_is_provided(pkey)) {
1042         const char *name = OBJ_nid2sn(EVP_PKEY_id(pkey));
1043
1044         fn(name, data);
1045         return;
1046     }
1047     EVP_KEYMGMT_names_do_all(pkey->keymgmt, fn, data);
1048 }
1049
1050 int EVP_PKEY_can_sign(const EVP_PKEY *pkey)
1051 {
1052     if (pkey->keymgmt == NULL) {
1053         switch (EVP_PKEY_base_id(pkey)) {
1054         case EVP_PKEY_RSA:
1055             return 1;
1056 #ifndef OPENSSL_NO_DSA
1057         case EVP_PKEY_DSA:
1058             return 1;
1059 #endif
1060 #ifndef OPENSSL_NO_EC
1061         case EVP_PKEY_ED25519:
1062         case EVP_PKEY_ED448:
1063             return 1;
1064         case EVP_PKEY_EC:        /* Including SM2 */
1065             return EC_KEY_can_sign(pkey->pkey.ec);
1066 #endif
1067         default:
1068             break;
1069         }
1070     } else {
1071         const OSSL_PROVIDER *prov = EVP_KEYMGMT_provider(pkey->keymgmt);
1072         OPENSSL_CTX *libctx = ossl_provider_library_context(prov);
1073         const char *supported_sig =
1074             pkey->keymgmt->query_operation_name != NULL
1075             ? pkey->keymgmt->query_operation_name(OSSL_OP_SIGNATURE)
1076             : evp_first_name(prov, pkey->keymgmt->name_id);
1077         EVP_SIGNATURE *signature = NULL;
1078
1079         signature = EVP_SIGNATURE_fetch(libctx, supported_sig, NULL);
1080         if (signature != NULL) {
1081             EVP_SIGNATURE_free(signature);
1082             return 1;
1083         }
1084     }
1085     return 0;
1086 }
1087
1088 #ifndef OPENSSL_NO_EC
1089 /*
1090  * TODO rewrite when we have proper data extraction functions
1091  * Note: an octet pointer would be desirable!
1092  */
1093 static OSSL_CALLBACK get_ec_curve_name_cb;
1094 static int get_ec_curve_name_cb(const OSSL_PARAM params[], void *arg)
1095 {
1096     const OSSL_PARAM *p = NULL;
1097
1098     if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_GROUP_NAME)) != NULL)
1099         return OSSL_PARAM_get_utf8_string(p, arg, 0);
1100
1101     /* If there is no curve name, this is not an EC key */
1102     return 0;
1103 }
1104
1105 int evp_pkey_get_EC_KEY_curve_nid(const EVP_PKEY *pkey)
1106 {
1107     int ret = NID_undef;
1108
1109     if (pkey->keymgmt == NULL) {
1110         if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC) {
1111             EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
1112
1113             ret = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
1114         }
1115     } else if (EVP_PKEY_is_a(pkey, "EC") || EVP_PKEY_is_a(pkey, "SM2")) {
1116         char *curve_name = NULL;
1117
1118         ret = evp_keymgmt_util_export(pkey,
1119                                       OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
1120                                       get_ec_curve_name_cb, &curve_name);
1121         if (ret)
1122             ret = ec_curve_name2nid(curve_name);
1123         OPENSSL_free(curve_name);
1124     }
1125
1126     return ret;
1127 }
1128 #endif
1129
1130 static int print_reset_indent(BIO **out, int pop_f_prefix, long saved_indent)
1131 {
1132     BIO_set_indent(*out, saved_indent);
1133     if (pop_f_prefix) {
1134         BIO *next = BIO_pop(*out);
1135
1136         BIO_free(*out);
1137         *out = next;
1138     }
1139     return 1;
1140 }
1141
1142 static int print_set_indent(BIO **out, int *pop_f_prefix, long *saved_indent,
1143                             long indent)
1144 {
1145     *pop_f_prefix = 0;
1146     *saved_indent = 0;
1147     if (indent > 0) {
1148         long i = BIO_get_indent(*out);
1149
1150         *saved_indent =  (i < 0 ? 0 : i);
1151         if (BIO_set_indent(*out, indent) <= 0) {
1152             if ((*out = BIO_push(BIO_new(BIO_f_prefix()), *out)) == NULL)
1153                 return 0;
1154             *pop_f_prefix = 1;
1155         }
1156         if (BIO_set_indent(*out, indent) <= 0) {
1157             print_reset_indent(out, *pop_f_prefix, *saved_indent);
1158             return 0;
1159         }
1160     }
1161     return 1;
1162 }
1163
1164 static int unsup_alg(BIO *out, const EVP_PKEY *pkey, int indent,
1165                      const char *kstr)
1166 {
1167     return BIO_indent(out, indent, 128)
1168         && BIO_printf(out, "%s algorithm \"%s\" unsupported\n",
1169                       kstr, OBJ_nid2ln(pkey->type)) > 0;
1170 }
1171
1172 static int print_pkey(const EVP_PKEY *pkey, BIO *out, int indent,
1173                       int selection /* For provided encoding */,
1174                       OPENSSL_CTX *libctx /* For provided encoding */,
1175                       const char *propquery /* For provided encoding */,
1176                       int (*legacy_print)(BIO *out, const EVP_PKEY *pkey,
1177                                           int indent, ASN1_PCTX *pctx),
1178                       ASN1_PCTX *legacy_pctx /* For legacy print */)
1179 {
1180     int pop_f_prefix;
1181     long saved_indent;
1182     OSSL_ENCODER_CTX *ctx = NULL;
1183     int ret = -2;                /* default to unsupported */
1184
1185     if (!print_set_indent(&out, &pop_f_prefix, &saved_indent, indent))
1186         return 0;
1187
1188     ctx = OSSL_ENCODER_CTX_new_by_EVP_PKEY(pkey, "TEXT", selection,
1189                                            libctx, propquery);
1190     if (OSSL_ENCODER_CTX_get_num_encoders(ctx) != 0)
1191         ret = OSSL_ENCODER_to_bio(ctx, out);
1192     OSSL_ENCODER_CTX_free(ctx);
1193
1194     if (ret != -2)
1195         goto end;
1196
1197     /* legacy fallback */
1198     if (legacy_print != NULL)
1199         ret = legacy_print(out, pkey, 0, legacy_pctx);
1200     else
1201         ret = unsup_alg(out, pkey, 0, "Public Key");
1202
1203  end:
1204     print_reset_indent(&out, pop_f_prefix, saved_indent);
1205     return ret;
1206 }
1207
1208 int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey,
1209                           int indent, ASN1_PCTX *pctx)
1210 {
1211     return print_pkey(pkey, out, indent,
1212                       OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
1213                       | OSSL_KEYMGMT_SELECT_PUBLIC_KEY,
1214                       NULL, NULL,
1215                       (pkey->ameth != NULL ? pkey->ameth->pub_print : NULL),
1216                       pctx);
1217 }
1218
1219 int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey,
1220                            int indent, ASN1_PCTX *pctx)
1221 {
1222     return print_pkey(pkey, out, indent,
1223                       OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
1224                       | OSSL_KEYMGMT_SELECT_KEYPAIR,
1225                       NULL, NULL,
1226                       (pkey->ameth != NULL ? pkey->ameth->priv_print : NULL),
1227                       pctx);
1228 }
1229
1230 int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey,
1231                           int indent, ASN1_PCTX *pctx)
1232 {
1233     return print_pkey(pkey, out, indent, OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
1234                       NULL, NULL,
1235                       (pkey->ameth != NULL ? pkey->ameth->param_print : NULL),
1236                       pctx);
1237 }
1238
1239 static int legacy_asn1_ctrl_to_param(EVP_PKEY *pkey, int op,
1240                                      int arg1, void *arg2)
1241 {
1242     if (pkey->keymgmt == NULL)
1243         return 0;
1244     switch (op) {
1245     case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
1246         {
1247             char mdname[80] = "";
1248             int rv = EVP_PKEY_get_default_digest_name(pkey, mdname,
1249                                                       sizeof(mdname));
1250
1251             if (rv > 0) {
1252                 int nid;
1253
1254                 nid = OBJ_sn2nid(mdname);
1255                 if (nid == NID_undef)
1256                     nid = OBJ_ln2nid(mdname);
1257                 *(int *)arg2 = nid;
1258             }
1259             return rv;
1260         }
1261     default:
1262         return -2;
1263     }
1264 }
1265
1266 static int evp_pkey_asn1_ctrl(EVP_PKEY *pkey, int op, int arg1, void *arg2)
1267 {
1268     if (pkey->ameth == NULL)
1269         return legacy_asn1_ctrl_to_param(pkey, op, arg1, arg2);
1270     if (pkey->ameth->pkey_ctrl == NULL)
1271         return -2;
1272     return pkey->ameth->pkey_ctrl(pkey, op, arg1, arg2);
1273 }
1274
1275 int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid)
1276 {
1277     return evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_DEFAULT_MD_NID, 0, pnid);
1278 }
1279
1280 int EVP_PKEY_get_default_digest_name(EVP_PKEY *pkey,
1281                                      char *mdname, size_t mdname_sz)
1282 {
1283     if (pkey->ameth == NULL)
1284         return evp_keymgmt_util_get_deflt_digest_name(pkey->keymgmt,
1285                                                       pkey->keydata,
1286                                                       mdname, mdname_sz);
1287
1288     {
1289         int nid = NID_undef;
1290         int rv = EVP_PKEY_get_default_digest_nid(pkey, &nid);
1291         const char *name = rv > 0 ? OBJ_nid2sn(nid) : NULL;
1292
1293         if (rv > 0)
1294             OPENSSL_strlcpy(mdname, name, mdname_sz);
1295         return rv;
1296     }
1297 }
1298
1299 int EVP_PKEY_supports_digest_nid(EVP_PKEY *pkey, int nid)
1300 {
1301     int rv, default_nid;
1302
1303     rv = evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_SUPPORTS_MD_NID, nid, NULL);
1304     if (rv == -2) {
1305         /*
1306          * If there is a mandatory default digest and this isn't it, then
1307          * the answer is 'no'.
1308          */
1309         rv = EVP_PKEY_get_default_digest_nid(pkey, &default_nid);
1310         if (rv == 2)
1311             return (nid == default_nid);
1312         /* zero is an error from EVP_PKEY_get_default_digest_nid() */
1313         if (rv == 0)
1314             return -1;
1315     }
1316     return rv;
1317 }
1318
1319 int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey,
1320                                const unsigned char *pt, size_t ptlen)
1321 {
1322     if (pkey->ameth == NULL) {
1323         OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
1324
1325         if (pkey->keymgmt == NULL || pkey->keydata == NULL)
1326             return 0;
1327
1328         params[0] =
1329             OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_TLS_ENCODED_PT,
1330                                               (unsigned char *)pt, ptlen);
1331         return evp_keymgmt_set_params(pkey->keymgmt, pkey->keydata, params);
1332     }
1333
1334     if (ptlen > INT_MAX)
1335         return 0;
1336     if (evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_SET1_TLS_ENCPT, ptlen,
1337                            (void *)pt) <= 0)
1338         return 0;
1339     return 1;
1340 }
1341
1342 size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY *pkey, unsigned char **ppt)
1343 {
1344     int rv;
1345
1346     if (pkey->ameth == NULL) {
1347         OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
1348
1349         if (pkey->keymgmt == NULL || pkey->keydata == NULL)
1350             return 0;
1351
1352         params[0] =
1353             OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_TLS_ENCODED_PT,
1354                                               NULL, 0);
1355         if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
1356             return 0;
1357
1358         *ppt = OPENSSL_malloc(params[0].return_size);
1359         if (*ppt == NULL)
1360             return 0;
1361
1362         params[0] =
1363             OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_TLS_ENCODED_PT,
1364                                               *ppt, params[0].return_size);
1365         if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
1366             return 0;
1367
1368         return params[0].return_size;
1369     }
1370
1371
1372     rv = evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_GET1_TLS_ENCPT, 0, ppt);
1373     if (rv <= 0)
1374         return 0;
1375     return rv;
1376 }
1377
1378 #endif /* FIPS_MODULE */
1379
1380 /*- All methods below can also be used in FIPS_MODULE */
1381
1382 static int evp_pkey_reset_unlocked(EVP_PKEY *pk)
1383 {
1384     if (pk == NULL)
1385         return 0;
1386
1387     memset(pk, 0, sizeof(*pk));
1388     pk->type = EVP_PKEY_NONE;
1389     pk->save_type = EVP_PKEY_NONE;
1390     pk->references = 1;
1391     pk->save_parameters = 1;
1392     return 1;
1393 }
1394
1395 EVP_PKEY *EVP_PKEY_new(void)
1396 {
1397     EVP_PKEY *ret = OPENSSL_zalloc(sizeof(*ret));
1398
1399     if (ret == NULL) {
1400         EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
1401         return NULL;
1402     }
1403
1404     if (!evp_pkey_reset_unlocked(ret))
1405         goto err;
1406
1407     ret->lock = CRYPTO_THREAD_lock_new();
1408     if (ret->lock == NULL) {
1409         EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
1410         goto err;
1411     }
1412 #ifndef FIPS_MODULE
1413     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, ret, &ret->ex_data)) {
1414         EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
1415         goto err;
1416     }
1417 #endif
1418     return ret;
1419
1420  err:
1421     CRYPTO_THREAD_lock_free(ret->lock);
1422     OPENSSL_free(ret);
1423     return NULL;
1424 }
1425
1426 /*
1427  * Setup a public key management method.
1428  *
1429  * For legacy keys, either |type| or |str| is expected to have the type
1430  * information.  In this case, the setup consists of finding an ASN1 method
1431  * and potentially an ENGINE, and setting those fields in |pkey|.
1432  *
1433  * For provider side keys, |keymgmt| is expected to be non-NULL.  In this
1434  * case, the setup consists of setting the |keymgmt| field in |pkey|.
1435  *
1436  * If pkey is NULL just return 1 or 0 if the key management method exists.
1437  */
1438
1439 static int pkey_set_type(EVP_PKEY *pkey, ENGINE *e, int type, const char *str,
1440                          int len, EVP_KEYMGMT *keymgmt)
1441 {
1442 #ifndef FIPS_MODULE
1443     const EVP_PKEY_ASN1_METHOD *ameth = NULL;
1444     ENGINE **eptr = (e == NULL) ? &e :  NULL;
1445 #endif
1446
1447     /*
1448      * The setups can't set both legacy and provider side methods.
1449      * It is forbidden
1450      */
1451     if (!ossl_assert(type == EVP_PKEY_NONE || keymgmt == NULL)
1452         || !ossl_assert(e == NULL || keymgmt == NULL)) {
1453         ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
1454         return 0;
1455     }
1456
1457     if (pkey != NULL) {
1458         int free_it = 0;
1459
1460 #ifndef FIPS_MODULE
1461         free_it = free_it || pkey->pkey.ptr != NULL;
1462 #endif
1463         free_it = free_it || pkey->keydata != NULL;
1464         if (free_it)
1465             evp_pkey_free_it(pkey);
1466 #ifndef FIPS_MODULE
1467         /*
1468          * If key type matches and a method exists then this lookup has
1469          * succeeded once so just indicate success.
1470          */
1471         if (pkey->type != EVP_PKEY_NONE
1472             && type == pkey->save_type
1473             && pkey->ameth != NULL)
1474             return 1;
1475 # ifndef OPENSSL_NO_ENGINE
1476         /* If we have ENGINEs release them */
1477         ENGINE_finish(pkey->engine);
1478         pkey->engine = NULL;
1479         ENGINE_finish(pkey->pmeth_engine);
1480         pkey->pmeth_engine = NULL;
1481 # endif
1482 #endif
1483     }
1484 #ifndef FIPS_MODULE
1485     if (str != NULL)
1486         ameth = EVP_PKEY_asn1_find_str(eptr, str, len);
1487     else if (type != EVP_PKEY_NONE)
1488         ameth = EVP_PKEY_asn1_find(eptr, type);
1489 # ifndef OPENSSL_NO_ENGINE
1490     if (pkey == NULL && eptr != NULL)
1491         ENGINE_finish(e);
1492 # endif
1493 #endif
1494
1495
1496     {
1497         int check = 1;
1498
1499 #ifndef FIPS_MODULE
1500         check = check && ameth == NULL;
1501 #endif
1502         check = check && keymgmt == NULL;
1503         if (check) {
1504             EVPerr(EVP_F_PKEY_SET_TYPE, EVP_R_UNSUPPORTED_ALGORITHM);
1505             return 0;
1506         }
1507     }
1508     if (pkey != NULL) {
1509         if (keymgmt != NULL && !EVP_KEYMGMT_up_ref(keymgmt)) {
1510             ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
1511             return 0;
1512         }
1513
1514         pkey->keymgmt = keymgmt;
1515
1516         pkey->save_type = type;
1517         pkey->type = type;
1518
1519 #ifndef FIPS_MODULE
1520         /*
1521          * If the internal "origin" key is provider side, don't save |ameth|.
1522          * The main reason is that |ameth| is one factor to detect that the
1523          * internal "origin" key is a legacy one.
1524          */
1525         if (keymgmt == NULL)
1526             pkey->ameth = ameth;
1527         pkey->engine = e;
1528
1529         /*
1530          * The EVP_PKEY_ASN1_METHOD |pkey_id| retains its legacy key purpose
1531          * for any key type that has a legacy implementation, regardless of
1532          * if the internal key is a legacy or a provider side one.  When
1533          * there is no legacy implementation for the key, the type becomes
1534          * EVP_PKEY_KEYMGMT, which indicates that one should be cautious
1535          * with functions that expect legacy internal keys.
1536          */
1537         if (ameth != NULL)
1538             pkey->type = ameth->pkey_id;
1539         else
1540             pkey->type = EVP_PKEY_KEYMGMT;
1541 #endif
1542     }
1543     return 1;
1544 }
1545
1546 #ifndef FIPS_MODULE
1547 static void find_ameth(const char *name, void *data)
1548 {
1549     const char **str = data;
1550
1551     /*
1552      * The error messages from pkey_set_type() are uninteresting here,
1553      * and misleading.
1554      */
1555     ERR_set_mark();
1556
1557     if (pkey_set_type(NULL, NULL, EVP_PKEY_NONE, name, strlen(name),
1558                       NULL)) {
1559         if (str[0] == NULL)
1560             str[0] = name;
1561         else if (str[1] == NULL)
1562             str[1] = name;
1563     }
1564
1565     ERR_pop_to_mark();
1566 }
1567 #endif
1568
1569 int EVP_PKEY_set_type_by_keymgmt(EVP_PKEY *pkey, EVP_KEYMGMT *keymgmt)
1570 {
1571 #ifndef FIPS_MODULE
1572 # define EVP_PKEY_TYPE_STR str[0]
1573 # define EVP_PKEY_TYPE_STRLEN (str[0] == NULL ? -1 : (int)strlen(str[0]))
1574     /*
1575      * Find at most two strings that have an associated EVP_PKEY_ASN1_METHOD
1576      * Ideally, only one should be found.  If two (or more) are found, the
1577      * match is ambiguous.  This should never happen, but...
1578      */
1579     const char *str[2] = { NULL, NULL };
1580
1581     EVP_KEYMGMT_names_do_all(keymgmt, find_ameth, &str);
1582     if (str[1] != NULL) {
1583         ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
1584         return 0;
1585     }
1586 #else
1587 # define EVP_PKEY_TYPE_STR NULL
1588 # define EVP_PKEY_TYPE_STRLEN -1
1589 #endif
1590     return pkey_set_type(pkey, NULL, EVP_PKEY_NONE,
1591                          EVP_PKEY_TYPE_STR, EVP_PKEY_TYPE_STRLEN,
1592                          keymgmt);
1593
1594 #undef EVP_PKEY_TYPE_STR
1595 #undef EVP_PKEY_TYPE_STRLEN
1596 }
1597
1598 int EVP_PKEY_up_ref(EVP_PKEY *pkey)
1599 {
1600     int i;
1601
1602     if (CRYPTO_UP_REF(&pkey->references, &i, pkey->lock) <= 0)
1603         return 0;
1604
1605     REF_PRINT_COUNT("EVP_PKEY", pkey);
1606     REF_ASSERT_ISNT(i < 2);
1607     return ((i > 1) ? 1 : 0);
1608 }
1609
1610 #ifndef FIPS_MODULE
1611 void evp_pkey_free_legacy(EVP_PKEY *x)
1612 {
1613     if (x->ameth != NULL) {
1614         if (x->ameth->pkey_free != NULL)
1615             x->ameth->pkey_free(x);
1616         x->pkey.ptr = NULL;
1617     }
1618 # ifndef OPENSSL_NO_ENGINE
1619     ENGINE_finish(x->engine);
1620     x->engine = NULL;
1621     ENGINE_finish(x->pmeth_engine);
1622     x->pmeth_engine = NULL;
1623 # endif
1624 }
1625 #endif  /* FIPS_MODULE */
1626
1627 static void evp_pkey_free_it(EVP_PKEY *x)
1628 {
1629     /* internal function; x is never NULL */
1630
1631     evp_keymgmt_util_clear_operation_cache(x);
1632 #ifndef FIPS_MODULE
1633     evp_pkey_free_legacy(x);
1634 #endif
1635
1636     if (x->keymgmt != NULL) {
1637         evp_keymgmt_freedata(x->keymgmt, x->keydata);
1638         EVP_KEYMGMT_free(x->keymgmt);
1639         x->keymgmt = NULL;
1640         x->keydata = NULL;
1641     }
1642     x->type = EVP_PKEY_NONE;
1643 }
1644
1645 void EVP_PKEY_free(EVP_PKEY *x)
1646 {
1647     int i;
1648
1649     if (x == NULL)
1650         return;
1651
1652     CRYPTO_DOWN_REF(&x->references, &i, x->lock);
1653     REF_PRINT_COUNT("EVP_PKEY", x);
1654     if (i > 0)
1655         return;
1656     REF_ASSERT_ISNT(i < 0);
1657     evp_pkey_free_it(x);
1658 #ifndef FIPS_MODULE
1659     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, x, &x->ex_data);
1660 #endif
1661     CRYPTO_THREAD_lock_free(x->lock);
1662 #ifndef FIPS_MODULE
1663     sk_X509_ATTRIBUTE_pop_free(x->attributes, X509_ATTRIBUTE_free);
1664 #endif
1665     OPENSSL_free(x);
1666 }
1667
1668 int EVP_PKEY_size(const EVP_PKEY *pkey)
1669 {
1670     int size = 0;
1671
1672     if (pkey != NULL) {
1673         size = pkey->cache.size;
1674 #ifndef FIPS_MODULE
1675         if (pkey->ameth != NULL && pkey->ameth->pkey_size != NULL)
1676             size = pkey->ameth->pkey_size(pkey);
1677 #endif
1678     }
1679     return size;
1680 }
1681
1682 void *evp_pkey_export_to_provider(EVP_PKEY *pk, OPENSSL_CTX *libctx,
1683                                   EVP_KEYMGMT **keymgmt,
1684                                   const char *propquery)
1685 {
1686     EVP_KEYMGMT *allocated_keymgmt = NULL;
1687     EVP_KEYMGMT *tmp_keymgmt = NULL;
1688     void *keydata = NULL;
1689     int check;
1690
1691     if (pk == NULL)
1692         return NULL;
1693
1694     /* No key data => nothing to export */
1695     check = 1;
1696 #ifndef FIPS_MODULE
1697     check = check && pk->pkey.ptr == NULL;
1698 #endif
1699     check = check && pk->keydata == NULL;
1700     if (check)
1701         return NULL;
1702
1703 #ifndef FIPS_MODULE
1704     if (pk->pkey.ptr != NULL) {
1705         /*
1706          * If the legacy key doesn't have an dirty counter or export function,
1707          * give up
1708          */
1709         if (pk->ameth->dirty_cnt == NULL || pk->ameth->export_to == NULL)
1710             return NULL;
1711     }
1712 #endif
1713
1714     if (keymgmt != NULL) {
1715         tmp_keymgmt = *keymgmt;
1716         *keymgmt = NULL;
1717     }
1718
1719     /*
1720      * If no keymgmt was given or found, get a default keymgmt.  We do so by
1721      * letting EVP_PKEY_CTX_new_from_pkey() do it for us, then we steal it.
1722      */
1723     if (tmp_keymgmt == NULL) {
1724         EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pk, propquery);
1725
1726         tmp_keymgmt = ctx->keymgmt;
1727         ctx->keymgmt = NULL;
1728         EVP_PKEY_CTX_free(ctx);
1729     }
1730
1731     /* If there's still no keymgmt to be had, give up */
1732     if (tmp_keymgmt == NULL)
1733         goto end;
1734
1735 #ifndef FIPS_MODULE
1736     if (pk->pkey.ptr != NULL) {
1737         size_t i = 0;
1738
1739         /*
1740          * If the legacy "origin" hasn't changed since last time, we try
1741          * to find our keymgmt in the operation cache.  If it has changed,
1742          * |i| remains zero, and we will clear the cache further down.
1743          */
1744         if (pk->ameth->dirty_cnt(pk) == pk->dirty_cnt_copy) {
1745             i = evp_keymgmt_util_find_operation_cache_index(pk, tmp_keymgmt);
1746
1747             /*
1748              * If |tmp_keymgmt| is present in the operation cache, it means
1749              * that export doesn't need to be redone.  In that case, we take
1750              * token copies of the cached pointers, to have token success
1751              * values to return.
1752              */
1753             if (i < OSSL_NELEM(pk->operation_cache)
1754                 && pk->operation_cache[i].keymgmt != NULL) {
1755                 keydata = pk->operation_cache[i].keydata;
1756                 goto end;
1757             }
1758         }
1759
1760         /*
1761          * TODO(3.0) Right now, we assume we have ample space.  We will have
1762          * to think about a cache aging scheme, though, if |i| indexes outside
1763          * the array.
1764          */
1765         if (!ossl_assert(i < OSSL_NELEM(pk->operation_cache)))
1766             goto end;
1767
1768         /* Make sure that the keymgmt key type matches the legacy NID */
1769         if (!ossl_assert(EVP_KEYMGMT_is_a(tmp_keymgmt, OBJ_nid2sn(pk->type))))
1770             goto end;
1771
1772         if ((keydata = evp_keymgmt_newdata(tmp_keymgmt)) == NULL)
1773             goto end;
1774
1775         if (!pk->ameth->export_to(pk, keydata, tmp_keymgmt, libctx, propquery)) {
1776             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1777             keydata = NULL;
1778             goto end;
1779         }
1780
1781         /*
1782          * If the dirty counter changed since last time, then clear the
1783          * operation cache.  In that case, we know that |i| is zero.  Just
1784          * in case this is a re-export, we increment then decrement the
1785          * keymgmt reference counter.
1786          */
1787         if (!EVP_KEYMGMT_up_ref(tmp_keymgmt)) { /* refcnt++ */
1788             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1789             keydata = NULL;
1790             goto end;
1791         }
1792         if (pk->ameth->dirty_cnt(pk) != pk->dirty_cnt_copy)
1793             evp_keymgmt_util_clear_operation_cache(pk);
1794         EVP_KEYMGMT_free(tmp_keymgmt); /* refcnt-- */
1795
1796         /* Add the new export to the operation cache */
1797         if (!evp_keymgmt_util_cache_keydata(pk, i, tmp_keymgmt, keydata)) {
1798             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1799             keydata = NULL;
1800             goto end;
1801         }
1802
1803         /* Synchronize the dirty count */
1804         pk->dirty_cnt_copy = pk->ameth->dirty_cnt(pk);
1805         goto end;
1806     }
1807 #endif  /* FIPS_MODULE */
1808
1809     keydata = evp_keymgmt_util_export_to_provider(pk, tmp_keymgmt);
1810
1811  end:
1812     /*
1813      * If nothing was exported, |tmp_keymgmt| might point at a freed
1814      * EVP_KEYMGMT, so we clear it to be safe.  It shouldn't be useful for
1815      * the caller either way in that case.
1816      */
1817     if (keydata == NULL)
1818         tmp_keymgmt = NULL;
1819
1820     if (keymgmt != NULL)
1821         *keymgmt = tmp_keymgmt;
1822
1823     EVP_KEYMGMT_free(allocated_keymgmt);
1824     return keydata;
1825 }
1826
1827 #ifndef FIPS_MODULE
1828 int evp_pkey_copy_downgraded(EVP_PKEY **dest, const EVP_PKEY *src)
1829 {
1830     if (!ossl_assert(dest != NULL))
1831         return 0;
1832
1833     if (evp_pkey_is_assigned(src) && evp_pkey_is_provided(src)) {
1834         EVP_KEYMGMT *keymgmt = src->keymgmt;
1835         void *keydata = src->keydata;
1836         int type = src->type;
1837         const char *keytype = NULL;
1838
1839         keytype = evp_first_name(EVP_KEYMGMT_provider(keymgmt),
1840                                  keymgmt->name_id);
1841
1842         /*
1843          * If the type is EVP_PKEY_NONE, then we have a problem somewhere
1844          * else in our code.  If it's not one of the well known EVP_PKEY_xxx
1845          * values, it should at least be EVP_PKEY_KEYMGMT at this point.
1846          * TODO(3.0) remove this check when we're confident that the rest
1847          * of the code treats this correctly.
1848          */
1849         if (!ossl_assert(type != EVP_PKEY_NONE)) {
1850             ERR_raise_data(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR,
1851                            "keymgmt key type = %s but legacy type = EVP_PKEY_NONE",
1852                            keytype);
1853             return 0;
1854         }
1855
1856         /* Prefer the legacy key type name for error reporting */
1857         if (type != EVP_PKEY_KEYMGMT)
1858             keytype = OBJ_nid2sn(type);
1859
1860         /* Make sure we have a clean slate to copy into */
1861         if (*dest == NULL)
1862             *dest = EVP_PKEY_new();
1863         else
1864             evp_pkey_free_it(*dest);
1865
1866         if (EVP_PKEY_set_type(*dest, type)) {
1867             /* If the key is typed but empty, we're done */
1868             if (keydata == NULL)
1869                 return 1;
1870
1871             if ((*dest)->ameth->import_from == NULL) {
1872                 ERR_raise_data(ERR_LIB_EVP, EVP_R_NO_IMPORT_FUNCTION,
1873                                "key type = %s", keytype);
1874             } else {
1875                 /*
1876                  * We perform the export in the same libctx as the keymgmt
1877                  * that we are using.
1878                  */
1879                 OPENSSL_CTX *libctx =
1880                     ossl_provider_library_context(keymgmt->prov);
1881                 EVP_PKEY_CTX *pctx =
1882                     EVP_PKEY_CTX_new_from_pkey(libctx, *dest, NULL);
1883
1884                 if (pctx == NULL)
1885                     ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1886
1887                 if (pctx != NULL
1888                     && evp_keymgmt_export(keymgmt, keydata,
1889                                           OSSL_KEYMGMT_SELECT_ALL,
1890                                           (*dest)->ameth->import_from,
1891                                           pctx)) {
1892                     /* Synchronize the dirty count */
1893                     (*dest)->dirty_cnt_copy = (*dest)->ameth->dirty_cnt(*dest);
1894
1895                     EVP_PKEY_CTX_free(pctx);
1896                     return 1;
1897                 }
1898                 EVP_PKEY_CTX_free(pctx);
1899             }
1900
1901             ERR_raise_data(ERR_LIB_EVP, EVP_R_KEYMGMT_EXPORT_FAILURE,
1902                            "key type = %s", keytype);
1903         }
1904     }
1905
1906     return 0;
1907 }
1908
1909 int evp_pkey_downgrade(EVP_PKEY *pk)
1910 {
1911     EVP_PKEY tmp_copy;           /* Stack allocated! */
1912
1913     /* If this isn't an assigned provider side key, we're done */
1914     if (!evp_pkey_is_assigned(pk) || !evp_pkey_is_provided(pk))
1915         return 1;
1916
1917     /*
1918      * To be able to downgrade, we steal the contents of |pk|, then reset
1919      * it, and finally try to make it a downgraded copy.  If any of that
1920      * fails, we restore the copied contents into |pk|.
1921      */
1922     tmp_copy = *pk;
1923
1924     if (evp_pkey_reset_unlocked(pk)
1925         && evp_pkey_copy_downgraded(&pk, &tmp_copy)) {
1926         /* Restore the common attributes, then empty |tmp_copy| */
1927         pk->references = tmp_copy.references;
1928         pk->lock = tmp_copy.lock;
1929         pk->attributes = tmp_copy.attributes;
1930         pk->save_parameters = tmp_copy.save_parameters;
1931         pk->ex_data = tmp_copy.ex_data;
1932
1933         /* Ensure that stuff we've copied won't be freed */
1934         tmp_copy.lock = NULL;
1935         tmp_copy.attributes = NULL;
1936         memset(&tmp_copy.ex_data, 0, sizeof(tmp_copy.ex_data));
1937
1938         /*
1939          * Save the provider side data in the operation cache, so they'll
1940          * find it again.  |pk| is new, so it's safe to assume slot zero
1941          * is free.
1942          * Note that evp_keymgmt_util_cache_keydata() increments keymgmt's
1943          * reference count, so we need to decrement it, or there will be a
1944          * leak.
1945          */
1946         evp_keymgmt_util_cache_keydata(pk, 0, tmp_copy.keymgmt,
1947                                        tmp_copy.keydata);
1948         EVP_KEYMGMT_free(tmp_copy.keymgmt);
1949
1950         /*
1951          * Clear keymgmt and keydata from |tmp_copy|, or they'll get
1952          * inadvertently freed.
1953          */
1954         tmp_copy.keymgmt = NULL;
1955         tmp_copy.keydata = NULL;
1956
1957         evp_pkey_free_it(&tmp_copy);
1958
1959         return 1;
1960     }
1961
1962     *pk = tmp_copy;
1963     return 0;
1964 }
1965 #endif  /* FIPS_MODULE */
1966
1967 const OSSL_PARAM *EVP_PKEY_gettable_params(EVP_PKEY *pkey)
1968 {
1969     if (pkey == NULL
1970         || pkey->keymgmt == NULL
1971         || pkey->keydata == NULL)
1972         return 0;
1973     return EVP_KEYMGMT_gettable_params(pkey->keymgmt);
1974 }
1975
1976 int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
1977 {
1978     int ret = 0;
1979     OSSL_PARAM params[2];
1980     unsigned char buffer[2048];
1981     unsigned char *buf = NULL;
1982     size_t buf_sz = 0;
1983
1984     if (pkey == NULL
1985         || pkey->keymgmt == NULL
1986         || pkey->keydata == NULL
1987         || key_name == NULL
1988         || bn == NULL)
1989         return 0;
1990
1991     memset(buffer, 0, sizeof(buffer));
1992     params[0] = OSSL_PARAM_construct_BN(key_name, buffer, sizeof(buffer));
1993     params[1] = OSSL_PARAM_construct_end();
1994     if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)) {
1995         if (!OSSL_PARAM_modified(params) || params[0].return_size == 0)
1996             return 0;
1997         buf_sz = params[0].return_size;
1998         /*
1999          * If it failed because the buffer was too small then allocate the
2000          * required buffer size and retry.
2001          */
2002         buf = OPENSSL_zalloc(buf_sz);
2003         if (buf == NULL)
2004             return 0;
2005         params[0].data = buf;
2006         params[0].data_size = buf_sz;
2007
2008         if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
2009             goto err;
2010     }
2011     /* Fail if the param was not found */
2012     if (!OSSL_PARAM_modified(params))
2013         goto err;
2014     ret = OSSL_PARAM_get_BN(params, bn);
2015 err:
2016     OPENSSL_free(buf);
2017     return ret;
2018 }
2019
2020 int EVP_PKEY_get_octet_string_param(EVP_PKEY *pkey, const char *key_name,
2021                                     unsigned char *buf, size_t max_buf_sz,
2022                                     size_t *out_sz)
2023 {
2024     OSSL_PARAM params[2];
2025
2026     if (pkey == NULL
2027         || pkey->keymgmt == NULL
2028         || pkey->keydata == NULL
2029         || key_name == NULL)
2030         return 0;
2031
2032     params[0] = OSSL_PARAM_construct_octet_string(key_name, buf, max_buf_sz);
2033     params[1] = OSSL_PARAM_construct_end();
2034     if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
2035         || !OSSL_PARAM_modified(params))
2036         return 0;
2037     if (out_sz != NULL)
2038         *out_sz = params[0].return_size;
2039     return 1;
2040 }
2041
2042 int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
2043                                     char *str, size_t max_buf_sz,
2044                                     size_t *out_sz)
2045 {
2046     OSSL_PARAM params[2];
2047
2048     if (pkey == NULL
2049         || pkey->keymgmt == NULL
2050         || pkey->keydata == NULL
2051         || key_name == NULL)
2052         return 0;
2053
2054     params[0] = OSSL_PARAM_construct_utf8_string(key_name, str, max_buf_sz);
2055     params[1] = OSSL_PARAM_construct_end();
2056     if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
2057         || !OSSL_PARAM_modified(params))
2058         return 0;
2059     if (out_sz != NULL)
2060         *out_sz = params[0].return_size;
2061     return 1;
2062 }
2063
2064 int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
2065 {
2066     OSSL_PARAM params[2];
2067
2068     if (pkey == NULL
2069         || pkey->keymgmt == NULL
2070         || pkey->keydata == NULL
2071         || key_name == NULL)
2072         return 0;
2073
2074     params[0] = OSSL_PARAM_construct_int(key_name, out);
2075     params[1] = OSSL_PARAM_construct_end();
2076     if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
2077         || !OSSL_PARAM_modified(params))
2078         return 0;
2079     return 1;
2080 }
2081
2082 int EVP_PKEY_get_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t *out)
2083 {
2084     OSSL_PARAM params[2];
2085
2086     if (pkey == NULL
2087         || pkey->keymgmt == NULL
2088         || pkey->keydata == NULL
2089         || key_name == NULL)
2090         return 0;
2091
2092     params[0] = OSSL_PARAM_construct_size_t(key_name, out);
2093     params[1] = OSSL_PARAM_construct_end();
2094     if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
2095         || !OSSL_PARAM_modified(params))
2096         return 0;
2097     return 1;
2098 }