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